《Spring Boot 3实战案例合集》现已囊括超过50篇精选实战文章,并且此合集承诺将永久持续更新,为您带来最前沿的技术资讯与实践经验。欢迎积极订阅,享受不断升级的知识盛宴!订阅用户将特别获赠合集内所有文章的最终版MD文档(详尽学习笔记),以及完整的项目源码,助您在学习道路上畅通无阻。
环境:SpringBoot3.2.5
1. 简介
在Spring框架中,依赖注入是一种核心特性,用于管理对象之间的依赖关系。然而,Spring并不支持直接向静态字段注入依赖。这是因为静态字段属于类级别,而非实例级别,它们在类加载时就被初始化,并且在整个应用程序生命周期中只有一份拷贝,这与Spring管理的bean生命周期不符。
可以总结以下3方面原因:
初始化时机不同:静态字段在类加载时就已经初始化,而Spring管理的bean是在容器初始化时才被创建和初始化的。因此,当静态字段需要依赖于Spring管理的bean时,这些bean可能还没有被创建。
生命周期管理不同:Spring容器可以管理bean的整个生命周期,包括初始化和销毁。但是,静态字段的生命周期不由Spring容器管理,而是由JVM管理。这可能导致资源管理不当,例如内存泄漏。
依赖注入的局限性:Spring的依赖注入机制主要针对实例级别的bean,而不是类级别的静态字段。因此,直接在静态字段上使用@Autowired / @Resource 注解是无效的,因为Spring容器无法在类加载时完成依赖注入。
静态字段不能被注入底层源码实现
@Autowired注解

判断如果是静态字段则直接返回。
@Resource注解

对于@Resource注解,则是直接抛出了异常,容器都将无法正常启动。
关于Bean获取方式
除了我们通过上面介绍的注解(@Inject等其它)方式获取Bean,还可以通过应用程序上下文ApplicationContext直接获取对象,该对象是Spring的核心,它提供了如下的功能:
以通用的方式加载文件资源
向已注册的监听器发布事件
解析message,支持国际化
访问应用程序组件的bean工厂方法
这里我们只关系最后一个功能;我们想使用ApplicationContext获取另一个 Bean。接口提供了多个重载的getBean方法(父接口中定义BeanFactory)。

如何获取ApplicationContext对象呢?
我们可以直接通过注入的方式,也可以通过实现ApplicationContextAware接口,如下示例:
public class ContextComponent implements ApplicationContextAware {private ApplicationContext context ;// 通过注解或构造函数注入// public ContextComponent(ApplicationContext context) {// this.context = context ;// }public void setApplicationContext(ApplicationContext context) throws BeansException {this.context = context ;}}
但是,如果希望在静态的上下文中访问ApplicationContext如何做呢?


