前言

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

1、先给出一个场景

讲@Autowired注解前先给出一个场景:

dao层代码

@Repository
public class AccountDao {
public void save() {
System.out.println("dao数据save成功了...."); }
}

service层代码

@Service
public class AccountImpl implements AccountService { private AccountDao accountDao; @Override
public void save() {
accountDao.save(); }
}

表现层controller代码:

//模拟一个表现层功能
public class AccountController {
public static void main(String[] args) {
//1.获取核心容器对象
ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("Applicationcontext.xml");
//2.根据id获取Bean对象
AccountService as = (AccountService)ac.getBean("accountImpl");
as.save();
System.out.println(as);
}
}

运行结果



相信大家对java.lang.NullPointerException空指针异常已经习以为常了,特别亲切.....

那么为啥会出现这个异常呢?很显然从代码中可以看出来service中有着 AccountDao 类型的属性没有注入而引发的空指针异常,那么接下来就到@Autowired注解登场了....

2、@Autowired

Spring 2.5 引入了 @Autowired 注释,它可以对类成员变量、方法及构造函数、参数等进行标注【主要还是用在变量方法上】,完成自动装配的工作。 通过 @Autowired的使用来消除 set ,get方法,也就是说,使用@Autowired注解注入属性数据不需要这个类提供set方法,方便快捷@Autowired作用就和在xml配置文件中的bean标签中写一个< property >标签的作用是一样的。

在之前的文章Spring中如何使用工厂模式实现程序解耦?中,我们多多少少知道spring的IOC底层实际上就是一个Map结构容器,所谓key 就是 bean标签 中的 id,value 则是对应 bean标签 中的 class

@Autowired自动装配首先会在IOC容器中跳过key直接去容器中找到对应的属性!也就是说与key无关。

@Autowired自动装配的三种情况:

1、容器中有唯一的一个bean对象类型和被@Autowired修饰的变量类型匹配,就可以注入成功!

2、容器中没有一个bean对象类型和被@Autowired修饰的变量类型匹配,则注入失败运行报错。

3、容器中有多个bean对象类型和被@Autowired修饰的变量类型匹配,则根据被@Autowired修饰的变量名寻找,找到则注入成功【重点

很多人会忽略或者不清楚第三点!!!

3、@Qualifier

根据上面@Autowired的第三种情况,需要更改变量名来对应注入,这样就对程序不是很灵活,于是有了@Qualifier这个注解。@Qualifier的作用是在按照类中注入的基础之上再按照名称注入。它在给类成员注入时不能单独使用(但是在给方法参数注入时可以单独使用),因此@Qualifier注解很受限制,因此用的不是很多。@Qualifier常常组合@Autowired一起使用,用来指明具体名字的自动装配


@Autowired //如果单纯一个@Autowired 注解则表示找类型为IAccuntDao的,如果有两个类型为IAccuntDao的,则接着匹配类型为IAccuntDao而且名字为accountDao的【缺点:要改变量名指定】
@Qualifier("accountDao2") //加上这个注解直接找类型为IAccuntDao而且名字为accountDao的
private IAccuntDao accountDao; 所以这段代码注解的意思就是直接找类型为IAccuntDao而且名字为accountDao的组件

其实上面的注解等价于下面的注解,我们后面会讲到:

 @Resource("accountDao2")
private IAccuntDao accountDao;

4、@Resource

@Resource由J2EE提供,默认是按照byName自动注入(通过名字自动注入),@Resource有两个重要的属性,name和type,当然默认是通过name,这里type属性就没必要讲了,用type属性多此一举,还不如用@Autowired,因此对于@Resource记住通过名字自动注入就好了

5、@Autowired、@Resource的区别

不得不说这两个注解非常相似,而且很容易混淆。

@Autowired、@Resource的主要区别主要有下面几点:

@Autowired @Resource
注解提供者 Spring J2EE
自动装配方式 属性 名字

其实主要的区别就这一两点,当然也肯定有着细节,这里就暂时不概述了。

当然比较重要的一点就是:@Resource 相当于 @Autowired + @Qualifier

6、@Value

由于@Autowired、@Qualifier、@Resource三者自动装配只能针对于注入其他bean类型的数据,而基本类型和String类型无法使用上述注解实现。因此有了@Value这个注解,@Value专门用来服务基本类型和String类型。

另外@Value注解有一个value 属性:用于指定数据的值。它可以使用spring中SpEL(也就是spring的EL表达式)。SpEL的写法:${表达式},当然也可以类似mybatis中的 #{表达式} 的写法

@Value("#{2*3}")  //#写法 表示6
private int age; @Value("178") //普遍写法 178
private int height; @Value("${man.weight}") //SpEL的写法一般操作配置文件中数据
private int weight;

注意:集合类型的注入只能通过XML来实现

7、小结

以上的@Autowired、@Qualifier、@Resource、@Value四个注解都是用于注入数据的,他们的作用就和在xml配置文件中的bean标签中写一个标签的作用是一样的!

如果本文对你有一点点帮助,那么请点个赞呗,你的赞同是我最大的动力,谢谢~

最后,若有不足或者不正之处,欢迎指正批评,感激不尽!如果有疑问欢迎留言,绝对第一时间回复!

欢迎各位关注我的公众号,里面有一些java学习资料和一大波java电子书籍,比如说周志明老师的深入java虚拟机、java编程思想、核心技术卷、大话设计模式、java并发编程实战.....都是java的圣经,不说了快上Tomcat车,咋们走!最主要的是一起探讨技术,向往技术,追求技术,说好了来了就是盆友喔...

Spring注解之@Autowired、@Qualifier、@Resource、@Value的更多相关文章

  1. Spring AOP注解通过@Autowired,@Resource,@Qualifier,@PostConstruct,@PreDestroy注入属性的配置文件详解

    本文介绍了使用Spring注解注入属性的方法.使用注解以前,注入属性通过类以及配置文件来实现.现在,注入属性可以通过引入@Autowired注解,或者@Resource,@Qualifier,@Pos ...

  2. Spring AOP注解通过@Autowired,@Resource,@Qualifier,@PostConstruct,@PreDestroy注入属性的

    本文介绍了使用spring注解注入属性的方法. 使用注解以前,注入属性通过类以及配置文件来实现.现在,注入属性可以通过引入@Autowired注解,或者@Resource,@Qualifier,@Po ...

  3. spring 框架的 @Autowired 和 @Resource 两种注解的区别

    最开始做项目时,依赖注入用到的注解都是 J2EE 的 @Resource,那时还根本不了解 spring 有 @Autowired.心塞. 前两天想到估计有很多刚开始学习 java 的童鞋可能对这两个 ...

  4. @Autowired @Qualifier @Resource

    @Autowired 用于对Bean的属性变量,属性的setter()方法及构造方法进行标注,配合对应的注解处理器完成Bean的自动装配工作.默认按照Bean的类型进行装配. @Resource 其作 ...

  5. Spring注解之@Autowired

    前言 说起Spring的@Autowired注解,想必大家已经熟悉的不能再熟悉了.本文就针对此最常用的注解,梳理一下它的功能和原理,争取从源码的角度将此注解讲通,如有写的不准确的地方,欢迎各位园友拍砖 ...

  6. 有关spring注解总结

    前言 目前企业开发多采用纯注解的方式开发,注解开发的好处:简洁,可读性强 最近学习了spring全家桶,总结了有关spring的常用注解,写的不对的地方,欢迎指正 Spring模块注解 @Config ...

  7. Spring注解配置

    配置文件: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http:// ...

  8. Spring 注解<context:annotation-config> 和 <context:component-scan>的作用与区别

    <context:annotation-config> 是用于激活那些已经在spring容器里注册过的bean(无论是通过xml的方式还是通过packagesanning的方式)上面的注解 ...

  9. Spring @Resource,@Autowired,@Qualifier的注解注入和区别

    spring2.5提供了基于注解(Annotation-based)的配置,我们可以通过注解的方式来完成注入依赖.在Java代码中可以使用 @Resource或者@Autowired注解方式来经行注入 ...

随机推荐

  1. HZOJ Permutation

    输出原序列有45分…… 字典序最小可以和拓扑序联系起来. 根据原来的题意不是很可做,于是对原序列求逆,令q[p[i]]=i; 那么就成功将题意转化:相邻元素值的差大于等于k时可以交换,使序列字典序最小 ...

  2. 【NS2】有线和无线混合场景 (转载)

    1. 创建简单的有线-无线混合场景 上一节建立的无线仿真可以支持多跳adhoc网络或wirelesslan.但是,我们可能需要对经过有线网络连接的多个无线网络进行仿真,或者说我们需要对有线-无线混合网 ...

  3. codeblocs的安装使用

    安装后,上面菜单栏 点击“Setting --> Compiler” "Creat a new project"

  4. LeetCode54 Spiral Matrix

    题目: Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spira ...

  5. git init之后,没有.git后缀的文件

    git init之后,打开相关目录没有.git后缀的文件 尝试

  6. Helm V3 新版本发布

    Helm v3.0.0 Alpha 1 is coming! Helm 作为 Kubernetes 体系的包管理工具,已经逐渐成为了事实上的应用分发标准.根据 2018 年 CNCF 的一项云原生用户 ...

  7. 【t065】最敏捷的机器人

    Time Limit: 1 second Memory Limit: 128 MB [问题描述] [背景] Wind设计了很多机器人.但是它们都认为自己是最强的,于是,一场比赛开始了~ [问题描述] ...

  8. 怎样打开.jar格式文件,怎样运行.jar格式文件

    当时第一次看到.jar文件不知道是什么鬼,以为是压缩包,直接就解压了,但是并没有什么用.所以在下为大家详细介绍如何打开.jar文件以及如何运行.jar文件.什么是.jar文件,简单的说就是java压缩 ...

  9. 求解最长回文串 manachar算法

    转载:http://blog.sina.com.cn/s/blog_70811e1a01014esn.html ;i<len;++i){ if(mx>i) p[i]=min(p[*id-i ...

  10. Javassist指引(二)--ClassPool

    原文链接 上一章: Javassist指引(一) 2.ClassPool ClassPool是一个CtClass的容器.因为编译器随时可能访问一个CtClass类,所以一旦一个CtClass创建,它将 ...