我有一个库,用于运行时设置和配置log4j(没有log4j.properties或log4j.xml)。我已经使用名为MyLoggerFactory的类定义了一个bean,我希望这是第一个使用spring初始化的bean。我已经看到一个问题已经提交给spring以支持初始化顺序但是我想知道是否有办法将bean标记为第一个由spring容器初始化的bean?
答案 0 :(得分:41)
您的选择是:
@DependsOn
注释(在春季3.0.x之后可用)或depends-on
xml-attribute,并使所有使用配置记录器的类依赖于记录器工厂main()
方法,或者在初始化Spring之前注册的ServletContextListener
。没有办法在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"/>