spring 注入static屬性
網上好多方法都是錯誤的,google之,發現
http://stackoverflow.com/questions/11324372/how-to-make-spring-inject-value-into-a-static-field 寫道
You have two possibilities:
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
也可以這麼玩
http://stackoverflow.com/questions/7253694/spring-how-to-inject-a-value-to-static-field 寫道
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 areevil. 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.
本文為頭條號作者釋出,不代表今日頭條立場。