package org.test4j.module.spring.strategy; import org.springframework.beans.BeansException; import org.springframework.beans.factory.parsing.DefaultsDefinition; import org.springframework.beans.factory.parsing.EmptyReaderEventListener; import org.springframework.beans.factory.support.DefaultListableBeanFactory; import org.springframework.beans.factory.xml.BeanDefinitionParserDelegate; import org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader; import org.springframework.beans.factory.xml.DocumentDefaultsDefinition; import org.springframework.beans.factory.xml.XmlBeanDefinitionReader; import org.test4j.module.core.utility.IPropConst; import org.test4j.module.spring.annotations.SpringContext; import org.test4j.tools.commons.AnnotationHelper; @SuppressWarnings("rawtypes") public class LazySpringContext extends Test4JSpringContext { public LazySpringContext(String[] configLocations, boolean refresh) throws BeansException { super(configLocations, refresh, true); } @Override protected Class getTestedClazzz() { Class testedClazz = super.getTestedClazzz(); Class declareAnnotationClazz = AnnotationHelper.getClassWithAnnotation(SpringContext.class, testedClazz); if (declareAnnotationClazz == null) { throw new RuntimeException( "there must be some error, can't find @SpringApplicationContext annotation declared by class[" + testedClazz.getName() + "] or it's parent."); } return declareAnnotationClazz; } /** * {@inheritDoc}<br> * <br> * 但在共享模式中取消动态加载模式,改为全部从文件中读取 */ @Override protected void dynamicRegisterBean(DefaultListableBeanFactory beanFactory, Class testedClazz) { } /** * 下面这段本来想将spring初始化时所有的bean都置成lazy-init的模式<br> * 但实现中碰到问题,主要是tracer的aop初始化上出错。 */ @Override protected void initBeanDefinitionReader(XmlBeanDefinitionReader beanDefinitionReader) { if (IPropConst.SPRING_LAZY_LOAD) { beanDefinitionReader.setEventListener(new Test4JReaderEventListener()); } } /** * @Override protected void customizeBeanFactory(DefaultListableBeanFactory * beanFactory) { super.customizeBeanFactory(beanFactory); * beanFactory.setAllowEagerClassLoading(false); } */ /** * 自定义spring ReaderEventListener<br> * 参见{@link DefaultBeanDefinitionDocumentReader} 和 * {@link BeanDefinitionParserDelegate}的initDefaults方法 * * <pre> * 复写defaultsRegistered方法,在跑单元测试中,强制设置default-lazy-init=true属性 * </pre> */ public static class Test4JReaderEventListener extends EmptyReaderEventListener { @Override public void defaultsRegistered(DefaultsDefinition defaultsDefinition) { if (defaultsDefinition instanceof DocumentDefaultsDefinition) { DocumentDefaultsDefinition docDefault = (DocumentDefaultsDefinition) defaultsDefinition; docDefault.setLazyInit("true"); } } } }