如何在Java配置中避免Spring配置bean

时间:2015-09-30 13:59:38

标签: java spring spring-java-config

在模块化的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:请建议作为答案,以便我可以相应地标记您的建议。

/编辑

1 个答案:

答案 0 :(得分:0)

好的,就这样可以关闭。建议和接受的答案是返回工厂bean。