摘要
本文主要介绍了Spring框架中@Autowired和@Configuration注解的区别。@Autowired用于自动注入依赖,支持属性、构造器和方法注入。@Configuration则用于定义配置类,允许在类中使用@Bean注解声明Bean。文章详细解释了这两个注解的作用、使用场景和核心特性。
1. @Autowired注解
1.1.1. @Autowired作用
- 自动注入依赖 :
@Autowired
用于告诉 Spring 自动将某个对象注入到另一个对象的属性、构造器或方法中。 - 它通过 类型匹配(by type)来寻找和注入 Spring 容器中的 Bean。
1.1.2. @Autowired使用场景
-
注入属性: 将 Spring 容器中的 Bean 自动注入到某个类的属性中。
@Component
public class ServiceA {
@Autowired
private ServiceB serviceB; // 自动注入 ServiceB 的实例
} -
构造器注入(推荐): 注入依赖时,优先使用构造器注入,能够保证对象在创建时依赖完全初始化。
@Component
public class ServiceA {
private final ServiceB serviceB;@Autowired public ServiceA(ServiceB serviceB) { this.serviceB = serviceB; }
}
-
方法注入 : 使用
@Autowired
标注的方法,Spring 会自动调用,并将依赖注入为方法参数。@Component
public class ServiceA {
private ServiceB serviceB;@Autowired public void setServiceB(ServiceB serviceB) { this.serviceB = serviceB; }
}
1.1.3. @Autowired核心特性
-
按类型注入 :默认情况下,
@Autowired
根据类型查找匹配的 Bean。 -
可选性 :可以通过
required = false
设置是否必须注入。@Autowired(required = false)
private ServiceC serviceC; // 如果没有 ServiceC 的 Bean,Spring 不会抛出异常 -
结合 @Qualifier :当存在多个类型匹配的 Bean 时,可通过
@Qualifier
指定具体的 Bean。@Autowired
@Qualifier("serviceB1")
private ServiceB serviceB; // 注入名为 serviceB1 的 Bean
1.1.4. @Autowired总结
@Autowired
的职责是完成依赖注入。- 用于类内部注入其他 Bean。
- 是 Spring IOC(控制反转)的核心机制。
2. @Configuration
2.1. @Configuration作用
- 配置类注解 :
@Configuration
用于标注一个类是 Spring 的 配置类,其主要职责是定义和管理 Bean。 - 该类中定义的方法通常使用
@Bean
注解,Spring 会将这些方法的返回值注册为容器中的 Bean。
2.2. @Configuration使用场景
-
定义配置类: 创建一个配置类,用于集中管理 Bean 的创建。
@Configuration
public class AppConfig {
@Bean
public ServiceA serviceA() {
return new ServiceA();
}@Bean public ServiceB serviceB() { return new ServiceB(); }
}
-
组合现有组件: 可以通过配置类来组合和定制第三方库或框架提供的组件。
@Configuration
public class CustomConfig {
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
} -
条件化配置 : 配置类可以与条件注解(如
@Conditional
)配合,动态加载 Bean。@Configuration
@ConditionalOnProperty(name = "feature.enabled", havingValue = "true")
public class FeatureConfig {
@Bean
public FeatureService featureService() {
return new FeatureService();
}
}
2.3. 核心特性
-
代替 XML 配置 :
@Configuration
配置类是 Spring Java Config 的核心,代替了传统的 XML 文件。 -
单例作用域 :
@Configuration
配置类会对@Bean
方法进行代理,确保返回的 Bean 始终是单例(即使手动调用该方法多次)。 -
组合性 :支持通过
@Import
导入其他配置类。@Configuration
@Import(OtherConfig.class)
public class MainConfig {
}
2.4. 总结
@Configuration
的职责是定义配置类,生成和管理 Bean。- 用于将类本身注册到 Spring 容器中,并集中管理 Bean 的创建。
- 是 Spring Java 配置的重要组成部分。
3. 结合使用的场景
通常 @Configuration
和 @Autowired
会一起使用,比如:
-
用
@Configuration
定义 Bean:@Configuration
public class AppConfig {
@Bean
public ServiceA serviceA() {
return new ServiceA(serviceB());
}@Bean public ServiceB serviceB() { return new ServiceB(); }
}
-
在其他类中用
@Autowired
注入:@Component
public class Example {
@Autowired
private ServiceA serviceA; // 自动注入 serviceA Bean
}
通过 @Configuration
管理 Bean 的生成,配合 @Autowired
实现依赖注入,这样可以灵活解耦和集中管理代码逻辑。
4. @Autowired和@Configuration区别总结
|---------------|----------------------------|-------------------------------|
| 特性 | @Autowired | @Configuration |
| 作用 | 用于 注入依赖,将 Bean 自动注入到类中 | 用于 定义配置类,集中管理 Bean 的创建与配置 |
| 使用范围 | 属性、构造器、方法 | 类级别 |
| 目的 | 自动装配 Spring 容器中的现有 Bean | 定义和管理 Bean,生成新的 Bean |
| 是否创建 Bean | 不会创建新 Bean,只装配已有的 Bean | 通过 @Bean
方法生成新的 Bean |
| 常用场景 | 注入属性或方法依赖 | 替代 XML 配置类,集中管理应用配置 |