mybatis-spring-boot-starter&mybatis-plus-boot-starter

引子

        在一个spring项目中发现同时引用了mybatis-spring-boot-starter、mybatis-plus-boot-starter,这两个starter需要同时引用?

看了一下mybatis-plus-boot-starter的pom,发现它已经引用了mybatis-spring;

另外去yBatis Plus https://baomidou.com/ 官网看了一下文档,

仅提到了需要添加依赖mybatis-plus-boot-starter;

既然这样果断移除mybatis-spring-boot-starter,启动一下项目没有任何异常,访问数据库也一切正常。

但移除mybatis-spring-boot-starter之前,项目也可以正常访问。那么多引用会对有什么影响呢?分析一下吧!

mybatis-spring-boot-starter

在其包中可以看到仅引用了mybatis-spring-boot-autoconfigure,另外包中有一个spring.provides,文件内容为:

provides: mybatis-spring-boot-autoconfigure

这个包里没什么东西了,再看一下mybatis-spring-boot-autoconfigure;发现了spring.factories,文件内容如下:

# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.mybatis.spring.boot.autoconfigure.MybatisLanguageDriverAutoConfiguration,\
org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration

spring在启动时会可能加载以下两个类

MybatisLanguageDriverAutoConfiguration

package org.mybatis.spring.boot.autoconfigure;

@Configuration
@ConditionalOnClass(LanguageDriver.class)
public class MybatisLanguageDriverAutoConfiguration {

  @Configuration
  @ConditionalOnClass(FreeMarkerLanguageDriver.class)
  @ConditionalOnMissingClass("org.mybatis.scripting.freemarker.FreeMarkerLanguageDriverConfig")
  public static class LegacyFreeMarkerConfiguration {}

  @Configuration
  @ConditionalOnClass({ FreeMarkerLanguageDriver.class, FreeMarkerLanguageDriverConfig.class })
  public static class FreeMarkerConfiguration {}

  @Configuration
  @ConditionalOnClass(org.mybatis.scripting.velocity.Driver.class)  
@ConditionalOnMissingClass("org.mybatis.scripting.velocity.VelocityLanguageDriverConfig")
  @SuppressWarnings("deprecation")
  public static class LegacyVelocityConfiguration {}

  @Configuration
  @ConditionalOnClass({ VelocityLanguageDriver.class, VelocityLanguageDriverConfig.class })
  public static class VelocityConfiguration {}

  @Configuration
  @ConditionalOnClass(ThymeleafLanguageDriver.class)
  public static class ThymeleafConfiguration {}

}

        MybatisLanguageDriverAutoConfiguration加载的条件是项目中有LanguageDriver.class,我的项目有这个类;MybatisLanguageDriverAutoConfiguration要加载内部类的条件FreeMarkerLanguageDriver.class、 FreeMarkerLanguageDriverConfig.class、org.mybatis.scripting.velocity.Driver.class、VelocityLanguageDriver.class, VelocityLanguageDriverConfig.class、ThymeleafLanguageDriver.class,在我项目中都不存在。因此spring仅会在我的项目中生成MybatisLanguageDriverAutoConfiguration这个对象;

MybatisAutoConfiguration

package org.mybatis.spring.boot.autoconfigure;

@org.springframework.context.annotation.Configuration
@ConditionalOnClass({ SqlSessionFactory.class, SqlSessionFactoryBean.class })
@ConditionalOnSingleCandidate(DataSource.class)
@EnableConfigurationProperties(MybatisProperties.class)
@AutoConfigureAfter({ DataSourceAutoConfiguration.class, MybatisLanguageDriverAutoConfiguration.class })
public class MybatisAutoConfiguration implements InitializingBean {
  @Bean
  @ConditionalOnMissingBean
  public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
  }

  @Bean
  @ConditionalOnMissingBean
  public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) {
  }

  @org.springframework.context.annotation.Configuration
  @Import(AutoConfiguredMapperScannerRegistrar.class)
  @ConditionalOnMissingBean({ MapperFactoryBean.class, MapperScannerConfigurer.class })
  public static class MapperScannerRegistrarNotFoundConfiguration implements InitializingBean {
    @Override
    public void afterPropertiesSet() {
      logger.debug(
          "Not found configuration for registering mapper bean using @MapperScan, MapperFactoryBean and MapperScannerConfigurer.");
    }

  }

}

        MybatisAutoConfiguration依赖SqlSessionFactory.class, SqlSessionFactoryBean.class,并且项目中有一个主的DataSource的时候会加载。同步项目中缺少SqlSessionFactory和SqlSessionTemplate时,会创建这两个对象;

mybatis-plus-boot-starter

spring.factories内容如下:

# Auto Configure
org.springframework.boot.env.EnvironmentPostProcessor=\
  com.baomidou.mybatisplus.autoconfigure.SafetyEncryptProcessor
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
  com.baomidou.mybatisplus.autoconfigure.IdentifierGeneratorAutoConfiguration,\
  com.baomidou.mybatisplus.autoconfigure.MybatisPlusLanguageDriverAutoConfiguration,\
  com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration

com.baomidou.mybatisplus.autoconfigure.SafetyEncryptProcessor 安全组件、com.baomidou.mybatisplus.autoconfigure.IdentifierGeneratorAutoConfiguration id自动生成自动配置,这两个暂且不看,因为是mybatis-plus多出来的。

MybatisPlusLanguageDriverAutoConfiguration

Auto-Configuration for MyBatis's scripting language drivers.
copy from org.mybatis.spring.boot.autoconfigure.MybatisLanguageDriverAutoConfiguration

这个类是从org.mybatis.spring.boot.autoconfigure.MybatisLanguageDriverAutoConfiguration复制过来。

MybatisPlusAutoConfiguration

If org.mybatis.spring.annotation.MapperScan is used, or a configuration file is specified as a property, those will be considered, otherwise this auto-configuration will attempt to register mappers based on the interface definitions in or under the root auto-configuration package.
copy from org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration

这个类是从org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration复制过来。

总结

        到这里发现mybatis-plus-boot-starter包含了mybatis-plus-boot-starter的功能。虽然他们两个同时引用对项目功能没有什么影响,但是为了spring能少加载几个类,在使用mybatis-plus-boot-starter就不要使用mybatis-plus-boot-starter了。

MyBatis 相关资源

MyBatis

优秀的数据库ORM组件

MyBatis Spring

由MyBatis提供,目的是方便的和Spring做集成。

MyBatis Plus

引用官网的说明:“MyBatis 最佳搭档,只做增强不做改变,为简化开发、提高效率而生。”

  • 14
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值