大数跨境
0
0

技巧!Spring 静态字段注入及其潜在风险

技巧!Spring 静态字段注入及其潜在风险 Spring全家桶实战案例
2024-11-27
0
导读:技巧!Spring 静态字段注入及其潜在风险

Spring Boot 3实战案例合集》现已囊括超过50篇精选实战文章,并且此合集承诺将永久持续更新,为您带来最前沿的技术资讯与实践经验。欢迎积极订阅,享受不断升级的知识盛宴!订阅用户将特别获赠合集内所有文章的最终版MD文档(详尽学习笔记),以及完整的项目源码,助您在学习道路上畅通无阻。

环境:SpringBoot3.2.5



1. 简介

在Spring框架中,依赖注入是一种核心特性,用于管理对象之间的依赖关系。然而,Spring并不支持直接向静态字段注入依赖。这是因为静态字段属于类级别,而非实例级别,它们在类加载时就被初始化,并且在整个应用程序生命周期中只有一份拷贝,这与Spring管理的bean生命周期不符。

可以总结以下3方面原因:

  1. 初始化时机不同:静态字段在类加载时就已经初始化,而Spring管理的bean是在容器初始化时才被创建和初始化的。因此,当静态字段需要依赖于Spring管理的bean时,这些bean可能还没有被创建。

  2. 生命周期管理不同:Spring容器可以管理bean的整个生命周期,包括初始化和销毁。但是,静态字段的生命周期不由Spring容器管理,而是由JVM管理。这可能导致资源管理不当,例如内存泄漏。

  3. 依赖注入的局限性:Spring的依赖注入机制主要针对实例级别的bean,而不是类级别的静态字段。因此,直接在静态字段上使用@Autowired / @Resource 注解是无效的,因为Spring容器无法在类加载时完成依赖注入。

     

静态字段不能被注入底层源码实现

@Autowired注解

判断如果是静态字段则直接返回。

@Resource注解

对于@Resource注解,则是直接抛出了异常,容器都将无法正常启动。

关于Bean获取方式

除了我们通过上面介绍的注解@Inject等其它方式获取Bean,还可以通过应用程序上下文ApplicationContext直接获取对象,该对象是Spring的核心,它提供了如下的功能:

  • 以通用的方式加载文件资源

  • 向已注册的监听器发布事件

  • 解析message,支持国际化

  • 访问应用程序组件的bean工厂方法

     

这里我们只关系最后一个功能;我们想使用ApplicationContext获取另一个 Bean。接口提供了多个重载的getBean方法(父接口中定义BeanFactory)。

如何获取ApplicationContext对象呢?

我们可以直接通过注入的方式,也可以通过实现ApplicationContextAware接口,如下示例:

@Componentpublic class ContextComponent implements ApplicationContextAware {
private ApplicationContext context ;  // 通过注解或构造函数注入//  public ContextComponent(ApplicationContext context) {// this.context = context ;// }
@Override public void setApplicationContext(ApplicationContext context) throws BeansException { this.context = context ; }}

但是,如果希望在静态的上下文中访问ApplicationContext如何做呢?

【声明】内容源于网络
0
0
Spring全家桶实战案例
Java全栈开发,前端Vue2/3全家桶;Spring, SpringBoot 2/3, Spring Cloud各种实战案例及源码解读
内容 832
粉丝 0
Spring全家桶实战案例 Java全栈开发,前端Vue2/3全家桶;Spring, SpringBoot 2/3, Spring Cloud各种实战案例及源码解读
总阅读285
粉丝0
内容832