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