Spring中的@Autowired,@Qualifier和@Primary注解
目录
- 1. `@Autowired` 注解
- 1.1. `@Autowired` 注解的使用
- 1.1.1. 类成员变量上(较为常用)
- 1.1.2. 用在方法上
- 1.1.3. 用在构造器上
- 1.1.4. 用在参数上
- 1.2. `@Autowired` 注解的说明
- 2. `@Autowired` 配合 `@Qualifier`
- 3. `@Autowired` 配合 `@Primary`
1. @Autowired
注解
1.1. @Autowired
注解的使用
@Autowired
注解,可以对类成员变量、方法和构造函数进行标注,完成自动装配的工作
1.1.1. 类成员变量上(较为常用)
@Controller
public class SoakController {@Autowiredprivate SoakService soakService;
}
1.1.2. 用在方法上
@Controller
public class SoakController {private SoakService soakService;@Autowired public void setSoakService(SoakService soakService) {this.soakService = soakService;}
}
1.1.3. 用在构造器上
@Controller
public class SoakController {private SoakService soakService;@Autowired public SoakController(SoakService soakService) {this.soakService = soakService;}
}
1.1.4. 用在参数上
@Controller
public class SoakController extends BaseController {private SoakService soakService;public SoakController(@Autowired SoakService soakService) {this.soakService = soakService;}
}
1.2. @Autowired
注解的说明
- 默认优先按照
byType
去容器中找对应的组件,找到就赋值 - 如果找到多个相同类型的组件,再通过
byName
来到IOC
容器中进行查找 - 默认情况下,它具有强制契约特性,其所标注的属性必须是可装配的。如果没有
bean
可以装配到@Autowired
所标注的属性或参数中,那么你会看到org.springframework.beans.factory.NoSuchBeanDefinitionException
的异常信息
2. @Autowired
配合 @Qualifier
@Autowired
是默认根据byType
进行自动装配的,如果需要按byName
进行装配,则需要配合@Qualifier
注解使用- 如果容器中存在多个相同类型的组件,此时需要通过
byName
来进行装配,则需要配合@Qualifier
注解使用
组件 1
@Service
public class BookService {// 类型为 BookService,name 为 bookService}
组件 2
@Configuration
public class MainConfigOfAutowired {// 类型为 BookService,name 为 bookService01@Beanpublic BookService bookService01() {return new BookService();}
}
测试
@Autowired
@Qualifier("bookService01")
private BookService bookService;@Test
public void MyTest() {System.out.println(bookService);
}
由于容器中存在 bookService01
和 bookService
两个类型相同的组件 bean
,那么此时可以使用 @Qualifier(“bookService01”)
明确指定 bean
的 name
后,@Autowired
不再根据 byType
自动装配了,而用 bookService01
作为组件的 name
去容器中查找,找到组件 2
,装配成功
3. @Autowired
配合 @Primary
Spring
在进行自动装配的时候,会 优先 使用用@Primary
标注指定的bean
- 如果容器中有多个组件
Type
类型相同,注入的bean
的Name
名称也相同,那么此时就可以使用@Primary
注解,将某一个组件 优先 注入 - 不能把多个
bean
都标注为@Primary
,不然你会得到NoUniqueBeanDefinitionException
这个异常
组件 1
@Service
public class BookService { // 类型为 BookService,name 为 bookService}
组件 2
@Configuration
public class MainConfigOfAutowired {// 类型为 BookService,name 为 bookService01@Primary@Beanpublic BookService bookService01() {return new BookService();}
}
测试 1
@Autowired
private BookService bookService;@Test
public void MyTest() {System.out.println(bookService);
}
因为组件 2
使用了 @Primary
注解标注,所以 @Autowired
会优先使用 name
为 bookService01
进行装配
测试 2
@Qualifier("bookService")
@Autowired
private BookService bookService;@Test
public void MyTest() {System.out.println(bookService);
}
虽然组件 2
使用了 @Primary
注解标注,但是 @Qualifier
比 @Primary
的优先级要高,所以使用注解 @Qualifier
标注指定后, @Primary
就不起作用了,所以还是直接用指定的 bookService
作为组件的 name
去容器中装配
Spring中的@Autowired,@Qualifier和@Primary注解相关推荐
- 关于Spring中的context:annotation-config/配置(开启注解)
转自:https://www.cnblogs.com/doudouxiaoye/p/5681518.html 当我们需要使用BeanPostProcessor时,直接在Spring配置文件中定义这些B ...
- Spring中的scope配置和@scope注解
Scope,也称作用域,在 Spring IoC 容器是指其创建的 Bean 对象相对于其他 Bean 对象的请求可见范围.在 Spring IoC 容器中具有以下几种作用域:基本作用域(single ...
- @autowired注解_品Spring:对@Autowired和@Value注解的处理方法(文末附spring系列资源合集)...
作者:编程新说李新杰 出自:微信公众号"编程新说" 原文:品Spring:对@Autowired和@Value注解的处理方法 在Spring中能够完成依赖注入的注解有JavaSE提 ...
- spring中<tx:annotation-driven>标签转为注解@EnableTransactionManagement
spring中涉及事务的内容使用注解开发时,需开启事务的注解驱动 <?xml version="1.0" encoding="UTF-8"?> &l ...
- Sprint Boot————@Qualifier、@Primary
引言 使用@Autowired自动注入时: 如果注入的接口有多个实现类,如下所示: 那么如果不指定具体是哪个实现类的Bean,在Spring Boot启动时就会发生异常(下图请点击查看): 异常的描述 ...
- Spring高手之路2——深入理解注解驱动配置与XML配置的融合与区别
文章目录 1. 配置类的编写与Bean的注册 2. 注解驱动IOC的依赖注入与XML依赖注入对比 3. Spring中组件的概念 4. 组件注册 5. 组件扫描 5.1 使用@ComponentSca ...
- spring中使用Aspectj进行切面编程
推荐 个网购 优惠券 领取网站 U券网 uquanfree.com 点击链接进入 Spring的AOP可以通过对@AspectJ注解的支持和在XML中配置来实现,本文通过实例简述如何在Spring中使 ...
- 【Spring注解驱动开发】使用@Autowired@Qualifier@Primary三大注解自动装配组件,你会了吗?
写在前面 [Spring专题]停更一个多月,期间在更新其他专题的内容,不少小伙伴纷纷留言说:冰河,你[Spring专题]是不是停更了啊!其实并没有停更,只是中途有很多小伙伴留言说急需学习一些知识技能, ...
- Spring中@Primary注解
1.概述 讨论Spring的@Primary注解,该注解是框架在3.0版中引入的. 其作用与功能,当有多个相同类型的bean时,使用@Primary来赋予bean更高的优先级. 2.为什么需要@Pri ...
- Spring 注解 @Qualifier和@Primary 详细解析
1. 概述 今天带你了解一下 Spring 框架中的 @Qualifier 注解,它解决了哪些问题,以及如何使用它.我们还将了解它与 @Primary 注解的不同之处. 2. 痛点 使用 @Autow ...
最新文章
- pup 流程控制语句(下)
- 重新定义智能平板电脑 第四范式与联想达成战略合作
- OpenCASCADE:拓扑 API之3D模型Defeaturing
- django.core.exceptions.ImproperlyConfiguredmysqlclient 1.3.13 ornewer is required you have 0.9.2(亲测)
- 这届产品经理也太太太太难了吧!
- pythonwx功能_python中wx模块的具体使用方法
- static 静态局部变量
- java stream collect_java流stream中的collect()方法详解
- linux主机慢的原因,51CTO博客-专业IT技术博客创作平台-技术成就梦想
- 关于防止表单form重复提交的方式
- linux 基础——常见命令及问题
- 网络工程师的机会在哪里
- Python部署虚拟环境的利器——Virtualenv
- mac安装mysql出错_Mac 安装MySQL过程遇到的问题
- Type-C PD充电简介
- ssl证书过期怎么解决?
- Ubuntu 20.04系统中Sage(sagemath)安装及使用详细过程
- java抠图人物背景图片_如何进行人物抠图?让你快速完成复杂背景人像的在线抠图...
- 用户名+密码控制+php文件存储
- k8s创建用户账号——User Account
热门文章
- 经典CNN之:VGGNet
- 使用 ssh-keygen访问服务器
- 算法:罗马数字转换为整数13. Roman to Integer
- React Native之原理浅析, iOS原理分析与实践解析、Android原理分析与实践解析
- 查看iOS App的bundleId
- android iptables清空,android中的iptables错误:iptables-save和iptables-restore无法正常工作...
- 字符流中第一个只出现一次的字符
- 实现atoi函数(C++实现)
- matplotlib绘制横向柱状图
- 【生信进阶练习1000days】day14-GenomicDataCommons(GDC)