spring 注入static属性

来源:互联网 发布:设计界面的软件 编辑:程序博客网 时间:2024/05/21 06:21

网上好多方法都是错误的,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 anworkaround).

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.

本文为头条号作者发布,不代表今日头条立场。

0 0
原创粉丝点击