平时用spring的时候,配置的值多数情况都是直接在配置文件中注入给管理的类了,比如数据库连接池,数据库,缓存等,不需要再在代码中获取值做相应的处理。今天遇到这种情况,需要在代码中判断某个值是否为空,如果不为空则解析其值并根据解析的值给HTTPclient加上代理,否则则不加。
首先是使用spring的placeholder加载所有的properties文件
然后是常见的第一种注入配置值的方法:
使用配置文件管理需要注入的实例,在初始化实例的时候,在配置文件中使用property参数注入相应的值,入
<bean id=”cacheManager” class=”cn.outofmemory.util.MemCacheManager” init-method=”init”>
<property name=”nodeList” value=”${memcache.nodelist}”/>
</bean>
这里的${memcache.nodelist}就是properties文件中key值为memcache.nodelist的配置值。
但是这样做会打乱原有的使用注解管理bean的布局,显得比较混乱,而且如果改动类还需要同时改动spring的配置文件。
第二种:
1、引入命名空间:
xmlns:util=”https://www.springframework.org/schema/util”
xsi:schemaLocation=”https://www.springframework.org/schema/util
https://www.springframework.org/schema/util/spring-util-3.0.xsd”
内容中写入
<util:properties id=”propertiesReader” location=”classpath:test.properties” />
2、在类中需要注入的属性实现 setter 和 getter 方法。
3、在 setter 方法前(或者该属性声明位置),添加 @Value 注解
@Value(“#{propertiesReader[propertiesName]}”)
propertiesName 为 properties 文件中的键。这样,在容器启动过程中, Spring 将自动注入值。
第三种:
实现一个 PropertyPlaceholderConfigurer 扩展的类,在这个类中重写protected void processProperties方法,在方法体中,将传入的
Properties props的值全都重新复制一份给当前方法的静态变量,这样就可以直接使用该静态变量获取系统加载的参数了。示例如下:
private static Map<String, String> ctxPropertiesMap;
@Override
protected void processProperties(
ConfigurableListableBeanFactory beanFactoryToProcess,
Properties props) throws BeansException {
super.processProperties(beanFactoryToProcess, props);
ctxPropertiesMap = new HashMap<String, String>();
for (Object key : props.keySet()) {
String keyStr = key.toString();
String value = props.getProperty(keyStr);
ctxPropertiesMap.put(keyStr, value);
}
}
public static String getContextProperty(String name) {
return ctxPropertiesMap.get(name);
}
第四种:
很简单,只要是使用PropertyPlaceholderConfigurer来管理加载了所有的配置文件,那么我们在某个spring管理的实例里的属性上,
在某个set方法上可以用@Value(“${db.driverclass}”)来完成注入,也可以在成员变量上注入。
例子:
例子代码如:
@Service
public class DatabaseInfo {
@Value(“${db.driverclass}”)①
private String driverClass;
//也可以在这里注入
@Value(“${db.driverclass}”)②
private void setDriverClass(String dc) {
this.driverClass = dc;
}
}
参考文献
《https://blog.csdn.net/achilles12345/article/details/38614387》
《https://jackyrong.iteye.com/blog/1330946》