在使用bean容器注入时常常会使用
@AutoWire或者@Resource进行bean的注入两者的不同在于
@Autowired
作用:自动装配Bean之间的依赖关系,Spring会根据类型(byType)或者构造器/属性上的注解(如果有的话)进行自动匹配并注入。
默认行为:默认按照类型进行自动装配,如果有多个相同类型的候选者,如果没有指定限定符,那么必须保证只有一个bean类型与目标字段或方法参数类型匹配,否则将抛出异常。
可选性:从Spring 4.3开始,对于非必需的字段和单参数构造函数,默认为可选的。可以通过设置required = true/false明确指定是否必须。
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
}
@Resource
来源:@Resource 是Java EE规范的一部分(JSR-250),Spring也对其提供了支持。
名称解析策略:默认情况下,@Resource是基于名称(byName)进行注入的,即查找与被注解字段或方法名相同的Bean名称进行注入。但如果同时指定了name属性,则按照指定的名称进行注入。
限定符:通过name属性可以更精确地指定需要注入的Bean名称,这对于同一类型的多个Bean实例非常有用。
@Service
public class UserService {
@Resource(name = "userRepository")
private UserRepository userRepository;
}
总结:
如果仅关注类型匹配注入,且确保每个类型在容器中只存在一个 Bean,使用 @Autowired 更简洁直观。
当需要根据 Bean 名称进行注入,或者有多个相同类型的 Bean 需要区分时,应选择 @Resource 并指定 name 属性