Java面试神技-自动注入注解区别

118

@Autowired和@Resource以及@Inject等注解注入有何区别?

Autowired

作用位置:

@Target({ElementType.CONSTRUCTOR, //构造器
         ElementType.METHOD, //方法
         ElementType.PARAMETER,//方法参数
         ElementType.FIELD, //字段,枚举的常量
         ElementType.ANNOTATION_TYPE})//注解
public @interface Autowired {
    boolean required() default true;//是否必须
}

注入方式:

默认根据类型(byType)注入,多个同类型Bean时,需要指定按照名称(byName)注入,配合@Qualifier.

指定名称后,如果Spring IOC容器中没有对应的组件bean抛出NoSuchBeanDefinitionException。也可以将@Autowired中required配置为false,如果配置为false之后,当没有找到相应bean的时候,系统不会抛异常

Resource

作用位置:

@Target({TYPE, //接口,类,注解,ENUM
         FIELD, //字段,枚举常量
         METHOD})//方法
@Retention(RUNTIME)
public @interface Resource 

注入方式:

@Resource是默认根据属性名称(byName)进行自动装配的,如果有多个类型一样的Bean候选者,则可以通过name进行指定进行注入

Inject

作用位置:

@Target({ METHOD, //方法
         CONSTRUCTOR, //构造函数
         FIELD })//字段,枚举的常量
@Retention(RUNTIME)
@Documented
public @interface Inject {}

注入方式:

@Inject是根据类型(byType)进行自动装配的,如果需要按名称进行装配,则需要配合@Named;