@Autowired、@Resource、@Qualifier区别
@Autowired
1、属于spring的注解,如果不想和Spring耦合的太紧,就不推荐使用。
2、默认情况下,要求依赖对象必须存在,不能为null。如果允许为空,那么设置属性值required为false。
3、默认按照类型装配(byType)。到底什么是类型装配,看下边的例子:
情形1:
public interface UserService {
}
@Service
public class UserServiceImpl implements UserService {
}
@Service
public class UserServiceImpl2 implements UserService {
}
@SpringBootTest
@RunWith(SpringRunner.class)
public class Test {
@Autowired
private UserService userService;
}
分析:在上边的测试类中使用@Autowired注入时,编辑器会报错:
Could not autowire. There is more than one bean of 'UserService' type.
Beans:
userServiceImpl (UserServiceImpl.java)
userServiceImpl2 (UserServiceImpl2.java)
原因是,@Autowired是默认按照类型注入的,它就告诉代码,我就需要一个UserService类型的类就行,但是代
码却有两个UserService类型的类。这时,@Autowired还可以按照名称(userService)注入,但是也没有满足的bean,就报错了。
情形2:
public interface UserService {
}
@Service("userService")
public class UserServiceImpl implements UserService {
}
@Service
public class UserServiceImpl2 implements UserService {
}
@SpringBootTest
@RunWith(SpringRunner.class)
public class Test {
@Autowired
private UserService userService;
@org.junit.Test
public void test1(){
System.out.println(userService);
}
}
打印:
demo.springboot.Service.UserServiceImpl@47b11ec7
分析:这时@Autowired是按照名称注入的。
情形3:
public interface UserService {
}
@Service("myUserService")
public class UserServiceImpl implements UserService {
}
@Service
public class UserServiceImpl2 implements UserService {
}
@SpringBootTest
@RunWith(SpringRunner.class)
public class Test {
@Autowired
@Qualifier("myUserService")
private UserService userService;
@org.junit.Test
public void test1(){
System.out.println(userService);
}
}
打印:
demo.springboot.Service.UserServiceImpl@47b11ec7
分析:这时如果UserServiceImpl有个别名”myUserService“,那么@Autowired需要和 @Qualifier配合使用,然后根据@Qualifier中的属性值,按照名称注入。
情形4:
public interface UserService {
}
@Service
public class UserServiceImpl implements UserService {
}
@Service
@Primary
public class UserServiceImpl2 implements UserService {
}
@SpringBootTest
@RunWith(SpringRunner.class)
public class Test {
@Autowired
private UserService userService;
@org.junit.Test
public void test1(){
System.out.println(userService);
}
}
打印:
demo.springboot.Service.UserServiceImpl2@6a756082
分析:如果在UserServiceImpl或者UserServiceImpl2上加上@Primary,就有了一个优先的顺序,就会注入加了@Primary注解的类
@Resource
1、属于J2EE JSR250规范的实现。所以建议使用@Resource注解,以减少代码和Spring之间的耦合。
2、默认按照名称装配(byName),什么是安装名称装配,看下面的例子:
情形1:
public interface UserService {
}
@Service
public class UserServiceImpl implements UserService {
}
@Service
public class UserServiceImpl2 implements UserService {
}
@SpringBootTest
@RunWith(SpringRunner.class)
public class Test {
@Resource
private UserService userService;
@org.junit.Test
public void test1() {
System.out.println(userService);
}
}
分析:执行代码会报错:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'demo.springboot.Test': Injection of resource dependencies failed; nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'demo.springboot.Service.iface.UserService' available: expected single matching bean but found 2: userServiceImpl,userServiceImpl2
这个报错很明显,虽然编译器在起初没有报错,但是由于@Resource是默认按照名称注入的,@Resource想要一个bean的name是userService的,但是却没有,UserServiceImpl和UserServiceImpl2的beanName默认为类名小写。所以这时匹配不上名称,就会按照类型注入,但是却发现两个类型UserService的类,所以报错了(expected single matching bean but found 2)。
情形2:
public interface UserService {
}
@Service("userService")
public class UserServiceImpl implements UserService {
}
@Service
public class UserServiceImpl2 implements UserService {
}
@SpringBootTest
@RunWith(SpringRunner.class)
public class Test {
@Resource
private UserService userService;
@org.junit.Test
public void test1() {
System.out.println(userService);
}
}
打印:
demo.springboot.Service.UserServiceImpl@727320fa
分析:给UserServiceImpl的beanName写为userService,这时@Resource按照name注入了。
情形3:
public interface UserService {
}
@Service
@Primary
public class UserServiceImpl implements UserService {
}
@Service
public class UserServiceImpl2 implements UserService {
}
@SpringBootTest
@RunWith(SpringRunner.class)
public class Test {
@Resource
private UserService userService;
@org.junit.Test
public void test1() {
System.out.println(userService);
}
}
打印:
demo.springboot.Service.UserServiceImpl@44784e2f
分析:加了@Primary,@Resource就可以按照类型注入了。
@Qualifier
1、在给字段注入时,不能独立使用,必须和@Autowired配合使用。
2、给方法参数注入时,可以独立使用。
@Autowired、@Resource、@Qualifier区别的更多相关文章
- @Resource、@Autowired、@Qualifier 区别(表格显示)
@Resource.@Autowired.@Qualifier 区别(表格显示) 区别项 @Resource @Autowired @Qualifier 谁提供的 jdk提供,包是javax.anno ...
- @Autowired @Resource @Qualifier的区别
参考博文: http://www.cnblogs.com/happyyang/articles/3553687.html http://blog.csdn.net/revent/article/det ...
- Spring @Resource、@Autowired、@Qualifier区别
@Resource默认是按照名称来装配注入的,只有当找不到与名称匹配的bean才会按照类型来装配注入: @Autowired默认是按照类型装配注入的,如果想按照名称来转配注入,则需要结合@Qualif ...
- @Autowired,@Resource,@Qualifier,@Primary,@Inject的作用和区别
@Autowired注解的用法:可以用于构造器,方法,参数,字段进行属性注入,有一个required属性,默认是true,当改成false时,如果注入的属性在容器中不存在也不会报错@Resource该 ...
- @Autowired 与@Resource的区别(详细)
参考:@Autowired 与@Resource的区别(详细) spring不但支持自己定义的@Autowired注解,还支持几个由JSR-250规范定义的注解,它们分别是@Resource.@Pos ...
- @Autowired 与@Resource的区别详解
spring不但支持自己定义的@Autowired注解,还支持几个由JSR-250规范定义的注解,它们分别是@Resource.@PostConstruct以及@PreDestroy. @Resour ...
- 关于Spring注解@Component、@Repository、@Service、@Controller @Resource、@Autowired、@Qualifier 解析
1.Spring 2.5 中除了提供 @Component 注释外,还定义了几个拥有特殊语义的注释,它们分别是:@Repository.@Service和 @Controller 其实这三个跟@Com ...
- java @Autowired与@Resource的区别
@Autowired与@Resource的区别 1.@Autowired与@Resource都可以用来装配bean. 都可以写在字段上,或写在setter方法上. 2.@Autowired默认 ...
- Spring 注释 @Autowired 和@Resource 的区别
Spring 注释 @Autowired 和@Resource 的区别 一. @Autowired和@Resource都可以用来装配bean,都可以写在字段上,或者方法上. 二. @Autowired ...
- @Autowired & @Resource 区别 & 解读@Bean
一样 Autowired & @Resource 都可以用来Bean的注入,可以写在属性(字段)上.也可以写在setter方法上 不一样 1.来源不一样 @Autowired 由Spr ...
随机推荐
- DaSiamRPN学习
9月14日,2018年视觉目标跟踪挑战赛(Visual-Object-Tracking Challenge 2018)的结果在ECCV Workshop上揭晓.VOT2018共设三项任务:Baseli ...
- React+wangeditor+node富文本处理带图片上传
最近有个需求出现在我的视野中,因为我的另外的博客需要上传文章,但是我不想每次都在我的数据库中慢慢的修改格式,所以我另做了一个后台去编辑文本后发送给服务器,那么这里就涉及到两点,一个是富文本,一个是需要 ...
- Linux系统资料
Linux的心得: 1)Linux由众多微内核组成,其源代码完全开源: 2)Linux继承了Unix的特性,具有非常强大的网络功能,其支持所有的因特网协议,包括TCP/IPv4. TCP/IPv6和链 ...
- Vim 安装和配置、优化
Vim 介绍 Vim 官网:http://www.vim.org/ Vim 安装 CentOS:sudo yum install -y vim Ubuntu:sudo apt-get install ...
- centos7利用系统镜像修复grub
1 故障描述 由于错误操作,导致grub配置文件失效,系统开机后一直卡在下面的画面. 2 解决办法 这时候,就要利用系统镜像光盘,进入修复模式,然后按下面图示操作 进入镜像的shell环境,如下图所示 ...
- ZYNQ入门实例——三种GPIO应用、中断系统及软硬件交叉触发调试
一.前言 Xlinx的ZYNQ系列SOC集成了APU.各种专用外设资源和传统的FPGA逻辑,为ARM+FPGA的应用提供助力,降低功耗和硬件设计难度的同时极大提高两者间传输的带宽.之前在研究生课题中使 ...
- Lambda如何实现条件去重distinct List,如何实现条件分组groupBy List
条件去重 我们知道, Java8 lambda自带的去重为 distinct 方法, 但是只能过滤整体对象, 不能实现对象里的某个值进行判定去重, 比如: List<Integer> nu ...
- codewars--js--Number of trailing zeros of N!
问题描述: Write a program that will calculate the number of trailing zeros in a factorial of a given num ...
- 想学大学计算机课?这 37 门 CS 专业必修课,了解一下
最近,不少高校延迟开学,大家只能宅家上网课. 有一些朋友,想趁此期间,多学点计算机的专业课,却不知从何学起. 211,985大学的计算机专业课都是经过授课教师精心安排的,从大一到大四,课程合理设置,循 ...
- SAP 如何看某个TR是否传入了Q或者P系统?
SAP 如何看某个TR是否传入了Q或者P系统? 两种方式可以查询. 1)进入Q系统或者P系统.SE16,看表TPALOG, 输入请求号码, 执行,看记录里的字段TPSTAT_KEY是否为空,如果不为空 ...