@Resource与@Autowire
@Resource与@Autowired都是Java中用于依赖注入的注解,它们在Spring/Spring Boot项目中有着广泛的应用。以下是对这两个注解的详细解析:
一、@Resource注解
-
来源:
- @Resource是Java EE(Jakarta EE)提供的注解,它来源于JSR-250规范提案,是Java语言规范或标准的一部分。
-
工作原理:
- @Resource注解主要通过名称匹配(byName)来注入依赖。如果名称匹配失败,则通过类型匹配(byType)来查找依赖。
- 在使用@Resource注解时,可以指定name和type属性。name属性指定要注入的bean的名称,而type属性指定要注入的bean的类型。
-
使用场景:
- @Resource注解可以用在字段或setter方法上。
- 当需要按照名称注入依赖时,@Resource注解是一个很好的选择。
-
注意事项:
- 如果使用@Resource注解注入的bean没有被提前加载(例如在Spring容器中),则会报错。
- 在加载时,是根据类名(不包括包名)判断的,如果出现重复的类名会报异常(即使不在同一个包中也会报异常)。
二、@Autowired注解
-
来源:
- @Autowired注解是Spring框架提供的注解,用于自动装配bean。
-
工作原理:
- @Autowired注解主要通过类型匹配(byType)来注入依赖。
- 如果Spring容器中找到一个唯一的bean与要注入的类型匹配,则直接注入该bean。
- 如果存在多个同类型的bean,则Spring会通过字段名或参数名来进一步匹配(也称为byName匹配),或者可以使用@Primary注解来标记一个bean为主要候选者,或者使用@Qualifier注解来指定注入的bean。
-
使用场景:
- @Autowired注解可以用在构造器、方法、字段或参数上。
- 在Spring框架中,依赖注入可以通过多种方式来实现,包括构造器注入、字段注入和方法注入。其中,构造器注入是推荐的方式,因为它可以确保依赖在对象创建时就被注入。
-
注意事项:
- 如果在Spring容器中找不到与某个依赖类型匹配的bean实例(或者找到多个但没有明确的优先级),那么Spring将抛出异常,除非将该注解的required属性设置为false。
- 使用@Autowired注解进行字段注入时,不利于单元测试,因为依赖是通过反射注入的。因此,Spring官方已经不建议这种使用方式。
三、@Resource与@Autowired的区别
-
来源不同:
- @Resource是Java EE规范的一部分,适用于任何兼容的Java EE容器。
- @Autowired是Spring框架提供的注解。
-
依赖查找顺序不同:
- @Resource先根据名称查找,如果找不到再根据类型查找。
- @Autowired先根据类型查找,如果找到多个再根据名称查找。
-
支持的参数不同:
- @Autowired只支持设置一个required参数。
- @Resource支持设置多个参数,包括name和type等。
-
依赖注入的支持不同:
- @Autowired支持属性注入、构造方法注入和Setter注入。
- @Resource只支持属性注入和Setter注入,不支持构造方法注入。
-
编译器提示不同:
- 在某些IDE(如IDEA)中,使用@Autowired注入Mapper对象时可能会提示报错信息(尽管程序可以正常执行),而使用@Resource则不会出现此问题。