spring 注入static属性
You have two possibilities:
- non-static setter for static property/field;
- using
org.springframework.beans.factory.config.MethodInvokingFactoryBean
to invoke a static setter.
In the first option you have a bean with a regular setter but instead setting an instance property you set the static property/field.
publicvoid setTheProperty(Object value){
foo.bar.Class.STATIC_VALUE = value;}
but in order to do this you need to have an instance of a bean that will expose this setter (its more like an workaround).
In the second case it would be done as follows:
<bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"><property name="staticMethod" value="foo.bar.Class.setTheProperty"/><property name="arguments"><list><ref bean="theProperty"/></list></property></bean>
On you case you will add a new setter on the Utils
class:
publicstatic setDataBaseAttr(Properties p)
and in your context you will configure it with the approach exemplified above, more or less like:
<bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"><property name="staticMethod" value="foo.bar.Utils.setDataBaseAttr"/><property name="arguments"><list><ref bean="dataBaseAttr"/></list></property></bean>
其中方法二 应该比较实用,就是配置xml,配置staticMethod,以及instance
也可以这么玩
publicclassSample{publicstaticString name;@PostConstructpublicvoid init(){
name = privateName;}@Value("${my.name}")privateString privateName;publicString getPrivateName(){return privateName;}publicvoid setPrivateName(String privateName){this.privateName = privateName;}}
但是下面有大神说了 Firs of all, public static
non-final
fields are evil. Spring does not allow injecting to such fields for a reason.
because Non-final means you can modify the field value, which, for a static field, implies handling thread concurrency - a.k.a. pain in the stack.
上一篇: 二、Spring属性注入