@Resource和@Autowired两个注解的区别及说明
作者:有WiFi就好说
回答
首先这@Resource @Autowired这两个注解都是Spring生态里去实现Bean的依赖注入(在springmvc项目和springboot项目中都可以使用)
下面我在说一下这个注解的区别
1.@Autowired
@Autowired是Spring里面提供的一个注解,它默认是根据类型来实现Bean的依赖注入;
@Autowired里面有一个required属性,默认值是true 表示强制要求bean实例的一个注入,在应用启动的时候,如果IOC容器中不存在对应类型的bean,那么启动就会报错;如果我们不希望实现依赖注入就可以把这个属性设置为false
其次如果Spring IOC容器中存在多个相同类型的bean实例,但是由于@Autowired是根据类型去进行注入的,所以Spring启动的时候就会提示一个错误,就是原本只能注入一个单实例Bean,但是现在Ioc容器存在多个,导致注入失败;针对这个问题,可以使用@Primary @Qualifier这两个注解来解决;
@Primary表示主要的Bean,当存在多个相同类型的Bean的时候,会优先使用声明了@Primary注解的一个Bean
@Qualifier 相当于条件筛选,可以根据Bean的名字可以去找到需要装配的目标Bean
2.@Resource
接下来我再解释一下@Resource这个注解,@Resource是JDK中提供的一个注解,只不过Spring在实现上提供了这个注解的一个功能支持,它的使用方式和@Autowired类似,
最大的区别就是@Resource可以支持ByName 和 ByType两种注入方式;
- 如果使用name属性,spring会根据bean的名字来进行依赖注入;
- 如果使用type属性,spring会根据bean的类型来进行依赖注入,如果两个属性都没有进行设置,@Resource默认是根据定义的属性名字去容器中进行匹配,如果没有匹配成功,再根据类型来匹配;
- 如果两个都没有匹配到就会报错
总结
1.来源不同
@Autowired 是Spring提供的一个注解,@Resource是JSR 250规范里定义的一个注解,只不过Spring对JSR 250提供了支持
2.依赖查找顺序不同
- @Autowired 先根据类型(bytype)查找 如果存在多个Bean,再根据属性名字(byName)进行查找
- @Resource 先根据名字(byName)查找,如果根据名称查不到 再根据类型(bytype)查找
@Autowired默认是根据类型来进行匹配的,如果容器中存在多个类型相同的实例就会报错,此时可以通过配合@Primary或@Qualifier注解来实现根据名字进行装配
- @Resource 既可以根据名字匹配(byName),也可以根据属性匹配(byType);
- 因为@Resourc两个属性name type,当配置了name指定时,就会根据名字匹配;
- 使用了type指定就会根据类型匹配;
- 如果两个属性都没有设置,默认就是根据定义的属性名字去容器中进行匹配的,如果 没有匹配成功在进行类型匹配,都没有成功就会报错。
3.支持的参数不同
@Resource支持7个参数 最常用的就是name type
@Autowired 只支持一个参数 required
4.依赖注入的支持不同
@Autowired 支持构造方法注入,属性注入,Setter方法注入
@Resource 只支持属性注入,Setter方法注入 不支持构造方法注入
5.编译器IDEA的提示不同
当注入Mapper对象时,使用@Autowired注解 编译器会报错,而是用@Resource注解则不会提示错误
注入方式实例
1.属性注入
@RestController public class UserController { // 属性注入 @Autowired private UserService userService; @RequestMapping("/add") public UserInfo add(String username, String password) { return userService.add(username, password); } }
2.setter方法注入
@RestController public class UserController { // Setter 注入 private UserService userService; @Autowired public void setUserService(UserService userService) { this.userService = userService; } @RequestMapping("/add") public UserInfo add(String username, String password) { return userService.add(username, password); } }
3.构造方法注入
@RestController public class UserController { // 构造方法注入 private UserService userService; @Autowired public UserController(UserService userService) { this.userService = userService; } @RequestMapping("/add") public UserInfo add(String username, String password) { return userService.add(username, password); } }
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。