点击关注公众号,利用碎片时间学习
联系
-
@Autowired
和@Resource
注解都是作为bean对象注入的时候使用的 -
两者都可以声明在字段和setter方法上
注意:如果声明在字段上,那么就不需要再写setter方法。但是本质上,该对象还是作为set方法的实参,通过执行set方法注入,只是省略了setter方法罢了
区别
-
@Autowired
注解是Spring提供的,而@Resource
注解是J2EE本身提供的 -
@Autowird
注解默认通过byType方式注入,而@Resource
-
@Autowired
注解注入的对象需要在IOC容器中存在,否则需要加上属性required=false
,表示忽略当前要注入的bean,如果有直接注入,没有跳过,不会报错
对于byName和byType方式不太熟悉的可以看一下这里:
https://blog.csdn.net/tanga842428/article/details/54694484
简单来说,byName就是变量名去匹配bean的id属性,而byType则是变量类型去匹配bean的class属性
<bean id="userService" class="com.test.UserServiceImpl">
</bean>
@Autowired
private UserService userService;
此处byName就是拿变量名userService
去匹配IOC容器的iduserService
,匹配成功;而byType就是拿变量类型UserService去匹配IOC容器的idcom.test.UserService.UserServiceImpl
,因为UserServiceImpl
是UserService实现,所以也匹配成功
接下来再分别讲讲@Autowired
注解和@Resource
注解的使用
@Autowird注解的使用
步骤:
@Autowird
默认的注入方式为byType,也就是根据类型匹配,当有多个实现时,则通过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;
根据上面的步骤,可以很容易判断出,直接这么使用是会报错的
原因:首先通过byType注入,判断UserService
类型有两个实现,无法确定具体是哪一个,于是通过byName方式,这里的变量名userService也无法匹配IOC容器中id(此处指的userServiceImpl1
和userServiceImpl2
),于是报错。
注意:通过注解注入到IOC容器的id值默认是其类名首字母小写
解决方案
方式一:
// 方式一:改变变量名
@Autowired
private UserService userServiceImpl1;
方式二:
// 方式二:配合@Qualifier注解来显式指定name值
@Autowired
@Qualifier(value = "userServiceImpl1")
private UserService userService;
@Resource注解的使用
步骤:@Resource
默认通过byName注入,如果没有匹配则通过byType注入
举例:
@Service
public class UserServiceImpl1 implements UserService
@Service
public class UserServiceImpl2 implements UserService
@Resource
private UserService userService;
首先通过byName匹配,变量名userService无法匹配IOC容器中任何一个id(这里指的userServiceImpl1
和userServiceImpl2
),于是通过byType匹配,发现类型UserService的实现类有两个,仍然无法确定,于是报错。
同时@Resource
还有两个重要的属性:name和type,用来显式指定byName和byType方式注入
使用:对应4种情况
// 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;
-
既没指定name属性,也没指定type属性: 默认通过byName方式注入,如果byName匹配失败,则使用byType方式注入(也就是上面的那个例子) -
指定name属性: 通过byName方式注入,把变量名和IOC容器中的id去匹配,匹配失败则报错 -
指定type属性: 通过byType方式注入,在IOC容器中匹配对应的类型,如果匹配不到或者匹配到多个则报错 -
同时指定name属性和type属性: 在IOC容器中匹配,名字和类型同时匹配则成功,否则失败
感谢阅读,希望对你有所帮助 :)
来源:blog.csdn.net/qq_45590494/article/details/114444371
推荐:
PS:因为公众号平台更改了推送规则,如果不想错过内容,记得读完点一下“在看”,加个“星标”,这样每次新文章推送才会第一时间出现在你的订阅列表里。点“在看”支持我们吧!
原文始发于微信公众号(Java笔记虾):@Autowired和@Resource注解的区别和联系(十分详细,不看后悔)
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/61172.html