@Autowired @Resource @Qualifier
Posted sh-chen
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了@Autowired @Resource @Qualifier相关的知识,希望对你有一定的参考价值。
引言
最近搭建springcloud微服务项目时,看到一些@Resouce注解跟@Qualifier。特意的找了一下相关的资料,整理一下记录下来。
@Resouce
首先来看@Resouce注解。@Resouce注解为于javax.annotation包下,该包属于java拓展包,不属于spring包下的注解;但是Spring不但支持自己定义的注解,同时还支持几个由JSR-250规范定义的注解,分别是@Resource、@PostConstruct以及@PreDestroy。
先上源码
@Target({TYPE, FIELD, METHOD})
@Retention(RUNTIME)
public @interface Resource {
String name() default "";
String lookup() default "";
Class<?> type() default java.lang.Object.class;
enum AuthenticationType {
CONTAINER,
APPLICATION
}
AuthenticationType authenticationType() default AuthenticationType.CONTAINER;
boolean shareable() default true;
String mappedName() default "";
String description() default "";
}
@Resource和@Autowired注解都是用来实现依赖注入的。@Autowried按by-type自动注入,而@Resource默认按by-Name自动注入。不过从源码上看@Resource注解仅支持打方法、字段、类(接口、枚举)上,不如@Autowired丰富
@Resource有两个重要属性,分别是name和type。Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。所以,如果使用name属性,则使用byName的自动注入策略,使用type属性时则使用byType自动注入策略。如果既不制定name也不制定type属性,这时将通过反射机制使用byName自动注入策略。
@Resource装配顺序:
- 如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常。
- 如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常。
- 如果指定了type,则从上下文中找到类似匹配的唯一bean进行装配,找不到或是找到多个,都会抛出异常。
- 如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配。
补充说明
JSR-250规范
JSR是Java Specification Requests的缩写,意思是Java 规范提案。是指向JCP(Java Community Process)提出新增一个标准化技术规范的正式请求。任何人都可以提交JSR,以向Java平台增添新的API和服务。JSR已成为Java界的一个重要标准。(来自百度百科)
JSR-250作为一个Java规范请求,它的目标是定义一组注释,这些注释解决常见的语义概念,因此可以被许多JavaEE和JavaSE组件使用。这是为了避免这些组件之间的冗余注释。JSR 250于2006年5月11日获释。随着声明式注释驱动的配置越来越多地应用于Java框架和应用程序中,例如:spring通过注释使其框架的更多组件可配置,JSR 250的重要性在将来可能会增加。
以上是关于@Autowired @Resource @Qualifier的主要内容,如果未能解决你的问题,请参考以下文章