1.来源不同
@Resource是JDK提供的,属于javax包。
import javax.annotation.Resource;
@Autowired是spring提供
import org.springframework.beans.factory.annotation.Autowired;
2.默认的装配方式不同
@Resource默认是通过byName进行自动注入的,如果需要通过类型进行注入,则需要指定Type属性。可以通过查看源码的注释来进行理解。
@Target({TYPE, FIELD, METHOD})
@Retention(RUNTIME)
public @interface Resource {
/**
* The JNDI name of the resource. For field annotations,
* the default is the field name. For method annotations,
* the default is the JavaBeans property name corresponding
* to the method. For class annotations, there is no default
* and this must be specified.
*/
String name() default "";
@Autowired默认是通过byType进行自动注入,默认要求对象必须存在,如果允许不存在则需要将其required属性设置为false,如果想通过Name进行注入,则需要和@Qualifier一起使用,@Qualifier用于指定Name.
@Target({ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Autowired {
/**
* Declares whether the annotated dependency is required.
* <p>Defaults to {@code true}.
*/
boolean required() default true;
}
注:@Qualifier不能单独作用在类成员变量上,需要和@Autowired配合使用。