开发者千万别再滥用@Autowired,否则后果很严重!
2023-01-18 08:56:45
Java 中的依赖注入:@Autowired
与 @Resource
的对比
在 Java 世界中,@Autowired
和 @Resource
是两个声名远播的注解,它们用于进行依赖注入,使我们能够自动装配 Bean,摆脱手动实例化的麻烦。尽管它们的功能相似,但在这两个注解之间存在一些重要的差异。
用法范围
@Autowired
是 Spring Boot 中自带的注解,可以应用于任何地方,包括类、方法和参数。@Resource
是 J2EE 规范中的注解,仅能用于类和方法。
注解类型
@Autowired
是一个类型注解,可以标注在任何类型上。@Resource
是一个字段注解,只能标注在字段上。
默认值
@Autowired
默认按类型匹配 Bean。@Resource
默认按名称匹配 Bean。
匹配模式
@Autowired
仅支持按类型匹配。@Resource
支持按类型和按名称两种匹配模式。
警告和错误
- 如果使用
@Autowired
注解了一个不存在的 Bean,Spring Boot 会抛出一个异常。 - 如果使用
@Resource
注解了一个不存在的 Bean,Spring Boot 则会显示一个警告。
何时使用 @Autowired
和 @Resource
?
根据上述对比,我们可以得出以下结论:
- 当按类型匹配 Bean 时,使用
@Autowired
。 - 当按名称匹配 Bean 时,使用
@Resource
。 - 当需要匹配多个 Bean 时,可以使用
@Autowired
并指定@Qualifier
注解。 - 当需要匹配一个不存在的 Bean 时,可以使用
@Resource
并指定@Required
注解。
如何避免 @Autowired
和 @Resource
的警告和错误?
为避免 @Autowired
和 @Resource
的警告和错误,我们可以遵循以下最佳实践:
- 确保 Bean 的名称与其实例类名一致。
- 确保 Bean 的名称是唯一的。
- 确保 Bean 的类型与其实例类一致。
- 确保 Bean 的作用域与其实例类一致。
- 确保 Bean 的初始化方法与其实例类一致。
代码示例
@Autowired
@Autowired
private UserService userService;
@Resource
@Resource(name = "userService")
private UserService userService;
结论
@Autowired
和 @Resource
都是非常有用的注解,可以轻松实现依赖注入。但是,它们的用法和语义存在一些差异,因此在使用时应仔细权衡。通过遵循最佳实践,可以避免出现警告和错误,并充分利用这两个注解的优点。
常见问题解答
-
@Autowired
和@Resource
之间哪个更好?
答案:两者都是有效的依赖注入注解,选择哪一个取决于具体情况和个人偏好。 -
可以使用
@Resource
来注入其他注解的 Bean 吗?
答案:可以,可以使用@Resource(type = MyAnnotation.class)
来注入带有@MyAnnotation
注解的 Bean。 -
如何指定
@Autowired
匹配多个 Bean?
答案:可以使用@Autowired
和@Qualifier
注解,例如:@Autowired @Qualifier("userServiceImpl1") private UserService userService1;
-
@Autowired
和@Required
注解有什么区别?
答案:@Autowired
用于自动装配 Bean,而@Required
用于指定 Bean 必须存在,否则会抛出一个异常。 -
@Autowired
可以与构造函数一起使用吗?
答案:可以,可以使用@Autowired
注解构造函数的参数,例如:public MyClass(@Autowired UserService userService) {}