当前位置: 首页 > 知识库问答 >
问题:

Spring:使用工厂bean创建任意数量的bean

束新
2023-03-14

我有一个factory-ish bean,它在启动时创建了许多对象,我希望这些对象本身就是Spring bean。

如果我创建一个对象,我可以使用工厂方法进行实例化,例如(来自Spring文档第4.3.2.3节):

<!-- the factory bean, which contains a method called createInstance() -->
<bean id="serviceLocator" class="examples.DefaultServiceLocator">
  <!-- inject any dependencies required by this locator bean -->
</bean>

<!-- the bean to be created via the factory bean -->
<bean id="clientService"
      factory-bean="serviceLocator"
      factory-method="createClientServiceInstance"/>

如果我提前知道我有n个对象,我可以调用n个不同的方法,但是我没有——我的工厂创建了任意数量的对象,而这些对象是提前不知道的。

有人知道怎么做吗?

目标是让它们成为“合适的”Spring bean,就像上面所说的那样;特别是,它们应该有资格作为源和目标自动装配。请注意,这意味着我不只是想返回一个集合,让它成为bean。

我使用XML配置的Spring 3.1。

共有1个答案

诸正谊
2023-03-14

看起来你需要动态的bean创建。。。

以前从未尝试过,但如本问题所述,您可以尝试使用BeanDefinitionBuilder。它似乎已经满足了你的所有需求。从你的工厂bean中使用它(现在真的不需要定义为工厂bean)。

编辑:我在这里找到了一个很好的用法示例。

比如:

String className = ... // get class name from wherever you get it

// Build your dynamic bean:
BeanDefinitionBuilder bdb = BeanDefinitionBuilder.genericBeanDefinition(className);
bdb.setSingleton(true);
// add dependencies:
bdb.addDependsOn(dependeeBeanName);
// Eventually - validate it and get it:
AbstractBeanDefinitionb bean = db.getBeanDefinition();

// I guess only now you get other already existing beans
// and make them depend on the one you created in the same way
 类似资料:
  • 我有一些Spring托管类(通过xml配置),其中一个是SessionFactory,它被注入到另一个Spring托管类中。每当该类需要一个新的会话时,它就调用SessionFactory上的createSession。

  • 我必须根据tenantIdentifier创建一个数据源bean以实现多租户。我正在考虑开箱即用的解决方案,添加新租户就像在context.xml中添加配置和在应用程序属性文件中添加租户属性一样简单,公开一个API来刷新我的context.xml以便从spring cloud config和属性文件中加载。 目前,我被这个错误所困扰: 我的DataSourceFactoryBean如下所示: 我有

  • 我需要执行从Micronaut到Spring应用程序的远程调用。为了创建必要的bean,我创建了一个工厂: 在我的Spock集成测试中,我需要模拟这些bean,我根据Micronaut文档进行了尝试:https://docs.micronaut.io/latest/guide/index.html#replaces 这导致了这样的测试: 这个解决方案效果不佳。如果这两个测试是单独运行的,那么这两个

  • 我是Spring Boot的新手,我想用Spring Boot制作一个rest Web服务。我需要使用Jpa/Hibernate在数据库中保存一些数据。当我用@Entity注释我的域模型类,并将应用程序作为Spring boot应用程序启动时(顺便说一下,我的应用程序类有一个@EntityScan()注释)我得到以下错误: 在类路径资源 [组织/Spring框架/启动/自动配置/orm/jpa/H

  • 我有一个问题,定义的存储库在服务器启动时没有被正确解释为bean。@SpringBootApplication的类位于比定义的存储库更高的目录中,所以我找不到为什么它不配置。 @SpringBootApplication: 资源库 错误代码: ***************************应用程序启动失败*************************** 说明: lab14中的字段us