@Primary ,@Qualifier ,@Autowired ,@Resource作用与区别
首先阐述 @Autowired 和 @Resource 的区别
@Resource 是JDK自带的注解 可以按名称注入也可以按类型注入,默认是按名称注入,没有显式指定名称时,在spring容器中匹配与需要注入的bean属性名相同的bean,如果还不同,@Resource会找到一个主类型匹配而不是一个特定的命名bean
@Autowired 由spring 提供 ,默认按类型注入,也可结合@Qualifier() 实现按名称注入
需要注意的是 以@Bean方式注入对象时,@Resource 按名称注入,是按声明的方法名注入的
@Autowired 结合 @Qualifier() 实现按名称注入时,是按@Qualifier() 定义的名称注入的
@Primary 当需要注入多个同类型的bean时,选择其中一个为优先注入对象,并且同类型对象只能选择一个,超过一个时则启动报错,提示信息就是你选择了多个bean为优先注入对象
@Qualifier() 你可以为每个注入的bean起个不同的名字,结合@Autowired 实现按名称注入
示例:
@Autowired 结合 @Qualifier() 实现按名称注入
首先定义一个需要注入的对象
import lombok.Builder;
import lombok.Data;
@Data
@Builder
public class UserInfo {
private String username;
private String password;
}
然后定义一个config类,注入两个UserInfo,利用 @Qualifier() 声明两个不同的bean
import com.example.demo.entities.UserInfo;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class UserInfoConfig {
@Bean
@Qualifier("zhangsan")
public UserInfo userInfo() {
UserInfo userInfo = UserInfo.builder().username("zhangsan").password("123456").build();
return userInfo;
}
@Bean
@Qualifier("lisi")
public UserInfo userInfo1() {
UserInfo userInfo = UserInfo.builder().username("lisi").password("123456").build();
return userInfo;
}
}
controller 层注入 zhangsan这个对象
@RequestMapping("/user")
@RestController
public class UserController {
@Autowired
@Qualifier("zhangsan")
private UserInfo userInfo;
@GetMapping("/getUserInfo")
public UserInfo getUserInfo() {
return userInfo;
}
}
返回结果为
{
"username": "zhangsan",
"password": "123456"
}
我们再注入lisi这个对象
@RequestMapping("/user")
@RestController
public class UserController {
@Autowired
@Qualifier("lisi")
private UserInfo userInfo;
@GetMapping("/getUserInfo")
public UserInfo getUserInfo() {
return userInfo;
}
}
返回结果
{
"username": "lisi",
"password": "123456"
}
接下来,我们测一下@Primary 看是否实现优先注入,修改config类
@Configuration
public class UserInfoConfig {
@Bean
@Primary
public UserInfo userInfo() {
UserInfo userInfo = UserInfo.builder().username("zhangsan").password("123456").build();
return userInfo;
}
@Bean
public UserInfo userInfo1() {
UserInfo userInfo = UserInfo.builder().username("lisi").password("123456").build();
return userInfo;
}
}
controller 层 直接用 @Autowired 注入
@RequestMapping("/user")
@RestController
public class UserController {
@Autowired
private UserInfo userInfo;
@GetMapping("/getUserInfo")
public UserInfo getUserInfo() {
return userInfo;
}
}
返回结果,没毛病
{
"username": "zhangsan",
"password": "123456"
}
我们再验证 lisi这个对象
@Configuration
public class UserInfoConfig {
@Bean
public UserInfo userInfo() {
UserInfo userInfo = UserInfo.builder().username("zhangsan").password("123456").build();
return userInfo;
}
@Bean
@Primary
public UserInfo userInfo1() {
UserInfo userInfo = UserInfo.builder().username("lisi").password("123456").build();
return userInfo;
}
}
返回结果,没得毛病
{
"username": "lisi",
"password": "123456"
}
接下来我们再测,@Resource 的按名称注入,看是否是按定义的方法名注入的
config类
@Configuration
public class UserInfoConfig {
@Bean
public UserInfo userInfo() {
UserInfo userInfo = UserInfo.builder().username("zhangsan").password("123456").build();
return userInfo;
}
@Bean
public UserInfo userInfo1() {
UserInfo userInfo = UserInfo.builder().username("lisi").password("123456").build();
return userInfo;
}
}
controller 层
@RequestMapping("/user")
@RestController
public class UserController {
@Resource(name = "userInfo")
private UserInfo userInfo;
@GetMapping("/getUserInfo")
public UserInfo getUserInfo() {
return userInfo;
}
}
返回结果
{
"username": "zhangsan",
"password": "123456"
}
修改@Resource(name = “userInfo1”) 注入第二个方法名
返回结果,没毛病哈
{
"username": "lisi",
"password": "123456"
}
@Primary ,@Qualifier ,@Autowired ,@Resource作用与区别的更多相关文章
- Wiring in Spring: @Autowired, @Resource and @Inject 区别
refer:https://www.baeldung.com/spring-annotations-resource-inject-autowire 主要是查找顺序不一致: @Resource Mat ...
- @Autowired @Resource @Qualifier的区别
参考博文: http://www.cnblogs.com/happyyang/articles/3553687.html http://blog.csdn.net/revent/article/det ...
- @Autowired & @Resource 区别 & 解读@Bean
一样 Autowired & @Resource 都可以用来Bean的注入,可以写在属性(字段)上.也可以写在setter方法上 不一样 1.来源不一样 @Autowired 由Spr ...
- Spring注解之@Autowired、@Qualifier、@Resource、@Value
前言 @Autowired.@Qualifier.@Resource.@Value四个注解都是用于注入数据的,他们的作用就和在xml配置文件中的bean标签中写一个标签的作用是一样的!本篇中特别要讲解 ...
- 注解,@Qualifier+@Autowired 和 @Resource
摘要: 项目中,对于AOP的使用,就是通过用注解来注入的. 更改之前的注解,是使用:@Qualifier+@Autowired 但是,通过这样注解,在项目启动阶段,需要自动扫描的过程是非常缓慢的, ...
- Spring中@Autowired注解、@Resource注解的区别 (zz)
Spring中@Autowired注解.@Resource注解的区别 Spring不但支持自己定义的@Autowired注解,还支持几个由JSR-250规范定义的注解,它们分别是@Resource.@ ...
- Spring 注释标签@Resource @Autowired 和@Inject的区别
一些spring的开发人员在使用这三个标签进行注入的时候感到困惑.我来尝试解释一下这三个注解的主要区别.事实上,这三者非常相似,只存在一些微小的差别.在稍后的文章中会进行解释. @Resource-在 ...
- @Autowired注解与@Resource注解的区别(详细)
相信对现在Java码农来说,@Autowired跟@Resource并不陌生,二者都可以自动注入,但是两者的区别很多时候并没有被注意到. 一.注解的出处 @Autowired是Spring提供的注解, ...
- Spring通过注解@Autowired/@Resource获取bean实例时为什么可以直接获取接口而不是注入的类
问: 这个问题困扰了我好久,一直疑问这个接口的bean是怎么注入进去的?因为只看到使用@Service注入了实现类serviceImpl,使用时怎么却获取的接口,而且还能调用到实现类的方法,难道这个接 ...
- IOC @Autowired/@Resource/@Qulified的用法实例
首先要知道另一个东西,default-autowire,它是在xml文件中进行配置的,可以设置为byName.byType.constructor和autodetect:比如byName,不用显式的在 ...
随机推荐
- 如何实现对ELK各组件的监控?试试Metricbeat
一.前言 开发排查系统问题用得最多的手段就是查看系统日志,ELK 是 Elastic 公司开源的实时日志处理与分析解决方案,已经为日志处理方案的主流选择. 而在生产环境中,如何针对 ELK 进行监控, ...
- git篇-- Git在项目实操中常见的使用命令--02
Git是现代软件开发中不可或缺的版本控制工具.它能帮助开发者跟踪项目的所有变更,并与团队成员高效协作.本文将介绍一些在项目实操中常见的Git命令,帮助你更好地管理代码. 1. 初始化和配置 初始化仓库 ...
- 机器学习:详解是否要使用端到端的深度学习?(Whether to use end-to-end learning?)
详解是否要使用端到端的深度学习? 假设正在搭建一个机器学习系统,要决定是否使用端对端方法,来看看端到端深度学习的一些优缺点,这样就可以根据一些准则,判断的应用程序是否有希望使用端到端方法. 这里是应用 ...
- Springboot实现HTML表单from简单的接收信息
HTML< from >元素 from可向Web服务器提交请求 普遍格式: <from action="服务器地址" method="请求方式" ...
- 何时使用交叉熵,何时使用KL散度:计算分布差距为啥使用KL散度而不用交叉熵,计算预测差距时为啥使用交叉熵而不用KL散度
问题: 何时使用交叉熵,何时使用KL散度? 计算分布差距为啥使用KL散度而不用交叉熵,计算预测差距时为啥使用交叉熵而不用KL散度 问题很大,答案却很简单. 答案: 熵是一种量度,是信息不确定性的量度: ...
- Python Pillow(PIL 第三方模块)和 cv2 (opencv第三方模块)对图片的 resize 操作 (缩放图片大小)
PIL 模块的 resize 操作: 1. 从文件中读取图片,然后 resize 大小: import matplotlib.pyplot as plt import numpy as np ...
- Navicat 导入sql文件执行失败问题的处理
之前有很多次用Navicat执行导出的sql文件,跑着跑着就批量报错,有的报错能看懂,有的报错压根就找不到,很长的记录中翻也不好翻. 现在用命令行执行的话,还是挺好使. 1进入mysql安装路径下的b ...
- 控制台报IPV6问题的解决
IPv6问题调试 Burp Suite是不支持IPv6地址进行数据通信的,这时在cmd控制台里就会抛出如下异常 java.net.SocketException: Permission denied ...
- 23 暑假友谊赛 No.4(UKIEPC 2017)
23 暑假友谊赛 No.4(UKIEPC 2017) Problem A Alien Sunset hh,开始一眼差分,但是写寄了qwq,后来换枚举过了(Orz,但是看学长差分是能做的,我就说嘛,差分 ...
- 安卓如何设置开机启动某个程序?init.rc给你搞定
一.如何设置开机启动某个程序? 1.需求描述 最近有个项目需要在Android开机启动之后,自动执行一个C语言编写的程序:pengd 该程序运行时需要修改网络ip地址及其他网络操作,所以需要root权 ...