Java面试神技-自动注入注解区别
@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;