springboot整合mybatis配置异常:Property ‘configuration‘and‘configLocation‘cannotspecifiedwithtogether源码角度分析

    技术2022-08-01  86

    Failed to instantiate [org.apache.ibatis.session.SqlSessionFactory]: Factory method 'sqlSessionFactory' threw exception; Caused by: java.lang.IllegalStateException: Property 'configuration' and 'configLocation' can not specified with together

    出现这个异常的原因是:我们在配置文件中指定了:config-location,然后我们又配置了关于configuration的信息,导致的报错。 大体意思就是,二者只能选择一种,要么指定config-location我们自己的xml配置文件,要么我们就使用Mybatis的start提供的配置。 如果两者都存在,那么他就会包冲突。 比如如下配置:

    mybatis: config-location: classpath:mybatis-config.xml mapper-locations: classpath:mapper/*Mapper.xml configuration: cache-enabled: true

    这样他就会启动报错:

    Property 'configuration' and 'configLocation' can not specified with together
    解决办法:要么我们去除掉config-location的xml配置,要么我们就去除configuration下面的配置

    为了验证这一个异常,那么我们就深入源码看一波:

    1、这里是springboot的自动装配,那么我们就应该重启动器入手

    找到mybatis-spring-boot-starter的包,然后打开找到META-INF/spring.factories文件

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

    这里能够查看mybatis使用了springboot的那些扩展点,同时也包括自动装配的扩展点: 然后我们进入org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration

    @org.springframework.context.annotation.Configuration @ConditionalOnClass({ SqlSessionFactory.class, SqlSessionFactoryBean.class }) @ConditionalOnBean(DataSource.class) @EnableConfigurationProperties(MybatisProperties.class) @AutoConfigureAfter(DataSourceAutoConfiguration.class) public class MybatisAutoConfiguration {}

    这里我们看到@EnableConfigurationProperties(MybatisProperties.class)注解指定的类(他就是读取配置文件的类)

    /** * 用于自定义默认设置的配置对象。如果指定了configLocation,则不使用此属性。 */ @NestedConfigurationProperty // 嵌套装配注解 private Configuration configuration;

    这个属性上面的注解上讲到:如果configLocation,则不使用此属性。

    那么我们看他他抛出异常的位置: 异常从这里抛出,那么传过来的expression一定是为false的。

    然后再到调用它处看: 这个逻辑看下来就是不能够两者都有,但是可以两者都没有,所以两种都有的情况下就会报这个错。

    Processed: 0.009, SQL: 9