引子
在一个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 相关资源
优秀的数据库ORM组件
由MyBatis提供,目的是方便的和Spring做集成。
引用官网的说明:“MyBatis 最佳搭档,只做增强不做改变,为简化开发、提高效率而生。”