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

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

一、先给出一个场景

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

dao层代码spring

@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);
    }
}
复制代码

运行结果 mybatis

在这里插入图片描述
相信你们对 java.lang.NullPointerException空指针异常已经习觉得常了,特别亲切.....

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

二、@Autowired

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

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

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

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

一、容器中有惟一的一个bean对象类型和被@Autowired修饰的变量类型匹配,就能够注入成功! 二、容器中没有一个bean对象类型和被@Autowired修饰的变量类型匹配,则注入失败运行报错。 三、容器中有多个bean对象类型和被@Autowired修饰的变量类型匹配,则根据被@Autowired修饰的变量名寻找,找到则注入成功【重点

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

三、@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;
复制代码

四、@Resource

@Resource由J2EE提供,默认是按照byName自动注入(经过名字自动注入),@Resource有两个重要的属性,name和type,固然默认是经过name,这里type属性就不必讲了,用type属性画蛇添足,还不如用@Autowired,所以对于@Resource记住经过名字自动注入就行了

五、@Autowired、@Resource的区别

不得不说这两个注解很是类似,并且很容易混淆。

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

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

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

固然比较重要的一点就是:@Resource 至关于 @Autowired + @Qualifier

六、@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来实现

七、小结

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

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

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

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

在这里插入图片描述
相关文章
相关标签/搜索