mybatis注解式mapper和cglib动态代理冲突,有没有设置cglib忽略扫描的包的方法

mybatis注解式mapper和cglib动态代理冲突,有没有设置cglib忽略扫描的包的方法,第1张

我用的是cglib-31的版本,发生以下错误:

No qualifying bean of type [com_520itcrm2mapperEmployeeMapper] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency Dependency annotations: {@orgspringframeworkbeansfactoryannotationAutowired(required=true)}

将版本改为cglib-22后运行正常

我是这样解决的

mybatis-configxml中typeAliases属性下

<!-- <typeAlias alias="User" type="daoUser" /> -->

注释掉,加上

<package name="entity"/>

okay,问题解决

引入了以下包

其中自动装配的包就是mybatis-spring-boot-autoconfigure。

META-INF下有一个springfactories文件

导入了这个类MybatisAutoConfiguration

注册MapperScannerConfigurer的Bean定义到Spring容器中,并设置扫描包的路径

MapperScannerConfigurer 实现BeanDefinitionRegistryPostProcessor接口,实例化的时候会调到postProcessBeanDefinitionRegistry方法,这个方法里会创建一个ClassPathMapperScanner对象,然后去扫描

扫描到之后修改BeanDefinition

@MapperScan注解,会import进来MapperScannerRegistrar这个类

MapperScannerRegistrar类实现ImportBeanDefinitionRegistrar接口,实例化的时候会调用registerBeanDefinitions方法

和@Mapper一样,同样会创建MapperScannerConfigurer的BeanDefition,用于后续实例化

只不过要扫描的包路径变了,不再是默认的,而是@MapperScan配置的包路径

后面的话则和@Mapper扫描到之后的工作原理是一样的,扫描到之后,更改BeanDefinition,一毛一样的。

==可以看出@MapperScan最主要的工作原理除了提供BasePackage的值之外,就是用@Import注解导入MapperScannerRegistrar所以这个注解打在任何可以被spring扫描到的类上都可以,并不一定要打在启动类上(大多数为了只是为了看起来方便,把全局性的配置注解打在启动类上而已)==

前面提到,注册扫描@Mapper接口的MapperScannerConfigurer实例的类是AutoConfiguredMapperScannerRegistrar,那么这个类是如何被导入进来的呢

MybatisAutoConfiguration还有一个静态内部类,@Import了AutoConfiguredMapperScannerRegistrar类,但是有@ConditionalOnMissingBean,即spring容器中不存在MapperFactoryBean,MapperScannerConfigurer的实例。

如果@MapperScan注解生效,并且扫描到任意一个Mapper接口(前面被改造成MapperFactoryBean类型的了),那么就不满足注册这个类MapperScannerRegistrarNotFoundConfiguration的实例的条件,继而不会导入AutoConfiguredMapperScannerRegistrar类。

前面提到,所有的Mapper接口被扫描到,封装成BeanDefinition,还经历了一次改造,

最主要的就是将mapper接口BeanDefination的beanClass改成了orgmybatisspringmapperMapperFactoryBeanclass

并且将mapper接口BeanDefination的名称作为构造函数的入参传入进去

并讲BeanDefinition的autowireMode属性改成 AUTOWIRE_BY_TYPE ,后面实例化该bean的时候会调用属性的描述器,用write的方式注入属性值,最重要的那个属性那就是SqlSessionTemplate 会通过这种方式将前面MybatisAutoConfiguration中@Bean出来的SqlSessionTemplate注入到其中。

类图:

这里他实现了FactoryBean,

FactoryBean有以下方法

这里是spring的一个拓展点,实现了FactoryBean接口的类,将可以实现getObject() 和getObjectType来实例化额外的一个bean并装到spring容器中

好吧,其实Mapper代理对象的创建就是在MapperFactoryBean的getObject方法中返回的

这里就是熟悉的原生Mybatis创建Mapper接口的味道了。

附上调用的类时序图,回过头来看一下调用的整体流程。

以上就是关于mybatis注解式mapper和cglib动态代理冲突,有没有设置cglib忽略扫描的包的方法全部的内容,包括:mybatis注解式mapper和cglib动态代理冲突,有没有设置cglib忽略扫描的包的方法、Spring3 + Mybatis + struts2框架报下面的错误 告诉解决下 解决了果断加一百分、springboot中,mybatis的mapper接口是如何生成代理对象的等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/10149666.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-05
下一篇2023-05-05

发表评论

登录后才能评论

评论列表(0条)

    保存