如何避免 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。