@Autowired
和 @Resource
都是 Spring 框架中用于依赖注入的注解,但它们之间有一些不同之处。
-
来源:
@Autowired
是 Spring 框架提供的注解。@Resource
是来自于 JSR 250 规范,是 Java 标准的一部分。
-
注入方式:
@Autowired
是按类型(byType)注入的。如果容器中存在多个相同类型的 bean,则需要使用@Qualifier
注解来指定具体的 bean 名称,或者如果某个 bean 被标记为@Primary
,则它会作为首选 bean 被注入。@Resource
默认是按名称(byName)注入的。如果找不到与名称匹配的 bean,它会回退到按类型注入。
-
是否必须:
@Autowired
注解的字段、构造函数或方法,如果 Spring 容器中没有匹配的 bean,那么在默认情况下会抛出异常。不过,你可以通过设置required
属性为false
来改变这一行为。@Resource
没有提供required
属性,如果找不到匹配的 bean,它会抛出异常。
以下是使用 @Autowired
和 @Resource
的代码示例:
@Service
public class MyService {
// 使用 @Autowired 进行依赖注入
@Autowired
private AnotherService anotherServiceByType;
// 如果存在多个 AnotherService 类型的 bean,可以使用 @Qualifier 指定具体的 bean
@Autowired
@Qualifier("specificAnotherService")
private AnotherService anotherServiceByQualifier;
// 使用 @Resource 进行依赖注入,默认按名称查找 bean
@Resource(name = "anotherServiceByName")
private AnotherService anotherServiceByName;
// 如果 @Resource 没有指定名称,则会回退到按类型注入
@Resource
private AnotherService anotherServiceByTypeResource;
// ... 其他代码 ...
}
@Service
public class AnotherService {
// ... 业务逻辑 ...
}
@Service("specificAnotherService")
public class SpecificAnotherService extends AnotherService {
// ... 扩展业务逻辑 ...
}
@Service("anotherServiceByName")
public class AnotherServiceByName extends AnotherService {
// ... 扩展业务逻辑 ...
}
在这个例子中,MyService
类依赖于 AnotherService
类型的 bean。@Autowired
和 @Resource
被用来注入这些依赖。注意,如果有多个相同类型的 bean,@Autowired
需要与 @Qualifier
一起使用来指定具体的 bean,而 @Resource
可以直接通过名称来注入。