一:@PropertySource
Spring boot框架提供了@PropertySource注解,目的是加载指定的属性文件,接下来我们看一下如何使用该注解。
首先在默认的application.properties文件中添加如下内容
spring.datasource.url=jdbc:mysql://192.168.10.171:3306/Steam?useUnicode=true&characterEncoding=utf8
spring.datasource.name=root
在创建一个dataSource.properties配置文件
内容如下:
spring.datasource.url=jdbc:sqlserver://192.168.xxx.xxx;instanceName=sql_03;DatabaseName=edu;integratedSecurity=false
spring.datasource.name=admin
我们定义一个实体类:DataSourceConfig,添加属性url,name,并给属性添加get(),set()方法。
package cn.wq.testproject.Model;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;
@Component
@PropertySource(value= {"classpath:dataSource.properties"},ignoreResourceNotFound=false,encoding="UTF-8",name="dataSource.properties")
@ConfigurationProperties(prefix = "spring.datasource")
public class DataSourceConfig {
private String url;
private String name;
public String getUrl() {
return url;
}
public String getName() {
return name;
}
public void setUrl(String url) {
this.url = url;
}
public void setName(String name) {
this.name = name;
}
}
上述的代码目的是加载classpath路径中dataSource.properties配置文件。
value值是设置需要加载的属性文件,可以一次性加载多个。
其中:
encoding:用于指定读取属性文件所使用的编码,我们通常使用的是UTF-8;
ignoreResourceNotFound:含义是当指定的配置文件不存在是否报错,默认是false;比如上文中指定的加载属性文件是dataSource.properties,如果该文件不存在,则ignoreResourceNotFound为true的时候,程序不会报错,
如果ignoreResourceNotFound为false的时候,程序直接报错。实际项目开发中,最好设置ignoreResourceNotFound为false。该参数默认值为false。
name的值我们设置的是dataSource.properties。这个值在Springboot的环境中必须是唯一的,如果不设置,则值为:“class path resource [dataSource.properties]“。
可能很多人比较纳闷,为什么是“class path resource [dataSource.properties]“呢?这个就涉及到了Spring中对资源文件的封装类Resource。我们配置的value值为"classpath:dataSource.properties",因此Spring发现是classpath开头的,因此最终使用的是Resource的子类ClassPathResource。如果是file开头的,则最终使用的类是FileSystemResource。
了解了上文所述的Resource类之后。我们再次明确一点,如果@PropertySource中如果没有设置name值,则name值的生成规则是:根据value值查找到最终封装的Resource子类,然后调用具体的Resource子类实例对象中的getDescription方法,getDescription方法的返回值为最终的name值。
说实话,name我还没有研究透,上面对于name的解释也是网上找的,大家随意看看,后面有空我再翻翻资料
运行测试类
package cn.wq.testproject;
import cn.wq.testproject.Model.*;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest
public class TestprojectApplicationTests {
@Autowired
DataSourceConfig dataSourceConfig;
@Test
public void contextLoads() {
System.out.println("url============"+dataSourceConfig.getUrl());
System.out.println("name==========="+dataSourceConfig.getName());
}
}
控制台输出,可以看出,他读取的是默认配置文件application.properties里的内容。
明明我们已经使用@PropertySource注解加载指定的dataSource.properties属性文件,那为何没有读取dataSource.properties文件里的内容呢,这是因为在实体类DataSourceConfig实体在上使用注解@ConfigurationProperties时,前缀prefix="spring.datasource",而默认application.properties配置文件里也有前缀spring.datasource,所以优先从默认的application.properties配置文件里读取,所以我们把dataSource.properties,DataSourceConfig实体类里的内容稍微更改一下:
这时再运行测试类,输出如下图,可以看出读取到了指定的dataSource.properties文件的内容
二:ImportResource
导入spring的配置文件,让配置文件里面的内容生效。
SpringBoot里面没有spring的配置文件,我们自己编写的配置文件也不能自动识别,想让spring的配置文件生效,加载进来,需要@ImportResource标注在一个配置类上。
(1):创建实体类,get(),set(),toString()
package cn.wq.testproject.Model;
public class User {
String name;
int age;
public String getName() {
return name;
}
public int getAge() {
return age;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
(2):创建User.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="cn_wq_user" class="cn.wq.testproject.Model.User"></bean>
</beans>
(3):在main方法的类上面加上注解@ImporResource,并加上xml的位置及名字。
(4):测试类中注入ApplicationContext,并使用ApplicationContext读取实体类中的内容
(5):控制台输出,因为我们并没有给User实体类中的属性赋值,所以输出的都是默认值 ,但可以看出,确实使用@ImportResource识别出了xml。