欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

spring 注入static属性

程序员文章站 2022-05-24 10:49:12
...
网上好多方法都是错误的,google之,发现
 
 
http://*.com/questions/11324372/how-to-make-spring-inject-value-into-a-static-field 写道

You have two possibilities:

  1. non-static setter for static property/field;
  2. 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

 

 

 

也可以这么玩

http://*.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 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.