java - spring是什么 - spring菜鸟教程




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

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


你可以@Autowired @Configuration中的@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;
    }

}

你的选择是:

  1. 使用@DependsOn注释(在Spring 3.0.x之后可用)或depends-on xml-attribute并使所有使用配置的记录器的类都依赖于记录器工厂
  2. 使工厂成为记录器的实际工厂,并将记录器注入bean而不是直接调用工厂 - 这与选项1基本相同,除非隐含依赖性。 这是我推荐的选项。
  3. 将初始化代码移动到指定调用顺序的代码的一部分 - main()方法,或者在初始化Spring之前注册的ServletContextListener

没有办法在Spring中明确定义初始化顺序,并且可能永远不会 - 考虑到你可以加载许多可能具有冲突排序的应用程序上下文配置文件,没有办法为它定义有用的语义。 我还没有看到通过重构代码以更好地符合依赖注入模式无法实现所需顺序的情况。






spring