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

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的。

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

猜你喜欢

转载自blog.csdn.net/qq_42154259/article/details/107089871
今日推荐