mybatis如何交由spring管理
2020-11-28 00:03:51 0 举报
mybatis如何交由spring管理
作者其他创作
大纲/内容
注入映射器
spring-mybatis底层研究
getObject方法通过mapper的class创建动态代理对象
如果想获取factoryBean本身,需要getObject(\"&myFactoryBean\
通过@import导入注册类,将@mapperScan指定的路径加载进来,通过注册器注册到spring
直接用bean工厂注册单例defaultListableBeanFactory.registerSingleton(\"userMapper\
为了解决上一种方案的问题,尝试使用factoryBean
通过@Import({MapperScannerRegistrar.class}),导入的注册器会将指定的路径mapper注册到spring
自定义类实现BeanFactoryPostProcessor接口,postProcessorBeanFactory方法的参数是bean工厂
再将动态代理对象交给spring管理
获取@Select里面的sql语句
自定义类MyFactoryBean实现factoryBean
自定义一个spring-mybatis中间件
MapperScannerConfigurer会在bean的后置处理器BeanDefinitionRegistryPostProcessor将指定的包路径扫描加载进来
mybatis就通过mapperFactoryBean来实现FactoryBean接口,getObject方法是:获取sqlSession,通过sqlSession获取mapper的动态代理对象。return this.getSqlSession().getMapper(this.mapperInterface);
@MapperScan
将mapperInterface的class作为属性,通过构造函数注入。
直接通过getBean获取spring容器中的mapper动态代理对象,调用方法执行sql
继承SqlSessionDaoSupport,SqlSessionDaoSupport的属性SqlSessionTemplate继承于sqlSession.
将使用能够被自动注入的 MapperFactoryBean进行注入
装配自定义的MyFactoryBean
spring就可以到容器中拿到mapper的代理对象,执行对应的方法和sql
<mybatis:scan/>
method.getAnnotation(Select.class).value()[0]
//创建自定义MyFactoryBean的beanDefinitionRootBeanDefinition beanDefinition = new RootBeanDefinition(MyFactoryBean.class);//将mapper路径赋值 beanDefinition.getConstructorArgumentValues().addGenericArgumentValue(\"com.mapper.UserMapper\");//调用工厂的getObject方法,通过mapper的class创建对应的beanDefinition并注册到spring中 registry.registerBeanDefinition(\"userMapper\
因为对于factoryBean,context直接通过getBean获取指定factoryBean,底层会调用getObject方法,并将结果返回。
但是,这样第一步的mapper是固定死的
实现ImportBeanDefinitionRegistrar,通过实现registerBeanDefinitions方法
<bean class=\"org.mybatis.spring.mapper.MapperScannerConfigurer\"> <property name=\"basePackage\" value=\"org.mybatis.spring.sample.mapper\" /></bean>
最简化模式
获取mapper接口代理对象执行业务方法对数据库操作。
根据 mapper接口.class 获取动态代理对象
根据mapperScan注解获取指定路径下的所有mapper,然后循环执行上面的代码即可。
mapper接口
0 条评论
下一页