为了便于二次开发定制产品代码,定义了OverrideExsitsBean,凡是标记此注解的Bean都将覆盖其父类,框架需要实现凡是使用到其父类的地方都要创建一个此类的实例。实现此功能,自然从Spring入手最彻底,这样Action、Service/Manager都能够支持这种特性。
Spring创建Bean的工厂是DefaultListableBeanFactory,自然扩展此类即可。但是Web.xml中可以接触到的是ContextLoaderListener。因此我们需要先扩展ContextLoaderListener,确保ContextLoaderListener创建的是我们扩展的DefaultListableBeanFactory:
public class StmgContextLoaderListener extends ContextLoaderListener {
@Override
public void contextInitialized(ServletContextEvent event) {
String packages = event.getServletContext().getInitParameter(CONFIG_PACKAGES_PARAM);
packagesToScan = packages!=null ? packages.split(",") : null;
super.contextInitialized(event);
SpringTools.context = WebApplicationContextUtils.getWebApplicationContext(event.getServletContext());
}
@Override
protected ContextLoader createContextLoader() {
ContextLoader contextLoader = new ContextLoader() {
@Override
protected Class determineContextClass(ServletContext servletContext) throws ApplicationContextException {
Class contextClass = super.determineContextClass(servletContext);
if(contextClass == XmlWebApplicationContext.class) {
return XmlWebApplicationContextExt.class;
}
return contextClass;
}
@Override
protected WebApplicationContext createWebApplicationContext(
ServletContext servletContext, ApplicationContext parent) throws BeansException {
Class contextClass = determineContextClass(servletContext);
if (!ConfigurableWebApplicationContext.class.isAssignableFrom(contextClass)) {
throw new ApplicationContextException("Custom context class [" + contextClass.getName() +
"] is not of type [" + Conf