EnableSpringConfigured注解

1. 引言

您知道在Spring应用中如何对非Spring管理的对象实现依赖注入吗?

有没有想过,如果在一个充满活力的生态系统中,每个生物都能自主找到生存所需的资源,无论它们身处何方?在Spring的世界里,我们构建的应用就像这样一个生态系统,而组件就是其中寻找相互合作以生存的生物。然而,总有一些独立的个体,未被Spring的温暖怀抱直接包围,它们像是在森林的边缘,既渴望加入这个生态圈,又似乎处于一个略显孤立的位置。这些就是我们直接用new关键字创建的对象,它们自生自灭,看似与Spring容器中精心管理的豪华生态系统无缘。

但如果我告诉你,有一种方式可以打破这个界限,让这些边缘的个体也能享受到Spring生态圈中的资源,就像是被一个无形的力量所吸引,自然而然地融入这个大家庭中,你会不会感到好奇? @EnableSpringConfigured正是这样一把魔法钥匙,它允许那些非Spring管理的对象,也能享受到依赖注入的滋养,就像是突然间,森林的边界消失了,每个生物都能在这个生态系统中找到自己的位置。

难道这不是一种将孤立的个体和整个社区连接起来的神奇方式吗?让我们深入了解 @EnableSpringConfigured,探索它如何使得这一切成为可能,如何让我们的应用更加灵活和强大。

2. 基本信息

所属框架 Spring Framework
框架版本 6.1.4
所属子项目 spring-aspects
起始版本 3.1
注解行数 48

3. 单词说明

  1. Enable:启用或使能的意思,表示激活某项功能。
  2. Spring:指的是Spring框架,这里的上下文。
  3. Configured:配置的意思,这里指的是自动配置依赖注入。

将这些词汇放在一起, @EnableSpringConfigured可以理解为"启用Spring框架的自动配置功能"

4. 注解说明

@EnableSpringConfigured 是一个用于启用Spring的依赖注入功能的注解,特别是针对那些不是通过Spring bean工厂创建的类,比如使用new关键字。这些类通常通过 @Configurable注解标记,表明它们可以接收Spring管理的依赖注入,即使它们是在Spring容器外部实例化的。

5. 类比记忆

@EnableSpringConfigured就像给Spring一个特殊的眼镜,让它能看到并帮助那些原本不是由它直接创建的对象,通过给这些外来对象注入所需要的东西,就像在他们身上贴上了一个"需要帮助"的标签,这样无论它们来自哪里,都能享受到Spring管理依赖的好处。

想象你正在参与一个大型项目,项目中不仅有你亲手打造的部件,也有一些现成的或别人提供的部件。 @EnableSpringConfigured就像是一个允许你给这些外来部件加上"智能芯片"的工具,让它们也能像项目中其他原生部件一样享受自动供电和连接服务。这样,不管部件的来源如何,它们都能和谐地工作在同一个系统中。

6. 基本用法

让我们构建一个简单的例子来展示 @EnableSpringConfigured 的使用,包括定义一个依赖(SomeDependency 类),一个使用 @Configurable 注解的类(SomeClass ),以及如何通过new 操作符创建SomeClass 的实例,同时确保SomeDependency被自动注入。

  1. 添加依赖(以Maven为例)
XML 复制代码
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-context</artifactId>
  <version>6.1.4</version>
</dependency>

<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-aspects</artifactId>
  <version>6.1.4</version>
</dependency>
  1. 定义SomeDependency 类,这是一个简单的服务类,它将被注入到SomeClass中:
JAVA 复制代码
@Component
public class SomeDependency {
    public void performAction() {
        System.out.println("Dependency action performed.");
    }
}
  1. 定义SomeClass 类,并使用 @Configurable注解来标记它,表明这个类的实例需要Spring管理其依赖注入:
JAVA 复制代码
@Configurable
public class SomeClass {
    @Autowired
    private SomeDependency dependency;

    public void doSomething() {
        dependency.performAction();
    }
}
  1. 为了让 @EnableSpringConfigured@Configurable 工作,你需要在Spring配置中启用 @EnableSpringConfigured和@EnableLoadTimeWeaving
JAVA 复制代码
@Configuration
@EnableLoadTimeWeaving
@EnableSpringConfigured
@ComponentScan(basePackages = "org.study")
public class AppConfig {
    // 其他配置...
}
  1. 在jvm运行参数中添加:-javaagent:spring-framework/lib/spring-instrument-6.1.4.jar ,通过new 操作符创建SomeClass 的实例,并观察到SomeDependency被自动注入:
JAVA 复制代码
public class Main {
    public static void main(String[] args) {
        ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
        // 通过new操作符创建SomeClass的实例
        SomeClass someClass = new SomeClass();
        // 这将输出"Dependency action performed.",表明依赖已被注入
        someClass.doSomething(); 
    }
}
  1. 示例代码

gitee.com/chuanglianc...

7. 常见问题

  1. 为什么需要 @EnableSpringConfigured

@EnableSpringConfigured 提供了一种机制,允许Spring框架为那些不是通过Spring ApplicationContext创建的对象(比如直接使用new关键字创建的对象)注入依赖。这是通过Spring的Instrumentation和Load-Time Weaving(LTW)功能实现的,扩展了Spring依赖注入的应用范围。

  1. 如何配置来使用 @EnableSpringConfigured

使用 @EnableSpringConfigured 通常需要使用Spring Instrumentation的加载时织入功能,而不是依赖于AspectJ的织入。这通常涉及到指定**-javaagent参数来引用spring-instrument**的jar文件。不需要特别修改构建配置来引入AspectJ库。

  1. @EnableSpringConfigured 和普通的Spring Bean有什么区别?

@EnableSpringConfigured使得Spring可以注入依赖到那些不是通过Spring的标准机制创建的对象。这与通过组件扫描注册的Spring Beans不同,这些Beans是由Spring容器控制并负责其生命周期的。

  1. 在何种情况下使用 @EnableSpringConfigured 当你需要将Spring的依赖注入应用于由遗留代码或第三方库创建的对象时, @EnableSpringConfigured特别有用。这有助于在不改变现有代码创建对象方式的前提下,将这些对象集成到Spring上下文中。
  2. @EnableSpringConfigured 的替代解决方案
  • 如果应用中所有的组件都能够由Spring管理,那么通常不需要使用 @EnableSpringConfigured 。你可以使用 @Autowired@Resource@Inject等注解来实现依赖注入。
  • 通过代码重构来让Spring负责对象的创建过程,可以避免需要使用 @EnableSpringConfigured,这样就能更好地符合Spring的"约定大于配置"的原则。
相关推荐
Passion不晚3 小时前
Spring Boot 入门:解锁 Spring 全家桶
spring boot·后端·spring
终末圆8 小时前
MyBatis XML映射文件编写【后端 18】
xml·java·开发语言·后端·算法·spring·mybatis
憨憨憨憨憨到不行的程序员9 小时前
Spring框架基础知识
java·后端·spring
咖啡攻城狮Alex10 小时前
Spring在不同类型之间也能相互拷贝?
java·后端·spring
姜西西_16 小时前
[Spring]Spring MVC 请求和响应及用到的注解
java·spring·mvc
dawn19122816 小时前
SpringMVC 入门案例详解
java·spring·html·mvc
极客先躯16 小时前
高级java每日一道面试题-2024年9月16日-框架篇-Spring MVC和Struts的区别是什么?
java·spring·面试·mvc·struts2·框架篇·高级java
尘浮生19 小时前
Java项目实战II基于Java+Spring Boot+MySQL的大型商场应急预案管理系统(源码+数据库+文档)
java·开发语言·数据库·spring boot·spring·maven·intellij-idea
尘浮生19 小时前
Java项目实战II基于Java+Spring Boot+MySQL的校园社团信息管理系统(源码+数据库+文档)
java·开发语言·数据库·spring boot·mysql·spring·maven