Spring IoC全注解开发-使用属性文件
原创
©著作权归作者所有:来自51CTO博客作者wx5cb71f4b705da的原创作品,请联系作者获取转载授权,否则将追究法律责任
-----崩了,因为yml测试多次始终失败,以后如果使用属性文件我就用properties---
当今Java开发使用属性文件已经非常普遍,所以谈谈这方面的内容。在Spring Boot中使用属性文件,可以采用默认为我们准备的application.properties或者application.yml,也可以使用自定义的配置文件。应该说读取配置文件的方法很多,只是介绍最常用的方法。
在Spring Boot中,我们先在Maven配置文件中加载依赖,这样Spring Boot将创建读取属性文件的上下文。
<!--属性文件依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
有了依赖就可以直接使用属性配置文件为你工作了,新建一个app.properties文件。例如现在为他新增代码清单所示的属性。
datasource.driverName=com.mysql.cj.jdbc.Driver
datasource.url=jdbc:mysql://172.17.0.1:3306/hc_official_website_1?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
datasource.username=root
datasource.password=123456
使用@PropertySource作为加载的属性配置文件,他会通过其机制读取到上下文中,这样就可以引用他了。对于他的引用,有两种方法,首先是Spring表达式。本节我们只是涉及读取属性不涉及运算。先创建一个新的类DataBaseProperties
(使用yml已经不行了)
/**
* 使用属性设置
*/
@Component
@PropertySource("classpath:app.properties")
public class DataBaseProperties {
@Value("${datasource.driverName}")
private String driverName=null;
@Value("${datasource.url}")
private String url = null;
private String username=null;
private String password=null;
public String getDriverName() {
return driverName;
}
public void setDriverName(String driverName) {
System.out.println(driverName);
this.driverName = driverName;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
System.out.println(url);
this.url = url;
}
public String getUsername() {
return username;
}
@Value("${datasource.username}")
public void setUsername(String username) {
System.out.println(username);
this.username = username;
}
public String getPassword() {
return password;
}
@Value("${datasource.password}")
public void setPassword(String password) {
System.out.println(password);
this.password = password;
}
}
这样我们就可以通过@Value注解,使用${…}这样的占位符读取配置在属性文件的内容。这里的@Value注解,既可以加载属性,也可以加在方法上,启动Spring Boot就可以看到下面的日志了。
12:05:30.058 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'dataBaseProperties'
12:05:30.061 [main] DEBUG org.springframework.core.env.PropertySourcesPropertyResolver - Found key 'datasource.driverName' in PropertySource 'class path resource [app.properties]' with value of type String
12:05:30.062 [main] DEBUG org.springframework.core.env.PropertySourcesPropertyResolver - Found key 'datasource.url' in PropertySource 'class path resource [app.properties]' with value of type String
12:05:30.062 [main] DEBUG org.springframework.core.env.PropertySourcesPropertyResolver - Found key 'datasource.username' in PropertySource 'class path resource [app.properties]' with value of type String
root
12:05:30.062 [main] DEBUG org.springframework.core.env.PropertySourcesPropertyResolver - Found key 'datasource.password' in PropertySource 'class path resource [app.properties]' with value of type
最后还得使用注解@ConfigurationProperties,通过他使得配置上有所减少,例如,修改如下代码
package cn.hctech2006.boot.bootall.config;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
* 使用属性设置
*/
@Component
@PropertySource(value = {"classpath:app.properties"},ignoreResourceNotFound = true)
@ConfigurationProperties("datasource")
@EnableConfigurationProperties
public class DataBaseProperties {
private String driverName=null;
private String url = null;
private String username=null;
private String password=null;
public String getDriverName() {
return driverName;
}
public void setDriverName(String driverName) {
System.out.println(driverName);
this.driverName = driverName;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
System.out.println("url:"+url);
this.url = url;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
System.out.println(username);
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
System.out.println(password);
this.password = password;
}
}
这里在注解@ConfigurationProperties中配置的字符串datasource,将与POJO的属性名称组成属性的全限定名去配置文件中寻找,这样就能将对应的属性读取到POJO中。然后使用@PropertySource去定义对应的属性文件,把他加载到Spring的上下文中。
在@PropertySource注解中,value可以配置多个配置文件。使用classpath前缀,意味着去类文件路径下找到属性文件;ignoreResourceNotFound则是忽略配置文件找不到的问题。ignoreResourceNotFound的默认值为flase,也就是找不到属性文件回报错;这里配置为true,也就是找不到也不会报错
----------------属性文件加载一直是一个挺困扰人的问题,就是@ConfigurationProperties完全不起作用,另外yml使用读取的时候,缩进也不起作用-------------
还是把过程和结果都写下来。把上面的使用Properties文件重新构建一遍。
------------------这个问题已经解决了,那就是使用@EnableConfigurationProperties注解,哈哈哈哈和