文章目录
-
- [@Autowired:Spring 最常用的注解](#@Autowired:Spring 最常用的注解)
-
- [1. 作用与简介](#1. 作用与简介)
- [2. 使用示例](#2. 使用示例)
- [3. 注意事项](#3. 注意事项)
- @Resource:按名称注入的利器
-
- [1. 作用与简介](#1. 作用与简介)
- [2. 使用示例](#2. 使用示例)
- [3. 注意事项](#3. 注意事项)
- [@Qualifier:解决多 bean 注入问题](#@Qualifier:解决多 bean 注入问题)
-
- [1. 作用与简介](#1. 作用与简介)
- [2. 使用示例](#2. 使用示例)
- [3. 注意事项](#3. 注意事项)
- @Inject:标准化的依赖注入
-
- [1. 作用与简介](#1. 作用与简介)
- [2. 使用示例](#2. 使用示例)
- [3. 注意事项](#3. 注意事项)
- 总结:如何选择正确的注解?
-
- [1. 使用建议](#1. 使用建议)
- [2. 注意事项](#2. 注意事项)
- 推荐阅读文章
在使用 Spring 框架进行开发时,依赖注入 (Dependency Injection, DI)是核心理念之一。它让我们可以轻松地管理对象之间的依赖关系,而不需要手动创建和维护这些依赖。在实现依赖注入时,Spring 提供了多种注解来简化开发流程,其中最常见的四种注解是 @Autowired 、@Resource 、@Qualifier 和 @Inject。
在这篇文章中,我将通过代码示例,详细介绍这些注解的使用方法,并总结一些使用中的注意事项,帮助你更高效地进行开发。
@Autowired:Spring 最常用的注解
1. 作用与简介
@Autowired
是 Spring 提供的专用注解,用来自动注入依赖。它可以用于构造器、字段、方法,甚至是多参数构造器或 setter 方法。
2. 使用示例
java
@Component
public class CarService {
@Autowired
private Engine engine; // 字段注入
@Autowired
public CarService(Engine engine) { // 构造器注入
this.engine = engine;
}
@Autowired
public void setEngine(Engine engine) { // Setter 方法注入
this.engine = engine;
}
}
在上述代码中,无论是字段、构造器还是 setter 方法,Spring 都会自动将 Engine
的实例注入到 CarService
中。
3. 注意事项
-
推荐使用构造器注入 :虽然字段注入最简单,但构造器注入更受推荐,因为它有助于保持对象的不可变性,方便测试和重构。
-
处理可选依赖 :如果某个依赖是可选的,可以通过
required=false
来避免依赖注入时抛出异常:java@Autowired(required = false) private Engine engine;
@Resource:按名称注入的利器
1. 作用与简介
@Resource
是来自 JDK 的标准注解 ,它可以按名称或按类型进行依赖注入。默认情况下,它是按名称注入的。
2. 使用示例
java
@Component
public class CarService {
@Resource(name = "v8Engine") // 按名称注入
private Engine engine;
}
在上面的代码中,Spring 会查找名为 v8Engine
的 Engine
实例并注入到 CarService
中。
3. 注意事项
- 名称优先 :
@Resource
优先按名称注入,如果未指定名称,它会使用变量名作为默认名称。如果找不到对应的 bean,才会按类型注入。因此,确保 bean 名称与变量名或指定的名称一致。 - 不支持
required=false
:@Resource
不支持像@Autowired
那样的required
属性,因此如果依赖没有找到,它将抛出异常。
@Qualifier:解决多 bean 注入问题
1. 作用与简介
当 Spring 容器中有多个相同类型的 bean 时,@Qualifier
注解可以帮助我们明确指定哪个 bean 应该被注入。它通常与 @Autowired
或 @Inject
一起使用。
2. 使用示例
java
@Component
public class CarService {
@Autowired
@Qualifier("v8Engine") // 指定要注入的具体 bean
private Engine engine;
}
在这里,即使有多个 Engine
实现类,Spring 仍会通过 @Qualifier("v8Engine")
来指定注入的 v8Engine
实例。
3. 注意事项
- 明确指定 bean 名称 :当有多个同类型的 bean 时,使用
@Qualifier
是必要的,否则 Spring 会抛出NoUniqueBeanDefinitionException
异常。 - 与其他注解搭配使用 :
@Qualifier
通常与@Autowired
或@Inject
搭配使用,用于解决多实例时的注入问题。
@Inject:标准化的依赖注入
1. 作用与简介
@Inject
是来自 JSR-330 的注解,与 @Autowired
类似,它用于实现依赖注入,但它是一个标准化的注解,适用于所有依赖注入框架。
2. 使用示例
java
import javax.inject.Inject;
@Component
public class CarService {
@Inject
private Engine engine; // 标准依赖注入
}
使用 @Inject
和 @Autowired
的效果基本相同,但它具有更广泛的适用性,尤其在使用多种依赖注入框架时。
3. 注意事项
- 不支持
required=false
:与@Autowired
不同,@Inject
没有required
属性,所以所有依赖必须是必需的。 - 支持
@Qualifier
:与@Autowired
一样,@Inject
也可以与@Qualifier
一起使用,以指定注入的具体 bean。
总结:如何选择正确的注解?
注解 | 来源 | 默认注入方式 | 是否支持 @Qualifier |
是否支持 required=false |
---|---|---|---|---|
@Autowired | Spring 特有 | 按类型注入 | 是 | 是 |
@Resource | JDK 标准(javax.annotation ) |
按名称注入 | 否 | 否 |
@Inject | JSR-330 标准 | 按类型注入 | 是 | 否 |
1. 使用建议
- 优先使用
@Autowired
:如果你的项目完全依赖于 Spring 框架,@Autowired
是最灵活和强大的选择,尤其是它支持构造器注入和required=false
。 - 使用
@Resource
进行按名称注入 :如果你需要按名称进行注入,@Resource
是最合适的选择。但要注意,@Resource
的功能相对有限。 - 标准化项目使用
@Inject
:如果你的项目需要兼容多个依赖注入框架,@Inject
是最佳选择,因为它是标准化的注解。 - 多实例时使用
@Qualifier
:当有多个同类型的 bean 时,@Qualifier
是解决模糊注入问题的利器,避免不必要的异常。
2. 注意事项
- 避免字段注入:尽量避免字段注入,推荐使用构造器注入,这不仅有助于依赖的不可变性,还能提升代码的可测试性。
- 使用
@Qualifier
解决多 bean 注入问题 :如果存在多个同类型的 bean,一定要使用@Qualifier
明确指定要注入的 bean,否则会出现NoUniqueBeanDefinitionException
异常。 - 可选依赖 :在使用
@Autowired
时,如果某个依赖可能为空,记得使用required=false
,防止 Spring 因找不到 bean 而抛出异常。 - 名称和类型冲突 :在使用
@Resource
时,要特别注意 bean 名称和类型冲突问题,确保名称和实际注入的 bean 名称匹配,否则可能会导致注入失败。
通过了解这些注解的使用方式和特点,选择合适的注解不仅能够简化代码,还可以避免一些常见的注意事项。
推荐阅读文章
1、使用 Spring 框架构建 MVC 应用程序:初学者教程
2、有缺陷的 Java 代码:Java 开发人员最常犯的 10 大错误
3、如何理解应用 Java 多线程与并发编程?
4、Java Spring 中常用的 @PostConstruct 注解使用总结
5、线程 vs 虚拟线程:深入理解及区别
6、深度解读 JDK 8、JDK 11、JDK 17 和 JDK 21 的区别
7、10大程序员提升代码优雅度的必杀技,瞬间让你成为团队宠儿!
8、"打破重复代码的魔咒:使用 Function 接口在 Java 8 中实现优雅重构!"
9、Java 中消除 If-else 技巧总结
10、线程池的核心参数配置(仅供参考)
11、【人工智能】聊聊Transformer,深度学习的一股清流(13)
12、Java 枚举的几个常用技巧,你可以试着用用