前言
在文章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