@Autowired 和 @Resource区别
@Autowired 和 @Resource区别
- @Autowired 是 Spring 框架的注解,而 @Resource 是 JavaEE 的注解。
- @Autowired 默认按照类型进行匹配,如果有多个同类型的 bean,则可以通过 @Qualifier 指定具体的 bean 名称。而 @Resource 默认按照名称进行匹配,如果名称匹配不到,则可以通过 name 属性指定具体的 bean 名称。
- @Autowired 可以用在构造方法、setter 方法、字段上,而 @Resource 只能用在字段上。
- @Autowired 是 Spring 框架的特有功能,而 @Resource 是 JavaEE 的标准功能,在使用时需要注意兼容性问题。
- 都可以用于依赖注入
通过构造函数解决警告问题
为了消除警告,避免写出循环依赖的代码,我就使用了构造函数注入,以下是我项目中使用的方式,通过
@RequiredArgsConstructor
可以减少很多代码
@RequiredArgsConstructor
是Lombok框架中的注解之一,用于自动生成一个包含所有必需参数的构造函数。它可以帮助开发人员减少代码量,避免手动编写构造函数。使用@RequiredArgsConstructor
注解时,Lombok会自动检测类中所有被声明为final
的字段,并将其作为构造函数的参数。生成的构造函数将使用这些参数来初始化字段。
例如,下面是一个使用@RequiredArgsConstructor
注解:
@RequiredArgsConstructor public class MyService { private final MyRepository myRepository; private final MyLogger myLogger; // ... }
使用@RequiredArgsConstructor
注解可以让开发人员更快地编写代码,并避免手动编写构造函数。将字段声明为final
,以确保不可变性和线程安全性。
为什么 Spring 和 IDEA 都不推荐使用 @Autowired 注解?
个人认为,就像我们前面提到过的:@Autowired是Spring提供的,它是特定IoC提供的特定注解,这就导致了应用与框架的强绑定,一旦换用了其他的IoC框架,是不能够支持注入的。
而 @Resource是JSR-250提供的,它是Java标准,我们使用的IoC容器应当去兼容它,这样即使更换容器,也可以正常工作。