【问题标题】:How to control sequence of Spring beans creation?如何控制 Spring bean 创建的顺序?
【发布时间】:2016-06-19 00:31:10
【问题描述】:

我正在使用一些已部分迁移到 spring 的第三方 jars。痛点是有很多初始化模块没有迁移到spring。在创建大量 bean 之前,需要先执行初始化模块。

我还阅读了Spring 3 bean instantiation sequence,这里的问题是,第三方库使用@Component 来创建bean(这取决于未迁移到spring 的初始化模块,接线对吗...?)。

现在我可以编写一个 spring bean 来包装所有初始化模块。并在需要它的 bean 之前创建 bean。

那么有没有办法指定bean创建顺序先创建初始化bean呢?

我还检查了一些文档,spring bean 创建是在单线程中进行的,所以这可以工作。

【问题讨论】:

    标签: java spring


    【解决方案1】:

    您可以使用 BeanPostProcessor 并将您的初始化模块添加为依赖项

    <?xml version="1.0" encoding="UTF-8" standalone="no"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd">
    
    <bean class="com.foo.CustomBeanPostProcessor" depends-on="com.foo.InitModuleBean"/>
    <bean class="com.foo.BarBean" />
    <bean id="com.foo.InitModuleBean" class="com.foo.InitModuleBean" />
    </beans>
    

    【讨论】:

      【解决方案2】:

      您将初始化为第一个 Bean 的 wraperBean 放在 xmlConfig 文件中,然后 spring 将通过初始化该 Wraper 来处理初始化 另一种解决方案是将 depends-on 属性添加到依赖于该 Wrapper 的所有 bean 并指定像这样的depends-on 属性中的包装器 bean 的 ID

      <beans xmlns="http://www.springframework.org/schema/beans"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
      
      <bean id="modules" class="com.mycompany.ModulesWrapper" />
      <bean class="com.foo.ClientBean" depends-on="modules" />
      </beans>
      

      【讨论】:

      • 复杂的部分是豆子太多,需要启用扫描来创建这些豆子。似乎spring xml中的顺序不适用于扫描?
      • 您是否尝试将 放在 xml 配置文件的末尾,这将强制 spring 实例化这些 bean最后
      • 如果这不起作用,您可以发布您的配置文件
      猜你喜欢
      • 2018-06-26
      • 1970-01-01
      • 1970-01-01
      • 2019-12-25
      • 2017-03-12
      • 1970-01-01
      • 2012-03-11
      • 2019-04-03
      相关资源
      最近更新 更多