• 首页

  • 归档

  • 标签

  • 分类

  • 友链
M S B l o g
M S B l o g

ms

获取中...

08
08
java
总结
spring boot

@Autowired与@Resource的区别

发表于 2021-08-08 • java 总结 springboot 框架 • 被 4,754 人看爆

区别:

  1. @Autowired注解是Spring提供的,而@Resource注解是J2EE本身提供的
  2. @Autowired注解默认通过byType方式注入,而@Resource注解默认通过byName方式注入
  3. @Autowired注解注入的对象需要在IOC容器中存在,否则需要加上属性required=false,表示忽略当前要注入的bean

byName就是变量名去匹配bean的id属性,而byType则是变量类型去匹配bean的class属性

@Autowired:

@Autowired默认注入方式是byType,也就是根据类型匹配,当有多个实现时,则通过byName注入,也可以通过byName注入,也可以通过配合@Qualifier注解来显示指定name值,指明要使用哪个具体的实现类

例如:
首先有一个接口UserService和两个实现类UserServiceImpl1和UserServiceImpl2,并且这两个实现类已经加入到Spring的IOC容器中了

@Service
public class UserServiceImpl1 implements UserService

@Service
public class UserServiceImpl2 implements UserService

通过@Autowired注入使用

@Autowired
private UserService userService;

这时直接使用会报错,@Autowired会通过byTpye注入,判断UserService类型有两个实现,无法确定具体是哪一个,于是通过byName方式注入,而变量名userService也无法匹配IOC容器中id(UserServiceImpl1和UserServiceImp2),所以就报错了

解决方法:
方法一:

// 方式一:改变变量名
@Autowired
private UserService userServiceImpl1;

方法二:

// 方式二:配合@Qualifier注解来显式指定name值
@Autowired
@Qualifier(value = "userServiceImpl1")
private UserService userService;

@Resource

@Resource默认通过byName注入,如果没有匹配则通过byType注入,@Resource有两个重要的属性:name和type,用来显示指定byName和byType方式注入

例如:

@Service
public class UserServiceImpl1 implements UserService

@Service
public class UserServiceImpl2 implements UserService

通过@Autowired注入使用

@Autowired
private UserService userService;

@Resource通过byName匹配,变量名userService无法匹配ICO容器中任何一个id,于是通过byType匹配,发现类型为userService的实现类有两个,无法确定所以报错

使用:

// 1. 默认方式:byName
@Resource  
private UserService userDao; 

// 2. 指定byName
@Resource(name="userService")  
private UserService userService; 

// 3. 指定byType
@Resource(type=UserService.class)  
private UserService userService; 

// 4. 指定byName和byType
@Resource(name="userService",type=UserService.class)  
private UserService userService; 
  1. 既没指定name属性,也没指定type属性:默认通过byName方式注入,如果byName匹配失败,则使用byType方式注入(也就是上面的那个例子)
  2. 指定name属性:通过byName方式注入,把变量名和IOC容器中的id去匹配,匹配失败则报错
  3. 指定type属性:通过byType方式注入,在IOC容器中匹配对应的类型,如果匹配不到或者匹配到多个则报错
  4. 同时指定name属性和type属性:在IOC容器中匹配,名字和类型同时匹配则成功,否则失败
分享到:
打包jar运行出现invalid END header (bad central directory offset)
spring cloud中OpenFeign整合Sentinel启动报错
  • 文章目录
  • 站点概览
ms

MSms

⚓️HelloWorld⚓️

QQ Email RSS
看爆 Top5
  • MyBatis-Plus分页查询 5,936次看爆
  • @Autowired与@Resource的区别 4,755次看爆
  • feign远程调用及异步调用丢失请求头问题 4,526次看爆
  • spring cloud中OpenFeign整合Sentinel启动报错 4,423次看爆
  • Certbot查看证书过期时间,手动续期以及自动续期 3,302次看爆

Copyright © 2025 ms · 湘ICP备20015239号

Proudly published with Halo · Theme by fyang · 站点地图