文章目录
- 1.外部化的配置
- 1.1 配置文件基础
- 1.1.1 配置文件格式
- 1.1.2 application文件
- 1.1.3 application.properties
- 1.1.4 application.yml
- 1.1.5 environment
- 1.1.6 组织多文件
- 1.1.7多环境配置
- 1.2 绑定Bean
- 1.2.1 简单的属性绑定
- 1.2.2 嵌套Bean
- 1.2.3 扫描注解
- 1.2.4 处理第三方库对象
- 1.2.5 集合 Map,List 以及 Array
- 1.2.6 指定数据源文件
- 2.创建对象的三种方式
1.外部化的配置
项目中经常使用 properties 与 yaml 文件,其次是命令行参。
1.1 配置文件基础
1.1.1 配置文件格式
properties
语法:key=value。key 是唯一的,文件扩展名为 properties
yaml
语法:key:[空格] 值
1.1.2 application文件
Spring Boot 同时支持 properties 和 yml 格式的配置文件。 配置文件名称默认是 application。我们可以使用application.properties , application.yml
1.1.3 application.properties
在application.properties中写入我们自己的配置文件
【application.properties】
【SomeService.java】
package com.sdnu.config.pk1;import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;import java.util.StringJoiner;@Service
public class SomeService {// 使用@Value("${key: 默认值}")@Value("${app.name}")private String name;@Value("${app.owner}")private String owner;@Value("${app.port:8008}")private Integer port;public void printValue(){StringJoiner joiner = new StringJoiner(";");String s = joiner.add(name).add(owner).add(String.valueOf(port)).toString();System.out.println("result=" + s);}
}
【测试类】
package com.sdnu.config;import com.sdnu.config.pk1.SomeService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;@SpringBootTest
class Lession07ConfigApplicationTests {@Autowiredprivate SomeService someService;@Testvoid test01(){someService.printValue();}@Testvoid contextLoads() {}
}
测试结果:
1.1.4 application.yml
使用yml
# 编写配置文件 key: 值app:name: Lession07owner: rootport: 8002
还是原来的测试程序:
1.1.5 environment
Environment 是外部化的抽象,是多种数据来源的集合。从中可以读取 application 配置文件,环境变量,系统属性。使用方式在 Bean 中注入 Environment。调用它的 getProperty(key)方法。
package com.sdnu.config.pk2;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Service;@Service
public class ReadConfig {@Autowiredpublic Environment environment;public void printValue(){//通过key获取某个valueString name = environment.getProperty("app.name");System.out.println(name);// 还可以判断某个key是否存在if(environment.containsProperty("app.owner")){System.out.println("app.owner存在");System.out.println(environment.getProperty("app.owner"));}if(environment.containsProperty("app.port")){System.out.println("app.port存在");System.out.println(environment.getProperty("app.port", Integer.class, 8999));}}
}
1.1.6 组织多文件
【MultiConfigService.java】
package com.sdnu.config.pk3;import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;@Service
public class MultiConfigService {@Value("${spring.redis.host}")private String redisHostName;@Value("${spring.datasource.url}")private String jdbcUrl;public void printValue(){System.out.println("host:" + redisHostName);System.out.println("url:" + jdbcUrl);}
}
测试结果:
1.1.7多环境配置
【application-dev.yml】
myapp:memo: 这是开发环境配置文件dev# 指定环境名称
spring:config:activate:on-profile: dev
【application-test.yml】
myapp:memo: 这是开发环境配置文件test# 指定环境名称
spring:config:activate:on-profile: test
在Application.yml中激活test
【Application.yml】
# 编写配置文件 key: 值app:name: Lession07owner: rootport: 8002# 导入其它配置文件,多个文件之间使用逗号隔开
spring:config:import: conf/db.yml, conf/redis.yml# 激活某个配置文件,(环境)profiles:active: test
【MultiEnvService.java】
package com.sdnu.config.pk4;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;@Service
public class MultiEnvService {@Value("${myapp.memo}")private String memo;public void printMemo(){System.out.println("memo:::" + memo);}
}
【测试】
@Autowiredprivate MultiEnvService multiEnvService;@Testvoid test04(){multiEnvService.printMemo();}
1.2 绑定Bean
1.2.1 简单的属性绑定
【AppBean.java】
package com.sdnu.config.pk5;import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;/*** @ConfigurationProperties 表示使用Bean对象读取配置项* prefix 表示配置文件中的多个key的公共开始部分*/
@Component
@ConfigurationProperties(prefix = "app")
public class AppBean {// key的名称和属性名相同,调用属性setXXXX方法给属性赋值private String name;private String owner;private String port;public String getName() {return name;}public void setName(String name) {this.name = name;}public String getOwner() {return owner;}public void setOwner(String owner) {this.owner = owner;}public String getPort() {return port;}public void setPort(String port) {this.port = port;}@Overridepublic String toString() {return "AppBean{" +"name='" + name + '\'' +", owner='" + owner + '\'' +", port='" + port + '\'' +'}';}
}
【application.yml】
# 编写配置文件 key: 值app:name: Lession07owner: rootport: 8002# 导入其它配置文件,多个文件之间使用逗号隔开
spring:config:import: conf/db.yml, conf/redis.yml# 激活某个配置文件,(环境)profiles:active: test
【测试】
@Autowiredprivate AppBean appBean;@Testvoid test05(){System.out.println(appBean.toString());}
补充:
默认返回代理Bean对象。
设置@Configuration(proxyBeanMethods = false)后返回普通Bean对象。
1.2.2 嵌套Bean
【application.yml】
【NestAppBean.java】
【Security.java】
1.2.3 扫描注解
@ConfigurationProperties 注解起作用,还需要@EnableConfigurationProperties 或@ConfigurationPropertiesScan。这
个注解是专门寻找@ConfigurationProperties 注解的,将他的对象注入到 。
【SpringBoot配置类】
package com.sdnu.config;import com.sdnu.config.pk6.NestAppBean;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.properties.ConfigurationPropertiesScan;
import org.springframework.boot.context.properties.EnableConfigurationProperties;//启动ConfigurationProperties
//@EnableConfigurationProperties({NestAppBean.class})//扫描注解的包,绑定Bean注入到Spring容器
@ConfigurationPropertiesScan(basePackages = {"com.sdnu.config.pk6"})
@SpringBootApplication
public class Lession07ConfigApplication {public static void main(String[] args) {SpringApplication.run(Lession07ConfigApplication.class, args);}}
1.2.4 处理第三方库对象
【application.yml添加新的配置】
security:username: root77password: 888888
【创建配置类】
package com.sdnu.config.pk7;import com.sdnu.config.pk6.Security;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class MyApplicationConfig {//创建Bean对象,属性来自配置文件@ConfigurationProperties(prefix = "security")@Beanpublic Security createSecurity(){return new Security();}
}
【 单元测试】
@Autowiredprivate Security security;@Testvoid test07(){System.out.println("security = " + security);}
1.2.5 集合 Map,List 以及 Array
(1)创建保存数据的Bean
(2)配置数据【application.yml】
# 数组和List一样,一个"-" 表示一个成员
names:- lisi- zhangsan# List<Myserver> servers
servers:- title: 北京服务器ip: 192.168.0.0.1- title: 上海服务器ip: 192.168.0.0.2# Map<String, User> users
users:user1:name: 张三sex: 男age: 22user2:name: 李四sex: 女age: 21
(3) 启动类,增加扫描包
【测试】
@Autowiredprivate CollectionConfig collectionConfig;@Testvoid test08(){System.out.println("collectionConfig = " + collectionConfig.toString());}
1.2.6 指定数据源文件
【group-info.properties】
group.name=IT学习专栏
group.leader=root
group.members=20
【group.java】
【测试】
@Autowiredprivate Group group;@Testvoid test09(){System.out.println("group = " + group);}
2.创建对象的三种方式
传统的 XML 配置文件
Java Config 技术, @Configuration 与@Bean
创建对象的注解,@Controller ,@Service , @Repository ,@Compon
Spring Boot 不建议使用 xml 文件的方式, 自动配置已经解决了大部分 xml 中的工作了。如果需要 xml 提供 bean的声明,@ImportResource 加载 xml 注册 Bean