@Autowired和@Resource的区别
AI-摘要
Tianli GPT
AI初始化中...
介绍自己
生成本文简介
推荐相关文章
前往主页
前往tianli博客
一、定义
1、@Autowired
对类成员变量、方法及构造函数进行标注,完成自动装配的工作。
2、@Resource
在语义上被定义为通过其唯一的名称来标识特定的目标组件,其中声明的类型与匹配过程无关。
如果没有明确指定名称,则默认名称是从字段名称或设置方法(get、set方法)派生的
如果用在字段上,则采用字段名称; 如果用在在setter方法,它采用其属性名称(例如setProperty()方法,取property做为属性名称)。
二、区别
1、提供方不同
- @Autowired 是Spring提供的
package org.springframework.beans.factory.annotation;
- @Resource 是java提供的。
package javax.annotation;
2、包含的属性不同
- @Autowired只包含一个参数:required,表示是否开启自动注入,默认是true
@Target({ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Autowired {
boolean required() default true;
}
- @Resource包含七个参数,其中最重要的两个参数是:name 和 type
@Target({ElementType.TYPE, ElementType.FIELD, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Repeatable(Resources.class)
public @interface Resource {
public @interface Resource {
/**
* bean的名称
*/
String name() default "";
String lookup() default "";
/**
* Java类,被解析为bean的类型
*/
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 "";
public static enum AuthenticationType {
CONTAINER,
APPLICATION;
private AuthenticationType() {
}
}
}
3、装配类型不同
- @Autowired默认按byType自动装配
@Autowired如果要使用byName,需要使用@Qualifier一起配合
@Autowired
@Qualifier("beanName")
private A a;
- @Resource默认byName自动装配
@Resource如果指定了name,则用byName自动装配,如果指定了type,则用byType自动装配
4、注解应用的地方不同
-
@Autowired能够用在:构造器、方法、参数、成员变量和注解上
-
@Resource能用在:类、成员变量和方法上
5、装配顺序不同
5.1 @Autowired的装配顺序
@Autowired默认先按byType进行匹配,如果发现找到多个bean,则又按照byName方式进行匹配,如果还有多个,则报出异常

5.2 @Resource的装配顺序
-
如果同时指定了name和type,流程如下:

-
如果只指定了name,流程如下:
只是指定了@Resource注解的name,则按name后的名字去bean元素里查找有与之相等的name属性的bean。

- 如果指定了type,流程如下:
只指定@Resource注解的type属性,则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常。

- 如果既没有指定name,也没有指定type,流程如下:
既不指定name属性,也不指定type属性,则自动按byName方式进行查找。如果没有找到符合的bean,则回退为一个原始类型进行进行查找,如果找到就注入。

本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 leaflei
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果