Mybatis-SpringMapperFactoryBean
Posted sleepingdogs
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mybatis-SpringMapperFactoryBean相关的知识,希望对你有一定的参考价值。
接上一节,BeanDefiniton设置
//1、BeanDefiniton将自己的构造器设置为自己的className definition.getConstructorArgumentValues().addGenericArgumentValue(definition.getBeanClassName()); //2、BeanDefiniton将自己的BeanClass设置为:MapperFactoryBean.class definition.setBeanClass(this.mapperFactoryBean.getClass()); //3、BeanDefiniton设置属性sqlSessionFactory definition.getPropertyValues().add("sqlSessionFactory", new RuntimeBeanReference(this.sqlSessionFactoryBeanName));
实例化Bean
1、调用构造方法实例化MapperFactoryBean
public MapperFactoryBean(Class<T> mapperInterface) this.mapperInterface = mapperInterface;
2、设置属性,MapperFactoryBean的父类SqlSessionDaoSupport.setSqlSessionFactory方法
public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) if (!this.externalSqlSession) this.sqlSession = new SqlSessionTemplate(sqlSessionFactory);
2、调用afterPropertiesSet
@Override public final void afterPropertiesSet() throws IllegalArgumentException, BeanInitializationException // Let abstract subclasses check their configuration. checkDaoConfig(); // Let concrete implementations initialize themselves. try initDao(); catch (Exception ex) throw new BeanInitializationException("Initialization of DAO failed", ex);
调用 checkDaoConfig,将mapperInterface放入configuration中,
configuration.addMapper(this.mapperInterface) 会解析 mapperInterface (mapperInterface)对应的XML和注解。
protected void checkDaoConfig() super.checkDaoConfig(); notNull(this.mapperInterface, "Property ‘mapperInterface‘ is required"); Configuration configuration = getSqlSession().getConfiguration(); if (this.addToConfig && !configuration.hasMapper(this.mapperInterface)) try configuration.addMapper(this.mapperInterface); catch (Exception e) logger.error("Error while adding the mapper ‘" + this.mapperInterface + "‘ to configuration.", e); throw new IllegalArgumentException(e); finally ErrorContext.instance().reset();
因为是FactoryBean,用到的是FactoryBean.getObject()返回的数据。
public T getObject() throws Exception return getSqlSession().getMapper(this.mapperInterface);
最终返回的是一个代理对象:mapperProxyFactory.newInstance(sqlSession);
public <T> T getMapper(Class<T> type, SqlSession sqlSession) MapperProxyFactory<T> mapperProxyFactory = (MapperProxyFactory)this.knownMappers.get(type); if (mapperProxyFactory == null) throw new BindingException("Type " + type + " is not known to the MapperRegistry."); else try return mapperProxyFactory.newInstance(sqlSession); catch (Exception var5) throw new BindingException("Error getting mapper instance. Cause: " + var5, var5);
总结:
对于一个MapperInterface,在Spring中会存在一个BeanDifition,两个实例:MapperFactory<MapperInterface.class> 和 ProxyBean。
以上是关于Mybatis-SpringMapperFactoryBean的主要内容,如果未能解决你的问题,请参考以下文章