@Autowired,@Resource,@Qualifier,@Primary,@Inject的作用和区别
@Autowired注解的用法:可以用于构造器,方法,参数,字段进行属性注入,有一个required属性,默认是true,当改成false时,如果注入的属性在容器中不存在也不会报错
@Resource该注解来源于javax包,有个属性name可以指定注入哪一个bean,当容器中某个类存在2个bean时,该注解就非常有用了,但没有required属性
@Qualifier和@Autowired搭配使用,可以实现@Resource指定注入某个bean的功能,当某个类存在2个bean时,这样也是一种解决方案
@Primary 代表优先使用某个类,例如UserDAO向spring注入2个bean,dao1,和dao2;如果注入dao1时加了@Primary 注解,则,其他类注入UserDAO会优先注入dao1
@Inject 作用跟@Autowired相同,但他没有required属性,并且需要依赖第三方包
<dependency>
<groupId>javax.inject</groupId>
<artifactId>javax.inject</artifactId>
<version>1</version>
</dependency>
好处是,应用不依赖spring
public class UserDAO {
private String id="1";
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
@Configuration
@Import({UserService.class})
public class AppConfigurate {
@Bean("userDAO1")
public UserDAO userDAO(){
UserDAO userDAO = new UserDAO();
userDAO.setId("userDAO1");
return userDAO;
}
@Bean("userDAO2")
public UserDAO userDAO2(){
UserDAO userDAO = new UserDAO();
userDAO.setId("userDAO2");
return userDAO;
}
}
public class UserService {
@Autowired
private UserDAO userDAO;
public void sayHi(){
System.out.println(userDAO.getId());
}
}
public class APP {
public static void main(String[] args) {
ApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfigurate.class);
UserService userService =(UserService) ctx.getBean("com.yang.xiao.config.UserService");
userService.sayHi();
String[] beanDefinitionNames = ctx.getBeanDefinitionNames();
for (String definitionName : beanDefinitionNames) {
System.out.println(definitionName);
}
}
}
上面代码直接使用@Autowired注入UserDAO,执行后会报错,因为spring区分不了要注入哪个bean;解决方案如下:
//1.Autowired注入的属性优先按照名字去匹配,名字匹配不到才会按照类型去匹配
public class UserService {
@Autowired
private UserDAO userDAO1; public void sayHi(){
System.out.println(userDAO1.getId());
} }
//2.@Qualifier("userDAO2") 使用该注解去指定
public class UserService {
@Autowired
@Qualifier("userDAO2")
private UserDAO userDAO;
public void sayHi(){
System.out.println(userDAO.getId());
}
}
//3.使用@Primary去指定优先级
@Configuration
@Import({UserService.class})
public class AppConfigurate {
@Bean("userDAO1")
@Primary
public UserDAO userDAO(){
UserDAO userDAO = new UserDAO();
userDAO.setId("userDAO1");
return userDAO;
}
@Bean("userDAO2")
public UserDAO userDAO2(){
UserDAO userDAO = new UserDAO();
userDAO.setId("userDAO2");
return userDAO;
}
}
//4.使用@Resource注解
public class UserService {
@Resource(name = "userDAO2")
private UserDAO userDAO; public void sayHi(){
System.out.println(userDAO.getId());
} }
//@Inject注解用法
public class UserService {
@Inject
private UserDAO userDAO; public void sayHi(){
System.out.println(userDAO.getId());
} }
@Autowired,@Resource,@Qualifier,@Primary,@Inject的作用和区别的更多相关文章
- @Autowired @Resource @Qualifier的区别
参考博文: http://www.cnblogs.com/happyyang/articles/3553687.html http://blog.csdn.net/revent/article/det ...
- @autowired、@Qualifier、@Primary注解
@autowired 可以自动帮你把Bean里面引用的对象的setter/getter方法省略,自动帮你set/get. 启动spring IoC时,容器自动装载了一个AutowiredAnnotat ...
- @Resource、@Autowired、@Qualifier 区别(表格显示)
@Resource.@Autowired.@Qualifier 区别(表格显示) 区别项 @Resource @Autowired @Qualifier 谁提供的 jdk提供,包是javax.anno ...
- Spring注解@Component、@Repository、@Service、@Controller @Resource、@Autowired、@Qualifier、@scope
以下内容摘自部分网友的,并加上了自己的理解 @Service用于标注业务层组件(我们通常定义的service层就用这个) @Controller用于标注控制层组件(如struts中的action.Sp ...
- 三分钟学会@Autowired@Qualifier@Primary注解
三分钟学会@Autowired@Qualifier@Primary注解 2018.10.08 20:24 154浏览 今天主要简单的跟大家介绍一下spring自动装配相关的@Autowired,@Qu ...
- Spring注解之@Autowired、@Qualifier、@Resource、@Value
前言 @Autowired.@Qualifier.@Resource.@Value四个注解都是用于注入数据的,他们的作用就和在xml配置文件中的bean标签中写一个标签的作用是一样的!本篇中特别要讲解 ...
- Spring注解 @Component、@Repository、@Service、@Controller @Resource、@Autowired、@Qualifier 解析
@Repository.@Service.@Controller 这几个是一个类型,其实@Component 跟他们也是一个类型的 Spring 2.5 中除了提供 @Component 注释外,还定 ...
- 20、自动装配-@Autowired&@Qualifier&@Primary
20.自动装配-@Autowired&@Qualifier&@Primary 自动装配:Spring 利用依赖注入(DI),完成对IOC容器中各个依赖关系赋值 20.1 @Autowi ...
- 关于Spring注解@Component、@Repository、@Service、@Controller @Resource、@Autowired、@Qualifier 解析
1.Spring 2.5 中除了提供 @Component 注释外,还定义了几个拥有特殊语义的注释,它们分别是:@Repository.@Service和 @Controller 其实这三个跟@Com ...
随机推荐
- Vue路由模块化的实现方法
分享一个Vue路由模块化方法,简单实用,好用到飞起 路由模块化 1.router/index.js 配置路由 import Vue from 'vue' import VueRouter from ' ...
- C++标准模板库(STL)常用介绍
1. 输入输出 C++既可以用C的scanf和printf,也可以用新增的的cin与cout,后者速度慢 1.1 C程序中输入输出 int a; scanf("%d",&a ...
- C#还原对图像做的修改
在C#程序中对图像进行处理,有的时候需要将处理后的图像还原,便于观察两者之间的区别,避免重新运行程序造成的麻烦.我是将之前写的Tab页中打开的图像进行还原,将原始图像数据保存在数据流中,然后从数据流中 ...
- Canalv1.1.4版本搭建HA集群
前提 Canal上一个正式版是于2019-9-2发布的v1.1.4,笔者几个月前把这个版本的Canal推上了生产环境,部署了HA集群.过程中虽然遇到不少的坑,但是在不出问题的前提下,Canal的作用还 ...
- 面试【JAVA基础】阻塞队列
1.五种阻塞队列介绍 ArrayBlockingQueue 有界队列,底层使用数组实现,并发控制使用ReentrantLock控制,不管是插入操作还是读取操作,都需要获取锁之后才能执行. Linked ...
- Vue官方文档Vue.extend、Vue.component、createElement、$attrs/$listeners、插槽的深入理解
一.Vue.extend({}). 看官网文档介绍,Vue.extend({})返回一个Vue的子类,那么这个Vue子类是啥玩意儿呢?我直观感觉它就是创建出一个组件而已啊,那么它又和Vue.compo ...
- Azure Blob (三)参数设置说明
一,引言 上一篇将 Azure Blob 存储的时候,有使用到一个 .NET Core Web 项目,通过代码的方式进行操作 Azure Blob 的数据,接着上一篇的内容,今天继续看一下代码,具体 ...
- MySql数据库规范与原则
1.数据库表名命名规范 采用26个英文字母(区分大小写)和0-9的自然数(经常不需要)加上下划线'_'组成; 命名简洁明确,多个单词用下划线'_'分隔; 例如:user_login, user_pro ...
- 两篇好文 清晰地描述bug 技术总监的忠告
如何清晰的描述一个bug 一个技术总监的忠告 --2020-02-26--
- 教会舍友玩 Git (再也不用担心他的学习)
舍友长大想当程序员,我和他爷爷奶奶都可高兴了,写他最喜欢的喜之郎牌Git文章,学完以后,再也不用担心舍友的学习了(狗头)哪里不会写哪里 ~~~ 一 先来聊一聊 太多东西属于,总在用,但是一直都没整理的 ...