SpringBoot的配置
SpringBoot使用Java配置应用
为什么需要它:
之前配置Bean在xml中,现在没有任何的xml,如果需要配置一个Bean,就需要属性注入
1. 需要的注解:
@Configuration
=> 代替xml文件@Bean
=> 将返回值注入容器@Value
=> 属性注入@propertySource
=> 指定外部属性文件
2. 操作步骤:
- 闲杂工作(例如配置数据时创建数据库,导入数据库的坐标)
- 创建配置文件xxx.properties
- 创建配置类
- 在需要的地方注入使用
3. 代码实现:
假设配置数据库。
- 创建配置文件jdbc.properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.driverClassName=jdbc:mysql://localhost:8080/test
jdbc.username=root
jdbc.password=root
- 创建配置类
@Configuration // 表明是一个配置类
@PropertySource("classpath:jdbc.properties") // 加载文件
public class JdbcConfig {
@Value("${jdbc.url}")
String url;
@Value("${jdbc.driverClassName}")
String driverClassName;
@Value("${jdbc.username}")
String username;
@Value("${jdbc.password}")
String password;
@Bean // 返回注入
public DataSource dataSource(){
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName(driverClassName);
dataSource.setUrl(url);
dataSource.setUsername(username);
dataSource.setPassword(password);
return dataSource;
}
}
- 注入使用Autowired即可
SpringBoot的属性注入
1. 问题:
当需要注入的属性里面有一个对象怎么办。
上面的java配置方式就无法满足条件,此时需要SpringBoot的配置
1. 限制:
使用SpringBoot的属性注入,属性文件的名称必须是application.properties或者application.yml
2. 使用步骤:
- 配置好application.properties/application.yml
- 被引用的类上添加
@ConfigurationProperties
注解(就是问题中的那个属性为对象的情况) - 在要注入属性的类上添加
@EnableConfigurationProperties
注解和@Configuration
注解 - 注入使用
3. 代码实现:
-
添加配置文件属性:
- 如果是properties文件:和上面一样
- 如果是yml,使用下面的写法
# 需要遵守的规则,jdbc可以理解成一个对象,下面都是它的属性。 # 对象和属性要保证两个空格的间距。 key和value中间有一个空格 jdbc: driver: com.mysql.jdbc.Driver driverClassName: jdbc:mysql://localhost:8080/test username: root password: root
-
被引用类添加注解,注入属性
@ConfigurationProperties(prefix = "jdbc") //这个前缀就是properties的点之前的字符串,yml的那个对象
public class JdbcProperties {
private String url;
private String driverClassName;
private String username;
private String password;
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getDriverClassName() {
return driverClassName;
}
public void setDriverClassName(String driverClassName) {
this.driverClassName = driverClassName;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
- 在要注入属性的类上添加
@EnableConfigurationProperties
注解和@Configuration
注解
@Configuration // 标注自己是配置类
@EnableConfigurationProperties(JdbcProperties.class) // 声明要使用jdbcProperties这个类的对象
public class JdbcConfig {
@Bean
public DataSource dataSource(JdbcProperties jdbc) { // 在这里直接使用即可
DruidDataSource dataSource = new DruidDataSource();
dataSource.setUrl(jdbc.getUrl());
dataSource.setDriverClassName(jdbc.getDriverClassName());
dataSource.setUsername(jdbc.getUsername());
dataSource.setPassword(jdbc.getPassword());
return dataSource;
}
}
4. 此注入方式支持松散绑定
松散绑定:
不严格要求属性文件中的属性名与成员变量名一致。支持驼峰,中划线,下划线等等转换,甚至支持对象
引导。比如:user.friend.name:代表的是user对象中的friend属性中的name属性,显然friend也是对
象。@value注解就难以完成这样的注入方式。
5. 优化
第二步和第三步较为麻烦。没有必要通过一个类先注入了属性,再把这个类注入给另一个类的对象。
可以直接将属性注入给类的对象属性。
@Configuration
public class JdbcConfig {
@Bean
// 声明要注入的属性前缀,Spring Boot会自动把相关属性通过set方法注入到DataSource中
@ConfigurationProperties(prefix = "jdbc") // 仍然会去找前缀问jdbc的属性,然后注入给DataSource,只要定义的名字满足松散绑定即可。
public DataSource dataSource() {
return new DruidDataSource();
}
}
PS:前提条件是该类有setter方法。
多个yml文件的配置
1. 多个配置文件的条件:
- 文件名称必须是application-xxx.yml
- 必须要在application-xxx.yml中激活配置
- 如果properties和yml同时存在,两类文件都有效
- 两个文件发生冲突配置,以properties为主
2. 激活方式
spring:
profiles:
active: xxx1, xxx2
# 这个xxx1,xxx2是-后面的名字
# 比如application-jdbc.yml xxx就是jdbc
自动装配原理
没学明白,看源码一脸懵逼
META-INF\spring.fatories
文件定义了很多自动配置类,可以根据启动器自动配置组件
想要修改自动配置的组件的默认参数
- 找spring-boot-autoConfigure-xxx.RELEASE.jar
- 找到框架所在的包
- 可以看到xxxProperties,在里面寻找配置项
- 去application配置文件修改