@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装配顺序:

  1. 如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常。
  2. 如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常。
  3. 如果指定了type,则从上下文中找到类似匹配的唯一bean进行装配,找不到或是找到多个,都会抛出异常。
  4. 如果既没有指定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的重要性在将来可能会增加。

上一篇:VolgaCTF 2020 Qualifier User Center


下一篇:Spring Injection with @Resource, @Autowired and @Inject