(一)加载SqlSessionFactory和SqlSessionTemplate

  1. @org.springframework.context.annotation.Configuration
  2. @ConditionalOnClass({ SqlSessionFactory.class, SqlSessionFactoryBean.class })
  3. @ConditionalOnSingleCandidate(DataSource.class)
  4. @EnableConfigurationProperties(MybatisProperties.class)
  5. @AutoConfigureAfter({ DataSourceAutoConfiguration.class, MybatisLanguageDriverAutoConfiguration.class })
  6. public class MybatisAutoConfiguration implements InitializingBean {



MybatisAutoConfiguration类上面有@Configuration注解和一些@ConditionalXXX自动装配注解,当检查用SqlSessionFactory和SqlSessionFactoryBean等类的时候就会给MybatisAutoConfiguration自己加入到Spring容器里面,

然后会将MybatisAutoConfiguration#sqlSessionTemplate和MybatisAutoConfiguration#sqlSessionFactory这两个被@Bean 修饰的类的返回值加入到Spring容器里面


MybatisAutoConfiguration#sqlSessionTemplate方法的作用是
DefaultSqlSession不是线程线程安全的,在Spring环境下不能直接使用的,所以在Spring环境下有一个专门用来替换DefaultSqlSession对象的类,这个类是SqlSessionTemplate.这个类是Spring管理的线程安全的类.

SqlSessionTemplate也是执行增删改查操作的类,内部是通过jdk代理模式创建DefaultSqlSession执行增删改查的操作.


MybatisAutoConfiguration#sqlSessionFactory方法的作用是
实例化并给SqlSessionFactory初始值,然后放入到Spring容器里面

(二)SpringBoot如何读取配置文件创建数据源


DataSourceAutoConfiguration类上面有@EnableConfigurationProperties注解

  1. @Configuration
  2. @ConditionalOnClass({ DataSource.class, EmbeddedDatabaseType.class })
  3. @EnableConfigurationProperties(DataSourceProperties.class)
  4. @Import({ DataSourcePoolMetadataProvidersConfiguration.class, DataSourceInitializationConfiguration.class })
  5. public class DataSourceAutoConfiguration {




@EnableConfigurationProperties作用是把 使用 @ConfigurationProperties 注解的类生效。然后@EnableConfigurationProperties(DataSourceProperties.class)代码意思是让DataSourceProperties.class类,如果使用了@ConfigurationProperties 就生效.

在看DataSourceProperties
DataSourceProperties中封装了数据源的各个属性,且使用了注解ConfigurationProperties指定了配置文件的前缀为spring.datasource。

  1. @ConfigurationProperties(prefix = "spring.datasource")
  2. public class DataSourceProperties implements BeanClassLoaderAware, InitializingBean {


这样的话DataSourceProperties 就把配置文件spring.datasource开头的值都赋值到自己的成员属性了,

需要注意一个问题,bean的扫描是启动类的@SpringBootApplication注解.@SpringBootApplication注解内部有@ComponentScan.