package com.smtservlet.core; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.beans.factory.support.BeanDefinitionRegistry; import org.springframework.beans.factory.xml.XmlBeanDefinitionReader; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationListener; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.event.ContextRefreshedEvent; import org.springframework.core.io.Resource; import org.springframework.web.context.ContextLoader; import org.springframework.web.context.WebApplicationContext; import com.smtservlet.util.SMTMergeSpringXml; /** * 系统启动时自动初始化SMTApp用的类 */ //@Component("BeanDefineConfigue") public final class SMTWebStartup implements ApplicationListener { @Override public void onApplicationEvent(ContextRefreshedEvent event) { try { // 通过事件获取当前web context WebApplicationContext web = ContextLoader.getCurrentWebApplicationContext(); if(web == null) { ApplicationContext app = event.getApplicationContext(); if(app instanceof WebApplicationContext) web = (WebApplicationContext) event.getApplicationContext(); if(web == null) return; } // 合并生成spring-config.xml Resource[] resources = web.getResources("classpath*:spring-config-*.xml"); SMTMergeSpringXml merge = new SMTMergeSpringXml(); for(Resource resource : resources) { merge.mergeXml(resource.getInputStream()); } Resource rsMeageXML = merge.finishXML(); // 通过当前yml设置,获取要动态加载的主程序的bean ConfigurableListableBeanFactory beanFactory=((ConfigurableApplicationContext) web).getBeanFactory(); XmlBeanDefinitionReader xmlBeanDefinitionReader=new XmlBeanDefinitionReader((BeanDefinitionRegistry) beanFactory); xmlBeanDefinitionReader.loadBeanDefinitions(rsMeageXML); Object app = web.getBean("SMTApplication"); // 启动app SMTApp.setThis((SMTApp)app); SMTApp.getThis().webStartup(web); } catch(Exception ex) { throw new RuntimeException(ex); } } }