对于Spring bean定义,覆盖default-lazy-init = true

Jon*_*Jon 14 java spring

我正在维护一个大型Java EE系统.大多数的业务逻辑从EJB转换:■成POJO:■在若干弹簧上下文配置文件来配置.EJB:s主要用作Facade,它从由前面提到的所有spring上下文配置文件组成的上下文中查找业务逻辑spring bean.为此,我们使用spring框架提供的AbstractStatelessSessionBean.

所有这些配置文件都具有default-lazy-init = true指令,这意味着在系统实际使用业务逻辑bean之前不会创建它们.这在大多数情况下是优选的,因为在开发者模式中重新发布变得更快.

但是,当进行大型合并时,我们在查找所有配置错误时遇到问题,例如缺少依赖项.

我的想法是编写某种形式的集成测试,目的是找到那些错误.这意味着,我认为,我需要找到一种方法来在创建应用程序上下文时覆盖所有default-lazy-init = true声明.

有没有办法以编程方式执行此操作,或者可能使用包含所有实际上下文文件的某些仅测试上下文文件?

Tom*_*icz 15

假设您目前有一个applicationContext.xml包含所有bean定义的文件:

<beans default-lazy-init="true">

    <!-- all your beans -->

</beans>
Run Code Online (Sandbox Code Playgroud)

将其重命名为applicationContext-main.xml或者删除default-lazy-init="true"属性.现在创建两个applicationContext.xml文件:

<beans default-lazy-init="true">

    <import resource="applicationContext-core.xml"/>

</beans>
Run Code Online (Sandbox Code Playgroud)

和:

<beans default-lazy-init="false">

    <import resource="applicationContext-core.xml"/>

</beans>
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,唯一的区别是价值default-lazy-init.在开发过程中,您的团队可以使用applicationContext.xml包含所有bean 的前一版本lazy-init.在登台和测试环境中,将其切换到后者,以便applicationContext-core.xml急切地创建包含在内的所有bean .

  • 对于我的Spring版本3.1.2,在顶级bean元素上设置default-lazy-init不适用于导入资源中的bean.在这方面,我同意pootow.谁知道它是否在不同版本的弹簧下工作; 它很可爱.乔恩说,我必须做的事情. (3认同)
  • 它适用于Spring 3.2.3(未检查较小版本).但是,您必须删除default-lazy-init/lazy-init属性或将它们设置为"default"以使用"inheritance"(父默认值). (2认同)

Jon*_*Jon 8

我认为控制懒惰初始化bean的最好方法是将所有配置文件中的default-lazy-init保留在除Tomasz Nurkiewicz建议的最顶层之外.但是,在这种情况下,我需要快速而又脏的修复来验证所有bean定义.(这是一个改变延迟初始化策略的过程.)

我想出了一个简单的BeanFactoryPostProcessor,似乎可以完成这项工作:

public class NonLazyInitBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
        for (String beanName : beanFactory.getBeanDefinitionNames()) {
            beanFactory.getBeanDefinition(beanName).setLazyInit(false);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果包含在上下文文件中,它将覆盖由任何包含的上下文文件设置的惰性init标志.

<beans default-lazy-init="false">
    <bean class="example.NonLazyInitBeanFactoryPostProcessor" />
    <import resource="applicationContext-core.xml"/>
</beans>
Run Code Online (Sandbox Code Playgroud)

如果我尝试从上面的xml创建一个上下文,之前由延迟初始化隐藏的配置错误将立即显示为异常.