@Autowired与@Resource区别
@Resource和@Autowired都是Spring框架中用于自动注入依赖对象的注解。它们的主要区别如下:
@Autowired
@Autowired注解是由Spring提供的,它可以用来对构造方法、成员变量及方法参数进行标记,它能够根据对象类型完成自动注入
@Autowired默认按type自动装配
当注入的类型在容器中存在多个时,需要指定默认注入对象(@Primary
注解标记的类),或者指定注入对象beanName(@Qualifier("beanName")
)
@Autowired
注解标记的变量注入时,在项目启动时,默认会校验是否存对应类型的bean,如果没有会报错,可以通过修改注解属性@Autowired(required = false)
不做校验
代码示例如下
public interface StockService{
}
public interface StockService2{
}
@Service("StockServiceImpl1")
@Primary
public class StockServiceImpl1 implements StockService{
}
@Service("StockServiceImpl2")
public class StockServiceImpl2 implements StockService{
}
@Service
public class OrderServiceImpl{
private StockService stockService1;
@Autowired(required = false)
private StockService2 stockService22;
// 构造方法注入
@Autowired
public OrderServiceImpl(StockService stockService) {
this.stockService1 = stockService;
}
// 成员变量注入
@Autowired
@Qualifier("StockServiceImpl2")
private StockService stockService2;
private StockService stockService3;
// 方法参数注入
@Autowired
public void setStockService(StockService stockService) {
this.stockService3 = stockService;
}
}
@Resource
它是由JDK提供的,遵循JSR-250规范,是JDK 1.6及以上加入的新特性
与@Autowired不同的是,它适用于所有的Java框架,而@Autowired只适用于Spring
@Resource
能够支持对象类型注入,也能够支持对象名称注入。
@Resource
有两个最重要的属性:name和type。
如果指定name,则从上下文中查找与名称(ID)匹配的Bean进行装配,如果找不到则抛出异常
如果指定type,则从上下文中找到与类型匹配的唯一Bean进行装配,如果找不到或者找到多个就会抛出异常
如果既没有指定name,也没有指定type,则自动按byName方式进行装配。如果没有匹配成功,则仍按照type进行匹配
@Resource
支持成员变量,方法注入,不支持构造器注入
@Resource
注解标记的变量注入时,在项目启动时,默认会校验是否存对应类型的bean,如果没有会报错
示例代码如下
@Service
public class OrderServiceImpl{
// 成员变量注入
@Resource(name = "StockServiceImpl2")
private StockService stockService2;
private StockService stockService3;
// 方法参数注入
@Resource
public void setStockService(StockService stockService) {
this.stockService3 = stockService;
}
}
总结
因为目前 spring 不推荐使用 成员变量注入 @Autowired
, 推荐使用构造器注入
为了日常简单方便使用,推荐使用@Resource