美文网首页
Spring依赖注入static静态变量相关问题(转)

Spring依赖注入static静态变量相关问题(转)

作者: Cocoonshu粽子 | 来源:发表于2018-12-17 20:08 被阅读7次

    1.Spring不支持依赖注入static静态变量

    在Spring中,我们不能@Autowired一个静态变量,使之成为一个spring bean,也不能@Value把值注入到静态变量中。

    @Autowired
    private static YourClass yourClass;
    
    @Value("${yourValue}")
    private static String yourValue;
    

    为什么呢?
    静态变量/类变量不是对象的属性,而是一个类的属性,spring则是基于对象层面上的依赖注入。
    而使用静态变量/类变量扩大了静态方法的使用范围.静态方法在spring是不推荐使用的.依赖注入的主要目的,是让容器去产生一个对象的实例,然后在整个生命周期中使用他们,同时也让testing工作更加容易.
    一旦你使用静态方法,就不再需要去产生这个类的实例,这会让testing变得更加困难,同时你也不能为一个给定的类,依靠注入方式去产生多个具有不同的依赖环境的实例.这种static field是隐含共享的,并且是一种global全局状态,spring同样不推荐这样去做.

    2.Spring如何给静态变量注入值

    好在spring支持set方法注入,我们可以利用非静态setter 方法注入静态变量。

    private static String yourValue;
    
    @Value("${yourValue}")
    public void setYourValue(String value){
       yourValue = value;
    }
    

    3.Spring静态注入的三种方式

    1. xml方式实现:
    <bean id="mongoFileOperationUtil" class="com.*.*.MongoFileOperationUtil" init-method="init">  
        <property name="dsForRW" ref="dsForRW"/>  
    </bean> 
    
    public class MongoFileOperationUtil {  
          
        private static AdvancedDatastore dsForRW;  
      
        private static MongoFileOperationUtil mongoFileOperationUtil;  
      
        public void init() {  
            mongoFileOperationUtil = this;  
            mongoFileOperationUtil.dsForRW = this.dsForRW;  
        }  
    }
    

    这种方式适合基于XML配置的WEB项目;

    2. @PostConstruct方式实现;
    import org.mongodb.morphia.AdvancedDatastore;  
    import org.springframework.beans.factory.annotation.Autowired;  
      
      
    @Component  
    public class MongoFileOperationUtil {  
        @Autowired  
        private static AdvancedDatastore dsForRW;  
    
        private static MongoFileOperationUtil mongoFileOperationUtil;  
    
        @PostConstruct  
        public void init() {  
            mongoFileOperationUtil = this;  
            mongoFileOperationUtil.dsForRW = this.dsForRW;  
        }  
    }
    

    @PostConstruct 注解的方法在加载类的构造函数之后执行,也就是在加载了构造函数之后,执行init方法;(@PreDestroy 注解定义容器销毁之前的所做的操作)
    这种方式和在xml中配置 init-method和 destory-method方法差不多,定义spring 容器在初始化bean 和容器销毁之前的所做的操作;

    3.set方法上添加@Autowired注解,类定义上添加@Component注解;
    import org.mongodb.morphia.AdvancedDatastore;  
    import org.springframework.beans.factory.annotation.Autowired;  
    import org.springframework.stereotype.Component;  
      
    @Component  
    public class MongoFileOperationUtil {  
      
        private static AdvancedDatastore dsForRW;  
          
        @Autowired  
        public void setDatastore(AdvancedDatastore dsForRW) {  
            MongoFileOperationUtil.dsForRW = dsForRW;  
        }  
    }  
    

    首先Spring要能扫描到AdvancedDatastore的bean,然后通过setter方法注入;
    然后注意:成员变量上不需要再添加@Autowired注解;

    转自https://blog.csdn.net/rongxiang111/article/details/78881371

    相关文章

      网友评论

          本文标题:Spring依赖注入static静态变量相关问题(转)

          本文链接:https://www.haomeiwen.com/subject/hufckqtx.html