1.@value+@Configuration对配置的全局处理
1.1 正确写法
1.2 错误写法
2.ConfigurationProperties注解对配置进行拆分处理
3.Environment读取yaml配置文件
pom相关依赖
源码解读为什么@value不能注入static
前言
初衷:
1.最近在搭建springboot项目的时候,使用static修饰属性遇到读取配置文件失败。
2.总结一下对项目配置文件整体或者拆分处理
注意:@PropertySource方式只对properties文件可以进行加载,但对于yml或者yaml不能支持。
首先看一下yaml部分配置:
spring:
# 数据库配置
datasource:
druid:
driver-class-name: oracle.jdbc.OracleDriver
url: jdbc:oracle:thin:@xxx.x.x.x:1521/orcl
username: scott
password: 12345
正文
1.@value+@Configuration对配置的全局处理
1.1 正确写法
1.新建全局配置类Confignature,用于配置整个yaml的配置信息。(正确写法)
由下面可以看到,有2种写法
(1)直接在属性上面@value注解(代码简洁,但是每次使用需要先new一个Confignature对象,或者@Autowired先注入):driver-class-name
(2)属性上面加static关键字修饰,@value写在对应set方法上面(不需要new,可以其他类直接调用):url,username,password
@Configuration
public class Confignature {
@Value(value = "${spring.datasource.druid.driver-class-name}")
public String DATASOURCE_DRUID_DRIVER_CLASS_NAME; //oracle驱动
public static String DATASOURCE_DRUID_URL; //oracle url
public static String DATASOURCE_DRUID_USERNAME; // oracle 用户名
public static String DATASOURCE_DRUID_PASSWORD; // oracle 密码
@Value("${spring.datasource.druid.url}")
public void setDatasourceDruidUrl(String datasourceDruidUrl) {
DATASOURCE_DRUID_URL = datasourceDruidUrl;
}
@Value("${spring.datasource.druid.username}")
public void setDatasourceDruidUsername(String datasourceDruidUsername) {
DATASOURCE_DRUID_USERNAME = datasourceDruidUsername;
}
@Value("${spring.datasource.druid.password}")
public void setDatasourceDruidPassword(String datasourceDruidPassword) {
DATASOURCE_DRUID_PASSWORD = datasourceDruidPassword;
}
}
2.写一个controller测试一下
@Autowired
private Confignature confignature;
@GetMapping("/testSpringBoot")
@ResponseBody
public void testSpringBoot() {
// driver属性需要先注入confignature配置类
System.out.println(confignature.DATASOURCE_DRUID_DRIVER_CLASS_NAME);
// url,usernam,password属性可以直接调用
System.out.println(Confignature.DATASOURCE_DRUID_URL);
System.out.println(Confignature.DATASOURCE_DRUID_USERNAME);
System.out.println(Confignature.DATASOURCE_DRUID_PASSWORD);
}
1.2 错误写法
错误写法:
(1)@value注解和static同时在属性上面
(2)static修饰属性,但是set方法用了static修饰
@Configuration
public class Confignature {
// 第一种错误写法
@Value(value = "${spring.datasource.druid.driver-class-name}")
public static String DATASOURCE_DRUID_DRIVER_CLASS_NAME; //oracle驱动
// 第二种错误写法
public static String DATASOURCE_DRUID_URL; //oracle url
// 正确写法
public static String DATASOURCE_DRUID_USERNAME; // oracle 用户名
// 正确写法
public static String DATASOURCE_DRUID_PASSWORD; // oracle 密码
@Value("${spring.datasource.druid.url}")
public static void setDatasourceDruidUrl(String datasourceDruidUrl) {
DATASOURCE_DRUID_URL = datasourceDruidUrl;
}
@Value("${spring.datasource.druid.username}")
public void setDatasourceDruidUsername(String datasourceDruidUsername) {
DATASOURCE_DRUID_USERNAME = datasourceDruidUsername;
}
@Value("${spring.datasource.druid.password}")
public void setDatasourceDruidPassword(String datasourceDruidPassword) {
DATASOURCE_DRUID_PASSWORD = datasourceDruidPassword;
}
}
2.ConfigurationProperties注解对配置进行拆分处理
1.新建一个配置类DatasourceConfig,注意属性名称要跟yaml配置文件一致。这里罗列正确和错误写法(不能用static修饰属性)
正确:driverClassName,url,username
错误:password
这种写法优势:当yaml配置文件配置信息过多,可以多写几个DatasourceConfig针对不同的配置,这样结构更为清晰
@Getter
@Setter
@Component
@ConfigurationProperties(prefix = "spring.datasource.druid")
public class DatasourceConfig {
private String driverClassName;
private String url ;
private String username;
// 错误写法
private static String password;
}
2.新写一个controller,这种方式就必须要@Autowired注入DatasourceConfig 配置类
@Autowired
private DatasourceConfig datasourceConfig;
@GetMapping("/testSpringBoot1")
@ResponseBody
public void testSpringBoot1() {
System.out.println(datasourceConfig.getDriverClassName());
System.out.println(datasourceConfig.getUrl());
System.out.println(datasourceConfig.getUsername());
}
测试一下:
由图可知,取得了3个值,password未能获取,原因在于属性用了static修饰
3.Environment读取yaml配置文件
1.新写一个controller,注入Environment 类
@Autowired
private Environment env;
@GetMapping("/testSpringBoot2")
@ResponseBody
public void testSpringBoot2() {
System.out.println(env.getProperty("spring.datasource.druid.driver-class-name"));
System.out.println(env.getProperty("spring.datasource.druid.url"));
System.out.println(env.getProperty("spring.datasource.druid.username"));
System.out.println(env.getProperty("spring.datasource.druid.password"));
}
pom相关依赖
<!--配置类相关-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<!--druid相关-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.20</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.7.RELEASE</version>
</dependency>
<!--oracle相关-->
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc6</artifactId>
<version>11.2.0.3</version>
</dependency>
<!--lomback-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.0</version>
<scope>provided</scope>
</dependency>