1. 程式人生 > >spring 注入static屬性

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 Utilsclass:

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 staticnon-finalfields 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.

本文為頭條號作者釋出,不代表今日頭條立場。