在模块化的Spring配置应用程序中,我们使用工厂bean跨模块边界提供bean实例。
例如,一个模块 A 可以通过名称名称公开bean实例。然后,另一个模块 B 可以通过样式
的声明来使用该bean<bean id="nameBean" class="com.zfabrik.springframework.ComponentFactoryBean">
<property name="componentName" value="A/name" />
<property name="className" value="a.AInterface" />
</bean>
请注意,模块具有分离的类加载器层次结构, A 的实际实现类可能在 B 中不可见。好像在OSGI中(尽管这不是OSGi)。
我的目标是在 B 的程序化应用程序环境中提供 A / name 。但是在尝试时
@Configuration
public static class AppContext {
@Bean AInterface nameBean() {
return lookup("A/name",AInterface.class);
}
}
(查找实际的实例检索)我看到Spring正在尝试配置返回的实例。例如,它将尝试解析 A / names 的实现类的@Autowired属性 - 这在 B 的上下文中没有意义(并且处理查询是为了提供完全配置的东西。甚至,如果我尝试
@Configuration
public static class AppContext {
@Bean(autowire=Autowire.NO) AInterface nameBean() {
return lookup("A/name",AInterface.class);
}
}
它将用于配置返回的实例。
如何在不触及其实现实例的情况下向应用程序上下文提供bean?
编辑:正如Sotirios Delimanolis所建议的,返回FactoryBean确实AFAICT避免了返回实例的Spring配置。替代代码如下所示:
@Configuration
public static class AppContext {
@Bean FactoryBean<AInterface> nameBean() {
return new ComponentFactoryBean("A/name",AInterface.class);
}
}
由于返回类型中的FactoryBean,它不像@UntouchedBean注释那么酷,但它解决了问题。
@Sotirios:请建议作为答案,以便我可以相应地标记您的建议。
/编辑
答案 0 :(得分:0)
好的,就这样可以关闭。建议和接受的答案是返回工厂bean。