@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的作用和区别的更多相关文章

  1. @Autowired @Resource @Qualifier的区别

    参考博文: http://www.cnblogs.com/happyyang/articles/3553687.html http://blog.csdn.net/revent/article/det ...

  2. @autowired、@Qualifier、@Primary注解

    @autowired 可以自动帮你把Bean里面引用的对象的setter/getter方法省略,自动帮你set/get. 启动spring IoC时,容器自动装载了一个AutowiredAnnotat ...

  3. @Resource、@Autowired、@Qualifier 区别(表格显示)

    @Resource.@Autowired.@Qualifier 区别(表格显示) 区别项 @Resource @Autowired @Qualifier 谁提供的 jdk提供,包是javax.anno ...

  4. Spring注解@Component、@Repository、@Service、@Controller @Resource、@Autowired、@Qualifier、@scope

    以下内容摘自部分网友的,并加上了自己的理解 @Service用于标注业务层组件(我们通常定义的service层就用这个) @Controller用于标注控制层组件(如struts中的action.Sp ...

  5. 三分钟学会@Autowired@Qualifier@Primary注解

    三分钟学会@Autowired@Qualifier@Primary注解 2018.10.08 20:24 154浏览 今天主要简单的跟大家介绍一下spring自动装配相关的@Autowired,@Qu ...

  6. Spring注解之@Autowired、@Qualifier、@Resource、@Value

    前言 @Autowired.@Qualifier.@Resource.@Value四个注解都是用于注入数据的,他们的作用就和在xml配置文件中的bean标签中写一个标签的作用是一样的!本篇中特别要讲解 ...

  7. Spring注解 @Component、@Repository、@Service、@Controller @Resource、@Autowired、@Qualifier 解析

    @Repository.@Service.@Controller 这几个是一个类型,其实@Component 跟他们也是一个类型的 Spring 2.5 中除了提供 @Component 注释外,还定 ...

  8. 20、自动装配-@Autowired&@Qualifier&@Primary

    20.自动装配-@Autowired&@Qualifier&@Primary 自动装配:Spring 利用依赖注入(DI),完成对IOC容器中各个依赖关系赋值 20.1 @Autowi ...

  9. 关于Spring注解@Component、@Repository、@Service、@Controller @Resource、@Autowired、@Qualifier 解析

    1.Spring 2.5 中除了提供 @Component 注释外,还定义了几个拥有特殊语义的注释,它们分别是:@Repository.@Service和 @Controller 其实这三个跟@Com ...

随机推荐

  1. muduo源码解析11-logger类

    logger: class logger { }; 在说这个logger类之前,先看1个关键的内部类 Impl private: //logger内部数据实现类Impl,内部含有以下成员变量 //时间 ...

  2. 《HelloGitHub》第 53 期

    兴趣是最好的老师,HelloGitHub 就是帮你找到兴趣! 简介 分享 GitHub 上有趣.入门级的开源项目. 这是一个面向编程新手.热爱编程.对开源社区感兴趣 人群的月刊,月刊的内容包括:各种编 ...

  3. springboot文件上传(可单文件/可多文件)

    获取文件内容,是从InputStream中获取,添加到指定位置的文件 如下所示 public static void getFile(InputStream is,File fileName) thr ...

  4. SpringBoot中关于Excel的导入和导出

    前言   由于在最近的项目中使用Excel导入和导出较为频繁,以此篇博客作为记录,方便日后查阅.本文前台页面将使用layui,来演示对Excel文件导入和导出的效果.本文代码已上传至我的gitHub, ...

  5. Mac 系统安装robot framework

    1.安装Python3 版本 2.安装robotframework:pip3 install robotframework 3.安装Pypubsub:pip3 install Pypubsub 4.安 ...

  6. vue + vant 上传图片之压缩图片

    <van-uploader v-model="fileList" multiple :after-read="afterRead" :max-count= ...

  7. Labview学习之路(六)条件结构

    条件结构位于 函数---结构 子选版中.相当于c语言的switch语句, 结构: 分支选择器 分支器标签 分支子框图 可接数据类型 布尔型 布尔常量 真和假   错误信息簇 真和假 整型数值 单值 可 ...

  8. 序列号,IMEI,IMSI,ICCID的含义

    什么是序列号? 序列号是一串标识你手机出生证明以及身材特征的信息,甚至还可用来识别是否为官方翻新机.你可以简单的将这一串数字分割为:aabccdddeef 的形式.拿iPhone 4为例 aa = 工 ...

  9. viewPager2的Bug

    在使用数据绑定时,viewpager2的 android:layout_width 必需 match_parent,不然要么显示不正常,要么直接崩溃.

  10. 软件架构与设计 百度网盘的pdf电子书籍

    如有版权问题请及时联系小编 软件架构与设计 百度网盘的pdf电子书籍 1:<软件体系结构(PDF)>https://pan.baidu.com/s/1lChfIJt5lc63KO09n5L ...