Spring @Resource注释

时间:2020-01-09 10:44:35  来源:igfitidea点击:

除了使用@Autowired批注之外,在Spring中进行自动装配还支持JSR 330的@Inject批注和JSR-250 @Resource批注。在本文中,我们将介绍如何使用Spring @Resource批注进行自动装配。

Spring中的@Resource注释

@Resource批注可用于字段或者bean属性设置器方法。 @Resource具有名称属性。默认情况下,Spring将该值解释为要注入的Bean名称。换句话说,此注释遵循autowire = by-name语义。

例如

@Service
public class OrderService {
  private IStore store;
  // Autowired on Setter
  @Resource(name="retailStoreBean")
  public void setStore(IStore store) {
    this.store = store;
  }
  public void buyItems() {
    store.doPurchase();
  }
}

Spring将在存储属性中寻找一个名为" retailStoreBean"的bean注入此处。

用@Resource批注指定的名称是可选的。如果未明确指定名称,则默认名称是从字段名称或者setter方法派生的。
如果是字段,则使用字段名称。在使用setter方法的情况下,它采用bean属性名称。

如果@Resource注释找不到同名的bean,它将尝试使用type进行匹配。因此,如果不满足按名称自动装配的要求,还可以自动切换到autowire = byType。

Spring @Resource注释示例

在该示例中,有一个用于下订单的类称为OrderService,可以从商店进行购买。在OrderService类中,必须自动关联商店的依赖关系,并为其使用@Resource批注。

javax.annotation.Resource是javax.annotation API的一部分,因此我们可能需要添加该依赖项才能使用@Resource批注。

<dependency>
    <groupId>javax.annotation</groupId>
    <artifactId>javax.annotation-api</artifactId>
    <version>1.3.2</version>
</dependency>

OrderService.java

import javax.annotation.Resource;
import org.springframework.stereotype.Service;

@Service
public class OrderService {
  private IStore store;
  // Autowired on Setter
  @Resource(name="retailStoreBean")
  public void setStore(IStore store) {
    this.store = store;
  }
  public void buyItems() {
    store.doPurchase();
  }
}

这里name属性的值是" retailStoreBean",这意味着应该有一个必须将此名字注入到store属性中的bean。

istore界面

public interface IStore {
  public void doPurchase();
}

RetailStore.java

@Component("retailStoreBean")
public class RetailStore implements IStore {
  public void doPurchase() {
    System.out.println("Doing purchase from Retail Store");
  }
}

Bean的名称为" retailStoreBean",这是此Bean在容器中注册的名称。

XML配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans.xsd   
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context.xsd">

    <context:component-scan base-package="com.theitroad" />

</beans>

类运行示例

public class App {
  public static void main(String[] args) {
    ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("appcontext.xml");
    OrderService orderService = context.getBean("orderService", OrderService.class);
    orderService.buyItems();
  }
}

输出:

Doing purchase from Retail Store

如果名称被删除,则代码直到@Resource都将切换为byType自动装配。

@Resource
public void setStore(IStore store) {
  this.store = store;
}