美文网首页
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静态变量相关问题(转)

    1.Spring不支持依赖注入static静态变量 在Spring中,我们不能@Autowired一个静态变量,使...

  • Spring注入静态成员变量

    Spring不支持依赖注入static静态变量 在springframework里,我们不能@Autowired一...

  • 都0202年了还在说spring@Autowired是byTyp

    前言 基于上篇文章从源码的角度查找Spring @Autowired注解不能依赖注入静态变量的原因[https:/...

  • Spring IOC原理(三)

    Spring 四种依赖注入的方式 构造器注入 setter方法注入 静态方法注入 静态工厂顾名思义,就是通过调用静...

  • static关键字

    static修饰变量相关概念 static翻译为"静态" 所有static关键字修饰的都是类相关的,类级别的。 所...

  • java随笔

    static变量和static方法 static变量 1.static修饰的变量:静态变量,静态变量在内存中只有一...

  • C++笔记

    2. Const 和 Static Const相关注意 ◼ 静态成员:被static修饰的成员变量\函数​ ...

  • Spring问题汇总-03静态变量注入

    1 Spring中静态变量注入的方法 在日常开发中可能使用到工厂模式,有时可能在工厂中定义静态变量并且注入。Spr...

  • Java中的静态内部类

    一:静态内部类 使用static修饰的变量是静态变量,使用static 修饰的方法是静态方法,静态变量和静态方法都...

  • @Component

    用例1: 成员变量自动导入, 前提是成员变量已被注入到spring容器中,并且成员变量被构造方法依赖注入 用例2:...

网友评论

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

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