Mapper和MapperScan注解接口动态代理start细节

·SpringBoot ·Mybatis

mybatis-plus在mybatis的基础上封装了基本的crud以及一些扩展,想要就导入它的start。不喜欢那就直接用mybatis的start。两个二选一,不要两个start都导入!

@Mapper注解以及启动类添加@MapperScan都能实现dao层接口的自动注入,不需要实现类,因为mybatis或者plus告诉spring由它自动生成代理实现类了。那是如何告诉的呢?mybatis在它的start项目里引入了一个autoconfigure的jar,此jar里的spring.factories告诉spring自动配置类是MybatisAutoConfiguration.class,spring按约定去执行相应的bean初始化过程。spring在创建bean的时候,就自然会执行mybatis写好了的如何去获取我们那些用@Mapper等等标识的接口的逻辑代码。因此,我们使用@Mapper和@MapperSacn就能够让spring依赖注入进来,是mybatis事先让spring去创建了代理类。

同样的,mybatis-plus在它的start项目的jar包的spring.factories中告诉spring自动导入的配置类了,所以生成的是plus为我们事先创建的mapper代理类。mybatisplus基于mybatis,所以它导入mybatis的是基于spring的核心org.mybatis,当然不是springboot的mybatis-start,否则就乱套啦。大伙可以分别导入二者的start去libraries看看对应的META-INF下的配置信息就可以了。或者在mapper接口上打断点,看看对象是不是代理类xxProxy。

要注意的是,使用@MapperScan扫包就不需要使用@Mapper了。但@MapperScan不能在对应的mapper接口上使用@Autowried,因为idea不知道有能够自动注入的对象,除非使用@Mapper,这也是mybatis官方推荐的。要使用@MapperScan,请改用@Resource来注入避免idea报红。

来自:Java
更新于2022-09-29 15:21:48 发表于2022-09-29 15:21:15


发表您的评论





公元2023年癸卯兔年,平安健康、“兔”围而出!