(一)加载SqlSessionFactory和SqlSessionTemplate
@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 {
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注解
@Configuration
@ConditionalOnClass({ DataSource.class, EmbeddedDatabaseType.class })
@EnableConfigurationProperties(DataSourceProperties.class)
@Import({ DataSourcePoolMetadataProvidersConfiguration.class, DataSourceInitializationConfiguration.class })
public class DataSourceAutoConfiguration {
@EnableConfigurationProperties作用是把 使用 @ConfigurationProperties 注解的类生效。然后@EnableConfigurationProperties(DataSourceProperties.class)代码意思是让DataSourceProperties.class类,如果使用了@ConfigurationProperties 就生效.
在看DataSourceProperties
DataSourceProperties中封装了数据源的各个属性,且使用了注解ConfigurationProperties指定了配置文件的前缀为spring.datasource。
@ConfigurationProperties(prefix = "spring.datasource")
public class DataSourceProperties implements BeanClassLoaderAware, InitializingBean {
这样的话DataSourceProperties 就把配置文件spring.datasource开头的值都赋值到自己的成员属性了,
需要注意一个问题,bean的扫描是启动类的@SpringBootApplication注解.@SpringBootApplication注解内部有@ComponentScan.