"对于Spring框架,现实公司使用的非常广泛,但是由于业务的复杂程度不同,了解到很多小伙伴们利用Spring开发仅仅是利用了Spring的IOC,即使是AOP也很少用,但是目前的Spring是一个大家族,形成了一个很大的生态,覆盖了我们平时开发的方方面面,抛开特殊的苛刻要求之外,Spring的生态其实已经很全面了,所以在此开个系列来研究下Spring提供给我们的一些平时不太却又很实用的内容。"
说明:
我们平时使用Spring进行开发的时候经常会需要加载配置文件,而且Spring加载配置文件的方式又提供了很多种,我这次先把一些普通的加载方式说明下,然后再就一些比较特殊的情况的加载进行说明。
1、常用加载方式:
1.1、xml中进行配置文件引入
<context:property-placeholder location="classpath:config/*.properties" file-encoding="utf-8"/>
这个还有个原始的配置是配置 一个PropertyPlaceholderConfigurer
<bean id="propertyConfigurer"class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location">
<value>conf/jdbc.properties</value>
</property>
<property name="fileEncoding">
<value>UTF-8</value>
</property>
</bean>
1.2、通过注解进行导入
@PropertySource(value = "properties/config.properties")
以上是导入一个配置文件,如果需要导入多个,value是支持数组的,还有一个注解是@PropertySources,他是支持@PropertySource的数组格式。根据需要进行选用。
1.3、通过定义PropertyPlaceholderConfigurer的Bean来进行加载
@Bean
public PropertyPlaceholderConfigurer initPropertyPlaceholderConfigurer() {
PropertyPlaceholderConfigurer placeholderConfigurer = new PropertyPlaceholderConfigurer();
placeholderConfigurer.setLocation(new ClassPathResource("properties/*.properties"));
placeholderConfigurer.setFileEncoding("UTF-8");
return placeholderConfigurer;
}
以上是加载配置文件的几种方式,springboot是内部已经配好了扫描跟路径下的application.properties文件。
接下来进入我们今天的重点,如何使用已经导入配置文件中的属性。
2、使用配置文件中的属性
2.1、xml中使用--占位符
<mongo:mongo-client id="dataMongoConnection" replica-set="${mongo.data.hostport}" credentials="${mongo.data.username}:${mongo.data.password}@admin">
<!--<mongo:mongo-client id="dataMongoConnection" replica-set="${mongo.data.hostport}">-->
<mongo:client-options connections-per-host="${mongo.data.connectionsPerHost}" threads-allowed-to-block-for-connection-multiplier="${mongo.data.threadsAllowedToBlockForConnectionMultiplier}"
connect-timeout="${mongo.data.connectTimeout}"
max-wait-time="${mongo.data.maxWaitTime}"
socket-keep-alive="${mongo.data.socketKeepAlive}"
socket-timeout="${mongo.data.socketTimeout}"/>
</mongo:mongo-client>
2.2、注解的使用
@Value("${jdbc.username}")
private String username;
以上是经常使用的方式,接下来将一个不常用的方式,有时候我们在引入Spring的第三方工具包的时候,有时在采用注解配置第三方核心配置类的时候发现采用注解引入属性值的时候发现不起作用,观察这些配置类的时候会发现他们经常会实现Spring的一些顶级接口类,例如:BeanDefinitionRegistryPostProcessor。因为PropertyPlaceholderConfigurer的初始化级别是最低的,当在注册这些顶级Bean的时候,我们的属性值是还没有被赋值的,所以导致属性值都是初始化值,如何解决这种情况呢,有2种方式。
方式一:
在Spring调用加载配置文件的时候,有一个通用类可以获取到当前环境的属性文件上下文Environment,我们可以直接通过注解直接引入这个类。
@Autowired
private Environment environment;
在获取到这个类之后我们就可以自由的操作属性值了,操作如下:
environment.resolvePlaceholders("${dataSource.url}");
environment.resolvePlaceholders("${dataSource.username}");
environment.resolvePlaceholders("${dataSource.password}");
这时候就解决@Value不可用的问题,其实代码environment.resolvePlaceholders("${dataSource.url}");这个被调用后返回的是解析后的字符串值,这点也要注意下。
方式二:
这个方式比较笨拙,就是将这种顶级配置类单独放到一个配置类中进行配置,而且仅限该类没有属性需要配置的情况下。这种情况使用很特殊,大家可以忽略。
以上便是我今天要分享的实战内容,虽然知识点不多,但是也是实际开发中遇到的,希望对大家有所帮助。