@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 ...
随机推荐
- 这个爬虫JS逆向加密任务,你还不来试试?逆向入门级,适合一定爬虫基础的人
友情提示:在博客园更新比较慢,有兴趣的关注知识图谱与大数据公众号吧.这次选择苏宁易购登录密码加密,如能调试出来代表你具备了一定的JS逆向能力,初学者建议跟着内容调试一波,尽量独自将JS代码抠出来,实在 ...
- 推荐一款万能抓包神器:Fiddler Everywhere
搞IT技术的同行,相信没有几个人是不会抓包这项技能的(如果很不幸你中枪了,那希望这篇文章给你一些动力),市面上的抓包工具也有很多,常用的有:Charles.Fiddler.Burpsuite.Wire ...
- tomcat服务器java.lang.OutOfMemoryError: PermGen space
一挂就报内存溢出 下面是TOMCAT日志 JAVA程序是没有报错, Nov 24, 2009 4:07:02 PM org.apache.catalina.core.ApplicationDispat ...
- python给excel文件加密码,并重新生成文件
需安装pywin32 pip install pywin32 直接上源码.简单几行就搞定 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手. ...
- 【代码优化】Unity查漏补缺
1.XML: 使用Unity社区中的开源脚本(Js语言)解析XML文件,网址:http://dev.grumpyferret.com/unity/,已打包XMLParser.unitypackage, ...
- nginx如何限制并发连接请求数?
简介 限制并发连接数的模块为:http_limit_conn_module,地址:http://nginx.org/en/docs/http/ngx_http_limit_conn_module.ht ...
- Java中的IO操作和缓冲区
目录 Java中的IO操作和缓冲区 一.简述 二.IO流的介绍 什么是流 输入输出流的作用范围 三.Java中的字节流和字符流 字节流 字符流 二者的联系 1.InputStreamReader 2. ...
- 深入了解Netty【五】线程模型
引言 不同的线程模型对程序的性能有很大的影响,Netty是建立在Reactor模型的基础上,要搞清Netty的线程模型,需要了解一目前常见线程模型的一些概念. 具体是进程还是线程,是和平台或者编程语言 ...
- 转载:MYSQL数据库三表联查的SQL优化过程
地址:https://database.51cto.com/art/202002/609803.htm 作者用了三张有设计缺陷的表做例子,使得优化效果空前,优化手段仅为拨乱反正和加索引,此行可为一哂.
- springcloudalibaba与nacos服务注册流程图
springboot + springcloud + springcloudalibaba + nacos 服务注册流程图: springboot ①WebApplicationContext ②st ...