• Spring为什么不支持static字段注入


    Spring不支持直接依赖注入到静态变量中。在Spring框架中,依赖注入是一个核心概念,它允许开发者将对象间的依赖关系定义转移到容器中,由容器负责管理这些依赖关系。然而,当涉及到静态变量时,情况就变得复杂了。

    首先从Spring框架的设计原理出发。Spring的依赖注入机制是基于对象层面的,意味着它通过为类的实例字段或方法参数注入所需的依赖来工作。而静态变量属于类级别,它们在类加载时就已经初始化,这发生在Spring IoC容器完成依赖注入之前。由于这种顺序上的不一致,Spring无法直接对静态变量进行注入,因为这需要修改已经加载的类的状态,而这通常是不允许的。

    静态变量与Spring推崇的编程模式相悖。Spring鼓励使用非静态的字段和方法来实现业务逻辑,这样可以通过依赖注入实现更灵活、可测试和可配置的设计。使用静态变量会使得单元测试变得更加困难,因为它们不能被轻易地替换或模拟。此外,静态变量本质上是全局状态,这可能导致难以追踪的bug和线程安全问题。

    尽管Spring不直接支持静态变量的依赖注入,但实践中存在一些替代方案可以实现类似功能。例如,可以使用非静态的setter方法结合@Autowired注解来间接设置静态变量的值。这种方式允许Spring在调用setter方法时传入所需的依赖,从而间接实现对静态变量的“注入”。

    另一种方法是利用@PostConstruct注解的方法来初始化静态变量。通过在一个非静态的方法上使用@PostConstruct,可以在Bean创建完成后执行这个方法,并在其中设置静态变量的值。这种方法确保了静态变量在使用前已经被正确初始化。

    综上所述,虽然Spring框架不支持直接对静态变量进行依赖注入,但通过上述方法可以在一定程度上解决这个问题。重要的是要认识到,过度依赖静态变量可能与Spring框架推崇的编程实践不符,因此在实际开发中应尽量避免使用静态变量,或者谨慎地使用它们。

    1. 静态字段&方法注入

    首先,我们来确认一下,在Spring框架中,是否不允许对静态字段和方法进行注入的各种使用方式。

    容器启动后,输出如下错误。错误直接就提示了@Resource不支持静态字段的注入。

    @Autowired注解虽然不能注入静态字段,但是没有抛出异常。反而这种没有错误提示的更加危险只有用到的时候才抛出NPE异常。

    正确注入静态字段

    2.1 实例方法注入

    public class PersonController {  private static PersonService ps;   @Resource  // @Autowired  // @Inject  public void setPs(PersonService personService) {    ps = personService ;  }}

    以上3中注解方式都可以。

    2.2 构造函数注入​​​​​​​

    private static PersonService ps; public PersonController(PersonService personService) {  ps = personService ;}

    构造函数注入,不需要任何的注解。

  • 相关阅读:
    【聚类】之浅谈(对比K-means跟DB-scan)
    C++string类重要函数模拟实现
    Vue2.js使用 Axios
    HTML5期末考核大作业:基于Html+Css+javascript的网页制作(化妆品公司网站制作)
    Himall商城Zip帮助类压缩文件(Zip)
    自定义TAG标签页面聚合
    【c++】——类和对象(上)——万字详细解疑
    STM32项目工程的搭建
    记一次服务间调用失败的bug
    深度学习 LSTM长短期记忆网络原理与Pytorch手写数字识别
  • 原文地址:https://blog.csdn.net/m0_62986746/article/details/139427087