直接上代码 很简单一看就懂了
这是我自写的一个与mybatis类似的orm框架与spring集成的两个主要的类,希望能给和同样想自造轮子的童鞋抛出一块砖头
BeanFactory
package org.smile.orm.spring; import org.smile.orm.dao.MapperProxy; import org.springframework.beans.factory.FactoryBean; public class MapperBeanFactory<T> implements FactoryBean<T>{ private MapperProxy<T> proxy; private Class<T> type; private boolean singleton; @Override public T getObject() throws Exception { if(singleton){ return proxy.getInterfaceDao(); }else{ return MapperProxy.copy(proxy).getInterfaceDao(); } } @Override public Class<T> getObjectType() { return type; } @Override public boolean isSingleton() { return singleton; } public void setSingleton(boolean singleton) { this.singleton = singleton; } public void setProxy(MapperProxy<T> proxy){ this.proxy=proxy; } public void setType(Class<T> type) { this.type = type; } }
SpringXmlApplication
package org.smile.orm.spring; import org.smile.orm.dao.DaoMapper; import org.smile.orm.dao.MapperProxy; import org.smile.orm.load.ClassPathXmlApplication; import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.springframework.beans.factory.support.BeanDefinitionRegistry; import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor; import org.springframework.beans.factory.support.DefaultListableBeanFactory; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; public class SpringXmlApplication extends ClassPathXmlApplication implements BeanDefinitionRegistryPostProcessor,ApplicationContextAware{ private DefaultListableBeanFactory acf ; @Override public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry beanDefin) throws BeansException { initOrmApplication(); BeanDefinitionBuilder bdb; for(DaoMapper<?> mapper:application.getAllMapper()){ bdb = BeanDefinitionBuilder.rootBeanDefinition(MapperBeanFactory.class.getName()); bdb.getBeanDefinition().setAttribute("id", mapper.getName()); bdb.addPropertyValue("proxy", new MapperProxy(application, mapper)); bdb.addPropertyValue("type", mapper.getDaoClass()); bdb.addPropertyValue("singleton", mapper.isSingle()); // 注册bean acf.registerBeanDefinition(mapper.getName(), bdb.getBeanDefinition()); } } @Override public void postProcessBeanFactory(ConfigurableListableBeanFactory factory) throws BeansException { } @Override public void setApplicationContext(ApplicationContext context) throws BeansException { this.acf=(DefaultListableBeanFactory)context.getAutowireCapableBeanFactory(); } }
ClassPathXmlApplication
扫描二维码关注公众号,回复:
776610 查看本文章
package org.smile.orm.load; import java.util.List; import javax.naming.NamingException; import javax.sql.DataSource; import org.smile.db.DbManager; import org.smile.db.Dialect; import org.smile.orm.OrmApplication; import org.smile.orm.dao.BaseExecutor; import org.smile.orm.dao.Executor; public class ClassPathXmlApplication implements Application{ protected DataSource dataSource; protected List<String> packageString; protected OrmApplication application; protected Dialect dialect; @Override public void setDataSource(Object dataSource) { if(dataSource instanceof DataSource){ this.dataSource=(DataSource)dataSource; }else{ try { this.dataSource = DbManager.getDataSource(String.valueOf(dataSource)); } catch (NamingException e) { e.printStackTrace(); } } } @Override public void setPackageString(List<String> packageString) { this.packageString = packageString; } @Override public void initOrmApplication(){ application=new OrmApplication(); application.setPackageString(packageString); Executor executor=new BaseExecutor(); executor.setDataSource(dataSource); executor.setDialect(dialect); application.setExecuter(executor); application.init(); } @Override public OrmApplication getOrmApplication() { return application; } @Override public void setDialect(String dialect) { this.dialect=Dialect.of(dialect); } }
spring 中的配置
<bean id="dataSource" class="org.smile.db.DataSourceBean"> <property name="name" value="mysql"></property> </bean> <bean id="ormappliction" class="org.smile.orm.spring.SpringXmlApplication"> <property name="dataSource" ref="dataSource"></property> <property name="dialect" value="mysql"></property> <property name="packageString"> <list> <value>dbmapper</value> </list> </property> </bean>