Spring:确保首先初始化特定的bean

时间:2011-10-23 18:49:49

标签: java spring

我有一个库,用于运行时设置和配置log4j(没有log4j.properties或log4j.xml)。我已经使用名为MyLoggerFactory的类定义了一个bean,我希望这是第一个使用spring初始化的bean。我已经看到一个问题已经提交给spring以支持初始化顺序但是我想知道是否有办法将bean标记为第一个由spring容器初始化的bean?

4 个答案:

答案 0 :(得分:41)

您的选择是:

  1. 使用@DependsOn注释(在春季3.0.x之后可用)或depends-on xml-attribute,并使所有使用配置记录器的类依赖于记录器工厂
  2. 使工厂成为记录器的实际工厂,并将记录器注入bean而不是直接调用工厂 - 这与选项1基本相同,除非隐含依赖性。这是我推荐的选项。
  3. 将初始化代码移动到代码的一部分,其中指定了调用顺序 - main()方法,或者在初始化Spring之前注册的ServletContextListener
  4. 没有办法在Spring中明确定义初始化顺序,并且可能永远不会 - 考虑到你可以加载许多可能具有冲突排序的应用程序上下文配置文件,没有办法为它定义有用的语义。我还没有看到通过重构代码来更好地符合依赖注入模式而无法实现所需顺序的情况。

答案 1 :(得分:12)

您可以在主@Configuration

中@Autowired @Configuration
@Configuration
@Import(BusinessConfig.class, EarlyBeans.class)
public class MainConfiguration {

    // The bean defined in EarlyBean will be loaded before 
    // most beans references by MainConfiguration, 
    // including those coming from BusinessConfig
    @Autowired
    EarlyBean earlyBean;

}

@Configuration
public class EarlyBeans {
    @Bean
    public Void earlyBean(ApplicationContext appContext) {
        // .getBeansOfType allows to call for beans which might not exist
        appContext.getBeansOfType(TechnicalBean.class);

        return null;
    }

}

答案 2 :(得分:3)

这是要求但未解决的功能。你可以使用依赖,但是太冗长了。请访问tis链接以获取更多信息: https://jira.springsource.org/browse/SPR-3948

答案 3 :(得分:1)

您可以将应用程序上下文拆分为多个,并在主应用程序上下文中使用import。您可以按导入顺序放置主环境设置,然后继续添加其他文件。

可能如下所示。

<!-- Import environment properties settings. -->
<import resource="Spring-Env.xml"/>
<!-- Import All the other Application contexts. -->
<import resource="Spring-MainApplicationContext.xml"/>