@Resource,@Autowired和@Qualifier的区别

1.注解源码

@Autowired: 注解中仅仅有是否必需元素

@Target({ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Autowired {
    boolean required() default true;
}

@Qualifer:仅仅有一个value元素

@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.TYPE, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Qualifier {
    String value() default "";
}

@Resource:可以指定类型也可以指定名称

@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 "";
}

2.业务代码

service

@Service
public class RemarkServiceImpl implements IRemarkService {
}

@Service的使用有两种情况:

A.直接使用@Service进行注解:可通过IRemarkServic类型和RemarkServiceImpl类型进行注入,也可以通过remarkServiceImpl名称注入。
B.指定名称@Service("remarkService"),这是可通过注入IremarkService和RemarkServiceImpl类型,也可通过remarkService名称进行注入,不能使用remarkServiceImpl名称进行注入了。

虽然@Service会默认生成对应名称的实例,也可以推荐加上默认的名称。

controller

@RestController
@RequestMapping("/remark")
public class RemarkController {

    @Autowired
    @Qualifier("remarkService")
    private RemarkServiceImpl remarkService;
}

@Autowired:首先按照类型进行注入,如果注入的类型是有多个实现并且注入到容器的类型,然后会按照变量名称进行注入。
@Qualifier("remarkService"):此注解同@Autowired一块使用,注入的类型匹配并且名称也匹配,注入的实例的类型可是要注入类型的子类或本身类型。

@Resource:该注解可以指定注解的名称或者类型,如果仅仅指定类型,使用同@Autowired;如果指定了名称,那么就必须按照名称进行注入。

3.具体使用

在开发过程中,注入的类型最好是基类,也体现了面向接口编程,也就是说变量类型使用基类类型,变量名使用基类首字母小写的形式。
如果一个基类仅仅有一个实现并且注入到容器中,那么使用@Autowired进行注解;如果一个基类有多个实现,并且注入到容器,那么使用@Resource注解指定要注入的名称。

你可能感兴趣的:(注解)