Mybatis启动与核心类

71 阅读1分钟

前言

在文章Mybatis包结构与进化讲述了进化过程,看看mybatis-spring-boot-autoconfigure是如何启动和扫描的

核心类

MybatisAutoConfiguration

@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 {
      SqlSessionFactoryBean factory = new SqlSessionFactoryBean();
    }
    @Bean
    @ConditionalOnMissingBean
    public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) {
    }
    public static class AutoConfiguredMapperScannerRegistrar
        implements BeanFactoryAware, EnvironmentAware, ImportBeanDefinitionRegistrar{
        @Override
        public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry){
        }
        @Override
        public void setBeanFactory(BeanFactory beanFactory) {
          this.beanFactory = beanFactory;
        }
        @Override
        public void setEnvironment(Environment environment) {
          this.environment = environment;
        }
    }
    @org.springframework.context.annotation.Configuration
    @Import(AutoConfiguredMapperScannerRegistrar.class)
    @ConditionalOnMissingBean({ MapperFactoryBean.class, MapperScannerConfigurer.class })
    public static class MapperScannerRegistrarNotFoundConfiguration implements InitializingBean{}
}

@ConditionalOnClass存在时配置启动
@ConditionalOnSingleCandidate有且仅有一个候选Bean时启动
@EnableConfigurationProperties启动特定配置,使得这些配置类能够被注入到其他 Bean 中使用
@AutoConfigureAfter指定配置类完成启动后配置启动
@ConditionalOnMissingBean不存在特定类型的Bean时生效
@Import引入其他配置类或组件称为Bean

AutoConfiguredMapperScannerRegistrar实现自Aware接口,在Spring之Bean(2)循环依赖|初始化|销毁文章中讲到Aware作为标记接口得到通知参数BeanFactory、Environment,调试会发现BeanFactory为DefaultListableBeanFactory。在Spring之Bean(1)创建中讲到DefaultListableBeanFactory 实现了BeanFactory操作bean的行为、实现了BeanDefinitionRegistry存储bean的行为,setBeanFactory就得到了DefaultListableBeanFactory,通过该接口扫描@Mapper注解,得到各Mapper业务接口的bean