主页还有其他的八股文知识总结,有需要的可以去看一下,喜欢的就留个三连再走吧~
1. @Autowired注解和@Resource注解的区别(四个维度来看)
1.1、来源不同
@Autowired 和 @Resource 来自不同的“父类”,其中 @Autowired 是Spring2.5 定义的注解,同时宣布支持@Resource ,而 @Resource 是 Java 定义的注解,它来自于 JSR-250(Java 250 规范提案)
1.2、依赖查找到顺序不同
(1)@Autowired注解(先类型再名称):
@Autowired 注解在査找要注入的 bean 时,首先会按照类型进行匹配。如果有多个匹配的 bean,就会根据名称进行匹配。Spring框架中的单例bean..具体来说,如果被注入的属性或构造函数参数的类型在容器中有且只有一个对应的 bean,那么 @Autowired 注解就会直接将该 bean 注入到该属性或构造函数参数中。
例如:
@Autowired
private UserService userService;
在这个例子中,如果容器中只有一个类型为 UserService 的 bean ,那么它就会被自动注入到userService 属性中。但是,如果容器中存在多个类型为 UserService 的 bean,就需要通过名称进行匹配。此时,可以在 @Autowired 注解中使用 @Qualifier 注解来指定要注入的bean的名称,如果不使用 @Qualifier 注解就会使用属性名。
例如:
@Autowired
@Qualifier("userService2")
private UserService userService;
在这个例子中,如果容器中有多个类型为 UserService 的 bean,那么它会根据@Qualifier 注解中指定的名称来匹配要注入的 bean。如果找到了名为userService2"的 bean,就会将它注入到 userService 属性中。
(2)@Resource注解(先名称再类型)
在Spring中,@Resource注解可以通过名称或者类型来注入bean,具体取决于@Resource注解的两个属性:name和type。如果@Resource注解中指定了name属性,Spring将会根据该名称来查找对应的bean,并将其注入到被注解的属性或者方法参数中。
例如:
@Resource(name = "myBean")
private MyBean myBean;
上述代码会根据名称"myBean"来查找对应的bean,并将其注入到myBean属性中。
如果@Resource注解没有指定那么属性,而是指定type属性,Spring将会根据该类型来查找对应的bean,并将其注入到被注解的属性或方法参数中。
例如:
@Resource(type = MyBean.class)
private MyBean myBean;
上述代码将会根据类型MyBean来查找对应的bean,并将其注入到myBean属性中。如果@Resource注解既没有指定name属性,也没有指定type属性,那么它会默认按照名称来查找对应的bean,并将其注入到被注解的属性或者方法参数中。
例如:
@Resource
private MyBean myBean;
上述代码将会默认按照名称“myBean”来查找对应的bean,并将其注入到myBean属性中。
1.3、支持的参数不同
@Autowired 和 @Resource 在使用时都可以设置参数,但二者支持的参数以及参数的个数完全不同,其中 @Autowired 只支持设置一个 required 的参数,而@Resource 支持7 个参数
1.4、依赖注入的用法支持不同
常见依赖性注入有一下三种实现:
- 属性注入
- 构造方法注入
- Setter注入
@Autowired支持属性注入,构造方法注入和Setter注入,而@Resource只支持属性注入和Setter注入