Spring:确保一个特定的bean首先被初始化
我有一个库做运行时设置和configurationlog4j(没有log4j.properties或log4j.xml)。 我已经定义了一个名为MyLoggerFactory的类,我希望这是第一个使用spring初始化的bean。 我已经看到spring已经提出了一个问题来支持初始化的顺序,但是我想知道是否有一种方法将bean标记为第一个被spring容器初始化的bean?
您的select是:
- 使用
depends-on
属性并使所有使用configuration的logging器的类都依赖于logging器工厂 - 使工厂成为logging器的实际工厂,并将logging器注入到bean中,而不是直接调用工厂 – 除了隐含依赖之外,它基本上与选项1相同。 这是我推荐的选项。
- 将初始化代码移动到代码中指定调用顺序的部分 –
main()
方法或在初始化Spring之前注册的ServletContextListener
。
在Spring中没有办法显式地定义初始化顺序,而且可能永远不会 – 因为你可以加载许多可能有冲突的应用程序上下文configuration文件,所以没有办法为它定义有用的语义。 我还没有看到通过重构代码以更好地符合dependency injection模式无法实现所需sorting的情况。
你可以在主@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; } }
这是一个function请求,但没有解决。 你可以使用depends-on,但是太冗长了。 按照tis链接获取更多信息: https : //jira.springsource.org/browse/SPR-3948
您可以将应用程序上下文分成多个,并在主应用程序上下文中使用导入。 您可以首先按照导入的顺序放置主环境设置,然后继续添加其他文件。
它可能如下所示。
<!-- Import environment properties settings. --> <import resource="Spring-Env.xml"/> <!-- Import All the other Application contexts. --> <import resource="Spring-MainApplicationContext.xml"/>