概述
@Autowired
和 @Resource
是在 Java 开发中用于实现依赖注入的注解。
@Autowired
是 Spring 框架提供的注解,用于自动装配(自动注入)依赖。通过在需要注入依赖的字段、构造方法或者方法上使用 @Autowired
注解,Spring 容器会自动寻找匹配类型的 Bean,并将其注入到被注解的位置。如果存在多个满足条件的 Bean,则可以使用 @Qualifier
注解指定具体的 Bean。
@Resource
是 JavaEE 规范提供的注解,也可用于依赖注入。它可以根据名称或者类型进行依赖注入。当使用名称进行依赖注入时,@Resource
注解会根据指定的名称去查找匹配的 Bean 进行注入;当使用类型进行依赖注入时,@Resource
注解会使用类型去查找匹配的 Bean 进行注入。
相同点
1.都可以实现依赖注入
通过注解将需要的Bean自动注入到目标类中。
2.都可以用于注入任意类型的Bean
包括类、接口、原始类型、数组等。
3.都支持通过名称、类型匹配进行注入
@Autowired
注解默认按照类型匹配,而@Resource
注解默认按照名称匹配
@Autowired private Bean beanA; @Resource private Bean beanB;
在Spring容器中这两个注解功能基本是等价的,都可以将bean注入到对应的字段中。
不同点
虽然功能上看起来基本相同还是存在区别的下面从几个不同方面分析
1.来源不同。
@Autowired
是 Spring 框架提供的注解。
@Resource
是 JavaEE(现在的 JakartaEE)规范中定义的注解。
2.包含的属性不同
@Autowired
只包含一个参数:required,表示是否开启自动注入,默认是true。
@Resource
包含七个参数,其中最重要的两个参数是:name 和 type。
3.匹配方式(装配顺序)不同。
@Autowired
默认先按照类型进行自动装配,再是根据名称的方式。意思就是先在Spring容器中找以Bean为类型的Bean实例,如果找不到或者找到多个bean,则会进一步通过字段名称来找。当有多个同类型的 Bean 存在时,也可以通过@Qualifier
注解指定具体的 Bean。
@Component public class UserService { @Autowired @Qualifier("userRepository")//如果有多个同类型的Bean,可以使用@Qualifier注解指定具体的Bean private UserRepository userRepository; // ... }
@Resource
和@Autowired
恰好相反,先是按照名称方式,然后再是按照类型方式;当然,我们也可以通过注解中的参数显示指定通过哪种方式。如果有多个同名的Bean,可以使用@Resource注解的name属性指定具体的Bean
默认使用
@Component public class UserService { @Resource//不指定任何属性 private UserRepository userRepository; // ... }
指定name
@Component public class UserService { @Resource(name = "userRepository")//使用name属性指定具体的Bean private UserRepository userRepository; // ... }
指定type
@Component public class UserService { @Resource(type = UserRepository.class)//使用type属性指定Bean类型 private UserRepository userRepository; // ... }
指定name和type
@Component public class UserService { @Resource(type = "UserRepository.class",name = "userRepository")//使用type属性指定Bean类型,name指定Bean名称 private UserRepository userRepository; // ... }
4.支持的注入对象类型不同
@Autowired
可以注入任何类型的对象,只要 Spring 容器中存在该类型的 Bean。
@Resource
注解可以用于注入 JNDI 名称(JNDI名称可以是任何字符串,但通常使用具有描述性的名称来标识资源。在应用程序中,可以使用JNDI名称来查找和绑定对象)或者默认按照名称匹配的 Bean
5.应用地方不同
@Autowired
能够用在:构造器、方法、参数、成员变量和注解上
@Resource
能用在:类、成员变量和方法上。