Spring注解之@Autowired、@Qualifier、@Resource、@Value
前言
讲@autowired注解前先给出一个场景: dao层代码 service层代码 表现层controller代码: 运行结果 那么为啥会出现这个异常呢?很显然从代码中可以看出来service中有着 spring 2.5 引入了 @autowired 注释,它可以对类成员变量、方法及构造函数、参数等进行标注【主要还是用在变量和方法上】,完成自动装配的工作。 通过 @autowired的使用来消除 set ,get方法,也就是说,使用@autowired注解注入属性数据不需要这个类提供set方法,方便快捷。 在之前的文章spring中如何使用工厂模式实现程序解耦?中,我们多多少少知道spring的ioc底层实际上就是一个map结构容器,所谓key 就是 bean标签 中的 id,value 则是对应 bean标签 中的 class。 @autowired自动装配首先会在ioc容器中跳过key直接去容器中找到对应的属性!也就是说与key无关。 @autowired自动装配的三种情况: 1、容器中有唯一的一个bean对象类型和被@autowired修饰的变量类型匹配,就可以注入成功! 很多人会忽略或者不清楚第三点!!! 根据上面@autowired的第三种情况,需要更改变量名来对应注入,这样就对程序不是很灵活,于是有了@qualifier这个注解。@qualifier的作用是在按照类中注入的基础之上再按照名称注入。它在给类成员注入时不能单独使用(但是在给方法参数注入时可以单独使用),因此@qualifier注解很受限制,因此用的不是很多。@qualifier常常组合@autowired一起使用,用来指明具体名字的自动装配 其实上面的注解等价于下面的注解,我们后面会讲到: @resource由j2ee提供,默认是按照byname自动注入(通过名字自动注入),@resource有两个重要的属性,name和type,当然默认是通过name,这里type属性就没必要讲了,用type属性多此一举,还不如用@autowired,因此对于@resource记住通过名字自动注入就好了 不得不说这两个注解非常相似,而且很容易混淆。 @autowired、@resource的主要区别主要有下面几点: 其实主要的区别就这一两点,当然也肯定有着细节,这里就暂时不概述了。 当然比较重要的一点就是:@resource 相当于 @autowired + @qualifier 由于@autowired、@qualifier、@resource三者自动装配只能针对于注入其他bean类型的数据,而基本类型和string类型无法使用上述注解实现。因此有了@value这个注解,@value专门用来服务基本类型和string类型。 另外@value注解有一个value 属性:用于指定数据的值。它可以使用spring中spel(也就是spring的el表达式)。spel的写法:${表达式},当然也可以类似mybatis中的 #{表达式} 的写法 注意:集合类型的注入只能通过xml来实现 以上的@autowired、@qualifier、@resource、@value四个注解都是用于注入数据的,他们的作用就和在xml配置文件中的bean标签中写一个
如果本文对你有一点点帮助,那么请点个赞呗,你的赞同是我最大的动力,谢谢~ 最后,若有不足或者不正之处,欢迎指正批评,感激不尽!如果有疑问欢迎留言,绝对第一时间回复! 欢迎各位关注我的公众号,里面有一些java学习资料和一大波java电子书籍,比如说周志明老师的深入java虚拟机、java编程思想、核心技术卷、大话设计模式、java并发编程实战.....都是java的圣经,不说了快上tomcat车,咋们走!最主要的是一起探讨技术,向往技术,追求技术,说好了来了就是盆友喔...
@autowired、@qualifier、@resource、@value四个注解都是用于注入数据的,他们的作用就和在xml配置文件中的bean标签中写一个1、先给出一个场景
@repository
public class accountdao {
public void save() {
system.out.println("dao数据save成功了....");
}
}
@service
public class accountimpl implements accountservice {
private accountdao accountdao;
@override
public void save() {
accountdao.save();
}
}
//模拟一个表现层功能
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
空指针异常已经习以为常了,特别亲切.....accountdao
类型的属性没有注入而引发的空指针异常,那么接下来就到@autowired注解登场了....2、@autowired
@autowired
作用就和在xml配置文件中的bean标签中写一个< property >
标签的作用是一样的。
2、容器中没有一个bean对象类型和被@autowired修饰的变量类型匹配,则注入失败运行报错。
3、容器中有多个bean对象类型和被@autowired修饰的变量类型匹配,则根据被@autowired修饰的变量名寻找,找到则注入成功【重点】3、@qualifier
@autowired //如果单纯一个@autowired 注解则表示找类型为iaccuntdao的,如果有两个类型为iaccuntdao的,则接着匹配类型为iaccuntdao而且名字为accountdao的【缺点:要改变量名指定】
@qualifier("accountdao2") //加上这个注解直接找类型为iaccuntdao而且名字为accountdao的
private iaccuntdao accountdao;
所以这段代码注解的意思就是直接找类型为iaccuntdao而且名字为accountdao的组件
@resource("accountdao2")
private iaccuntdao accountdao;
4、@resource
5、@autowired、@resource的区别
@autowired
@resource
注解提供者
spring
j2ee
自动装配方式
属性
名字
6、@value
@value("#{2*3}") //#写法 表示6
private int age;
@value("178") //普遍写法 178
private int height;
@value("${man.weight}") //spel的写法一般操作配置文件中数据
private int weight;
7、小结
上一篇: 高效开发:你的项目有接口聚合服务吗?
下一篇: 青岛的啤酒种类,不知道简直白喝了
推荐阅读
-
Spring注解之@Autowired、@Qualifier、@Resource、@Value
-
Spring框架中 @Autowired 和 @Resource 注解的区别
-
@Autowired 和 @Resource注解, 一个接口有多个实现类的时候Spring注入遇到的问题
-
JAVA面试之九—@Autowired和@Resource注解有什么区别?
-
spring注解@Autowired、@Resource的区别
-
spring注解@Autowired、@Resource的区别
-
一分钟学会spring注解之@Autowired注解(二)
-
Spring5:@Autowired注解、@Resource注解和@Service注解
-
Spring中@Autowired和@Qualifier注解的3个知识点小结
-
Spring注解:自动装配(@Autowired+@Qualifier+@Primary、@Resource、@Inject)