如果我的 ApplicationContext 中有 2 个 bean 实现相同的接口(interface),我可以在 bean 定义中将其中一个标记为主要 bean。此 bean 更适合依赖注入(inject)。
有没有一种方法可以使用 ApplicationContext 直接访问主应用程序而不需要 DI?
最佳答案
有很多不同的方法可以做到这一点。
在主 bean 定义中设置 Primary="true"。设置此值后,如果有多个自动布线候选者,则主要者将获得更高的优先级。
<beans ...> <bean id="myPrimaryBeanId" class="mypackage.MyInterface" primary="true"/> <bean id="mySecondaryBeanId" class="mypackage.MyInterface" /> </beans>
或者,如果您认为该 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>
通过使用命名依赖项使自动连接注释更加具体,可以使用 @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/