一、前言
最近在做业务基础架构的重构,需要将大量规则类通过核心层代码在抽象层注入进来,以保证开发层的高度不可见(不能将大量的规则类暴露在spring的bean配置文件或auto注入上、或鉴于规则动态、顺序加载等需要),这边借助于org.springframework.beans.factory.config.ConfigurableListableBeanFactory代码层面注入规则bean方式示例
二、主要代码
下面通过SpringBean(spring-beans-3.0.2.RELEASE.jar.zip)的registerSingleton方法可以向spring上下文中直接注入Bean
import javax.sql.DataSource;@b@import org.springframework.beans.BeansException;@b@import org.springframework.beans.factory.config.BeanFactoryPostProcessor;@b@import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;@b@import org.springframework.context.support.ClassPathXmlApplicationContext;@b@import org.springframework.core.io.ClassPathResource;@b@import org.springframework.core.io.Resource;@b@import org.mybatis.spring.SqlSessionFactoryBean;@b@import org.mybatis.spring.mapper.MapperScannerConfigurer;@b@import com.xwood.pms.dao.impl.CommonDao;@b@@b@ @b@public class SpringBean<O> {@b@@b@ public static ClassPathXmlApplicationContext context;@b@ @b@ private static String _paramString;@b@ @b@ private static Object _paramObject;@b@ @b@ static{@b@ context = new ClassPathXmlApplicationContext(@b@ "classpath:test/applicationContext.xml");@b@ @b@ }@b@ @b@ public static void registerSingleton(String paramString, Object paramObject){@b@ @b@ _paramString=paramString;@b@ _paramObject=paramObject;@b@ @b@ context.addBeanFactoryPostProcessor(new BeanFactoryPostProcessor(){@b@ @Override@b@ public void postProcessBeanFactory(@b@ ConfigurableListableBeanFactory beanFactory)@b@ throws BeansException {@b@ beanFactory.registerSingleton(_paramString,_paramObject);@b@ };@b@ @b@ });@b@ }@b@ @b@ public static Object getBean(String id){@b@ return (Object)context.getBean(id);@b@ }@b@ @b@ public O getBean_(String id){@b@ @b@ return (O)context.getBean(id);@b@ }@b@ @b@ public static void main(String[] args){@b@ @b@ @b@ //1.获取bean@b@ CommonDao bdao=(CommonDao)SpringBean.getBean("commonDao");@b@ System.out.println("##");@b@ @b@ @b@ //2.注入mybatis@b@ SqlSessionFactoryBean _factorybean=new SqlSessionFactoryBean();@b@ _factorybean.setDataSource((DataSource)SpringBean.getBean("dataSource"));@b@ _factorybean.setMapperLocations(new Resource[]{new ClassPathResource(_defaultCoreMapperLocations)});@b@ _factorybean.setTypeAliasesPackage(defaultCorePackage+".record");@b@ @b@ registerSingleton("sqlSessionFactoryCore",_factorybean);@b@@b@ MapperScannerConfigurer _configurer=new MapperScannerConfigurer();@b@ _configurer.setBasePackage(defaultCorePackage+".dao");@b@ _configurer.setMarkerInterface(com.xwood.core.bean.InitialzationBeanMapper.class);@b@ _configurer.setSqlSessionFactoryBeanName("sqlSessionFactoryCore");@b@ @b@ registerSingleton("mapperScannerConfigurerCore",_configurer);@b@ @b@ }@b@ @b@}