詳解Spring中的@PropertySource注解使用
@PropertySource注解是Spring用于加載配置文件,默認(rèn)支持.properties與.xml兩種配置文件。@PropertySource屬性如下:
- name:默認(rèn)為空,不指定
Spring自動(dòng)生成 - value:配置文件
- ignoreResourceNotFound:沒有找到配置文件是否忽略,默認(rèn)
false,4.0版本加入 - encoding:配置文件編碼格式,默認(rèn)
UTF-84.3版本才加入 - factory:配置文件解析工廠,默認(rèn):
PropertySourceFactory.class4.3版本才加入,如果是之前的版本就需要手動(dòng)注入配置文件解析Bean
接下來就使用@PropertySource來加載.properties與.xml配置文件。這里模擬連接MySQL數(shù)據(jù)庫。
首先添加依賴:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.1.6.RELEASE</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.26</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.20</version>
</dependency>
準(zhǔn)備屬性配置文件jdbc.properties
jdbc.driver=com.mysql.cj.jdbc.Driver jdbc.url=jdbc:mysql://127.0.0.1:3306 jdbc.userName=root jdbc.password=xiaohu
創(chuàng)建屬性實(shí)體類來加載配置文件JdbcProperties
@Data
@Repository
@PropertySource(value = "classpath:jdbc.properties")
public class JdbcProperties {
@Value("${jdbc.driver}")
private String driver;
@Value("${jdbc.url}")
private String url;
@Value("${jdbc.userName}")
private String userName;
@Value("${jdbc.password}")
private String password;
}
創(chuàng)建JDBC配置類JdbcConfig
@Component
public class JdbcConfig {
@Bean
public DataSource dataSource(JdbcProperties jdbcProperties){
System.out.println("打印獲取到的配置信息:"+jdbcProperties);
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName(jdbcProperties.getDriver());
dataSource.setUrl(jdbcProperties.getUrl());
dataSource.setUsername(jdbcProperties.getUserName());
dataSource.setPassword(jdbcProperties.getPassword());
return dataSource;
}
}
創(chuàng)建Spring配置類SpringConfiguration
@Configuration
public class SpringConfiguration {
}
創(chuàng)建測(cè)試類測(cè)試讀取配置文件
public class PropertySourceTest {
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext("config");
DataSource dataSource = context.getBean("dataSource",DataSource.class);
System.out.println(dataSource);
}
}
查看輸出結(jié)果:
打印獲取到的配置信息:JdbcProperties(driver=com.mysql.cj.jdbc.Driver, url=jdbc:mysql://127.0.0.1:3306, userName=root, password=xiaohu)
org.springframework.jdbc.datasource.DriverManagerDataSource@58695725
從結(jié)果可以看出,我們的properties中的配置已經(jīng)成功讀取到,并且DataSource也從Spring容器中獲取到。上面介紹注解的屬性時(shí),factory是4.3版本才加入的,那么如果4.3版本之前要解析配置文件又應(yīng)該怎么處理呢?,這個(gè)時(shí)候就需要手動(dòng)將解析配置文件的Bean注入到Spring容器中了,用法很簡單,在SpringConfiguration類中添加如下代碼即可:
@Bean
public PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer(){
return new PropertySourcesPlaceholderConfigurer();
}
具體測(cè)試結(jié)果,就自行測(cè)試了。上面例子介紹了properties的使用,下面我們將配置文件換成xml文件。配置如下:
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<entry key="jdbc.driver">com.mysql.cj.jdbc.Driver</entry>
<entry key="jdbc.url">jdbc:mysql://127.0.0.1:3306/test</entry>
<entry key="jdbc.userName">root</entry>
<entry key="jdbc.password">xiaohu</entry>
</properties>
然后將JdbcProperties類上的注解的配置文件換成xml文件。
@PropertySource(value = "classpath:jdbc.properties")
其他不用調(diào)整,執(zhí)行測(cè)試類,輸出的結(jié)果一樣。因?yàn)樯厦娼榻B到@PropertySource默認(rèn)支持properties與xml的配置文件。我們可以查看PropertySourceFactory的默認(rèn)實(shí)現(xiàn)DefaultPropertySourceFactory源碼
public class DefaultPropertySourceFactory implements PropertySourceFactory {
@Override
public PropertySource<?> createPropertySource(@Nullable String name, EncodedResource resource) throws IOException {
return (name != null ? new ResourcePropertySource(name, resource) : new ResourcePropertySource(resource));
}
}
然后進(jìn)入ResourcePropertySource類,源碼這里使用了一個(gè)三元運(yùn)算符,如果name為空,就使用默認(rèn)Spring默認(rèn)生成的name。
public ResourcePropertySource(String name, EncodedResource resource) throws IOException {
super(name, PropertiesLoaderUtils.loadProperties(resource));
this.resourceName = getNameForResource(resource.getResource());
}
public ResourcePropertySource(EncodedResource resource) throws IOException {
super(getNameForResource(resource.getResource()), PropertiesLoaderUtils.loadProperties(resource));
this.resourceName = null;
}
這里可以看到調(diào)用了PropertiesLoaderUtils.loadProperties方法,進(jìn)入到源碼
public static Properties loadProperties(EncodedResource resource) throws IOException {
Properties props = new Properties();
fillProperties(props, resource);
return props;
}
會(huì)調(diào)用fillProperties的方法,一直跟到調(diào)用最低的fillProperties方法。
static void fillProperties(Properties props, EncodedResource resource, PropertiesPersister persister)
throws IOException {
InputStream stream = null;
Reader reader = null;
try {
String filename = resource.getResource().getFilename();
if (filename != null && filename.endsWith(XML_FILE_EXTENSION)) {
stream = resource.getInputStream();
persister.loadFromXml(props, stream);
}
else if (resource.requiresReader()) {
reader = resource.getReader();
persister.load(props, reader);
}
else {
stream = resource.getInputStream();
persister.load(props, stream);
}
}
finally {
if (stream != null) {
stream.close();
}
if (reader != null) {
reader.close();
}
}
}
第一個(gè)if判斷文件后綴是否是xml結(jié)尾,常量XML_FILE_EXTENSION如下:
private static final String XML_FILE_EXTENSION = ".xml";
除了支持properties與xml的配置文件方式,也支持yml配置文件的方式,不過需要自定義解析工廠,下面來實(shí)現(xiàn)怎么解析yml配置文件。引入可以解析yml文件的第三方庫
<dependency>
<groupId>org.yaml</groupId>
<artifactId>snakeyaml</artifactId>
<version>1.28</version>
</dependency>
創(chuàng)建yml解析工廠YamlPropertySourceFactory實(shí)現(xiàn)PropertySourceFactory
public class YamlPropertySourceFactory implements PropertySourceFactory {
@Override
public PropertySource<?> createPropertySource(String name, EncodedResource resource) throws IOException {
YamlPropertiesFactoryBean factoryBean = new YamlPropertiesFactoryBean();
factoryBean.setResources(resource.getResource());
Properties properties = factoryBean.getObject();
return name != null ? new PropertiesPropertySource(name, properties) : new PropertiesPropertySource(resource.getResource().getFilename(), properties);
}
}
然后將JdbcProperties類的@PropertySource換成如下寫法:
@PropertySource(value = "classpath:jdbc.yml",factory = YamlPropertySourceFactory.class)
執(zhí)行測(cè)試類,輸出結(jié)果與上面結(jié)果一樣
打印獲取到的配置信息:JdbcProperties(driver=com.mysql.cj.jdbc.Driver, url=jdbc:mysql://127.0.0.1:3306, userName=root, password=xiaohu)
org.springframework.jdbc.datasource.DriverManagerDataSource@58695725
證明我們自定義的解析yml配置文件就成功了。
到此這篇關(guān)于Spring的@PropertySource注解使用的文章就介紹到這了,更多相關(guān)Spring的@PropertySource注解使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
springboot3整合SpringSecurity實(shí)現(xiàn)登錄校驗(yàn)與權(quán)限認(rèn)證
本文主要介紹了springboot3整合SpringSecurity實(shí)現(xiàn)登錄校驗(yàn)與權(quán)限認(rèn)證,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-04-04
Spring 使用Validation 驗(yàn)證框架的問題詳解
Spring Boot在內(nèi)部通過集成hibernate-validation已經(jīng)實(shí)現(xiàn)了JSR-349驗(yàn)證規(guī)范接口,在Spring Boot項(xiàng)目中只要直接使用就行了。 一般用在Controller中用于驗(yàn)證前端傳來的參數(shù)。這篇文章給大家介紹Spring Validation 驗(yàn)證框架的相關(guān)知識(shí),感興趣的朋友一起看看吧2021-07-07
IDEA啟動(dòng)tomcat項(xiàng)目報(bào)錯(cuò)53820 socket closed問題及解決
IDEA啟動(dòng)Tomcat項(xiàng)目時(shí)報(bào)錯(cuò),原因是IDEA關(guān)閉時(shí)Tomcat未正常關(guān)閉,導(dǎo)致端口被占用,解決方法是通過任務(wù)管理器關(guān)閉占用高內(nèi)存的Java進(jìn)程,通常是IDEA進(jìn)程下面的,或者使用命令行找到PID并強(qiáng)制終止進(jìn)程2024-12-12
詳解在Spring MVC中使用注解的方式校驗(yàn)RequestParams
本篇文章主要介紹了詳解在Spring MVC中使用注解的方式校驗(yàn)RequestParams ,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-03-03
Java項(xiàng)目中獲取路徑的絕對(duì)路徑問題和相對(duì)路徑問題
這篇文章主要介紹了如何Java項(xiàng)目中獲取文件地址,在 Java 項(xiàng)目中我們經(jīng)常會(huì)讀取配置文件,但是文件的路徑在獲取時(shí)我們是怎么得到的?下面我們就一起進(jìn)入文章學(xué)習(xí)該內(nèi)容吧,需要的朋友可以參考下2022-02-02
spring中的特殊注解@RequiredArgsConstructor詳解
這篇文章主要介紹了spring中的特殊注解@RequiredArgsConstructor,包括注解注入,構(gòu)造器注入及setter注入,結(jié)合示例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-04-04
Eclipse下編寫java程序突然不會(huì)自動(dòng)生成R.java文件和包的解決辦法
這篇文章主要介紹了Eclipse下編寫java程序突然不會(huì)自動(dòng)生成R.java文件和包的解決辦法 的相關(guān)資料,需要的朋友可以參考下2016-01-01

