java - Spring:通过ApplicationContext访问主bean

标签 java spring dependency-injection javabeans autowired

如果我的 ApplicationContext 中有 2 个 bean 实现相同的接口(interface),我可以在 bean 定义中将其中一个标记为主要 bean。此 bean 更适合依赖注入(inject)。

有没有一种方法可以使用 ApplicationContext 直接访问主应用程序而不需要 DI?

最佳答案

有很多不同的方法可以做到这一点。

  1. 在主 bean 定义中设置 Primary="true"。设置此值后,如果有多个自动布线候选者,则主要者将获得更高的优先级。

    <beans ...>
      <bean id="myPrimaryBeanId" class="mypackage.MyInterface" primary="true"/>
      <bean id="mySecondaryBeanId" class="mypackage.MyInterface" />
    </beans> 
    
  2. 或者,如果您认为该 Bean 不应该自动连接到任何 Bean,则可以为非主 Bean 设置 autowire-candidate="false"。但是,在定义具有相同接口(interface)的另一个 bean 时需要小心,如果忘记添加它,将会再次出现多个主 bean。

    <beans ...>
      <bean id="myPrimaryBeanId" class="mypackage.MyInterface"/>
      <bean id="mySecondaryBeanId" class="mypackage.MyInterface"
          autowire-candidate="false"/>
    </beans>    
    
  3. 通过使用命名依赖项使自动连接注释更加具体,可以使用 @javax.annotation.Resource 注释来归档该依赖项,如下所示。这将降低确定可能注入(inject)哪个 bean 的代码复杂性,因为我们可以简单地通过 id 定位 bean。

    @Resource(name="myPrimaryBeanId")
    protected MyInterface myInstance;
    

非依赖注入(inject)(DI)方法

如果您不想使用 DI,您可以使用以下命令从 ApplicationContext 中按名称获取 Bean

MyInterface myInstance = (MyInterface) 
    applicationContext.getBean("myPrimaryBeanId");

如果您想使用非 DI 方法,但从 Spring bean 进行操作,并且您没有 Spring 上下文的句柄来执行此操作,则可以更改您的类以实现 org.springframework.context.ApplicationContextAware接口(interface),这将要求您实现 setApplicationContext(ApplicationContext) 方法,spring 会将句柄注入(inject)到当前应用程序上下文中,如下所示。

public class MyBean implements ApplicationContextAware {

  private ApplicationContext applicationContext;

  private String MY_PRIMARY_BEAN_ID = "myPrimaryBeanId";

  public void myMethod() {
    MyInterface myInstance = getMyPrimaryBean();

    // do my logic here
  }

  private MyInterface getMyPrimaryBean() {
    return (MyInterface) applicationContext.getBean(MY_PRIMARY_BEAN_ID);
  }

  @Override
  public void setApplicationContext(ApplicationContext applicationContext)
      throws BeansException {
    this.applicationContext = applicationContext;
  }

}

注意:此答案基于 Spring 2.5.x

关于java - Spring:通过ApplicationContext访问主bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7875275/

相关文章:

java - 创建一个在数组列表中交换两个整数位置的方法

java - 我用不同的方法实现了相同的函数,有人能告诉我为什么我的最后一个函数不打印 false 吗?

java - 从 json 对象生成 pdf 文档

java - 无法解析占位符

java - Spring JWT签名验证失败

dependency-injection - 帮助开始使用 MEF

dependency-injection - 如何在 UML 中建模依赖注入(inject)?

java - Scala:加载 Java 属性

java - Session.close() 对 Spring openSessionInView 有影响吗?

java - 如何在非托管实例中 Autowiring 类?