直接上代码 很简单一看就懂了
这是我自写的一个与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
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>