我正在维护一个大型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 .
我认为控制懒惰初始化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创建一个上下文,之前由延迟初始化隐藏的配置错误将立即显示为异常.
| 归档时间: |
|
| 查看次数: |
27978 次 |
| 最近记录: |