007-ConfigurationClassPostProcessor的实践

Mybatis和spring集成原理:

ConfigurationClass
1.component
解析类的成员(内部类)
2.ComponentScans
解析我们自己注册的类

通常我们自己会配置一个sqlSessionFactory
    @Bean
    public SqlSessionFactoryBean sqlSessionFactory() throws IOException {
        SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
                // 设置MyBatis配置文件路径mybatis/mybatis-config.xml
        factoryBean.setConfigLocation(new ClassPathResource("mybatis/mybatisConfig.xml"));
        // 设置 SQL 映射文件路径
        factoryBean.setMapperLocations(
                new PathMatchingResourcePatternResolver().getResources("classpath:mybatis/mapper/*.xml"));
        factoryBean.setDataSource(dataSource());
        factoryBean.setTypeAliases(User.class);
        return factoryBean;
    }

3.import
如果是configuration类,直接生成configuration对象
如果是importSelector直接解析生产configuration对象
如果是deferedImportSelector,放到deferedImportSelectors中
如果是importBeanDefinitionRegistrar,放到importBeanDefinitionRegistrars 中

通常我们会加一个@MapperScan注解
分析:这里会import(MapperScannerRegistrar.class)  
MapperScannerRegistrar是一个ImportBeanDefinitionRegistrar。会registerBeandefinition(MapperScannerConfigurer.class)
所以会在第5步操作。
@MapperScan(basePackages = { "com.test.mapper" })
@SpringBootApplication
public class Application{
      xxxx
}

4、调用 DeferedImportSelectors 中的selectImportGroup还是selectImports(),自动装配配置类
这一步也可能拿到ImportBeanDefinitionRegistrar,供下一步过程使用

通常我们会加@SpringBootApplication注解
分析:这里自动注入一个MybatisAutoConfiguration.会自动注入SqlSessionTemplate,SqlSessionFactory(如果没有)
@MapperScan(basePackages = { "com.test.mapper" })
@SpringBootApplication
public class Application{
      xxxx
}

5、调用 ImportBeanDefinitionRegistrar 的registerBeanDefinition()方法,注册bean

MapperScannerConfigurer会在这里扫描所有的@Mapper的注解的Mapper,生成一个个BeanDefinition.
BeanDefinition中BeanClass会被替换成MapperFactoryBean

@Override
  public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) {
    if (this.processPropertyPlaceHolders) {
      processPropertyPlaceHolders();
    }

    ClassPathMapperScanner scanner = new ClassPathMapperScanner(registry);
    scanner.setAddToConfig(this.addToConfig);
    scanner.setAnnotationClass(this.annotationClass);
    scanner.setMarkerInterface(this.markerInterface);
    scanner.setSqlSessionFactory(this.sqlSessionFactory);
    scanner.setSqlSessionTemplate(this.sqlSessionTemplate);
    scanner.setSqlSessionFactoryBeanName(this.sqlSessionFactoryBeanName);
    scanner.setSqlSessionTemplateBeanName(this.sqlSessionTemplateBeanName);
    scanner.setResourceLoader(this.applicationContext);
    scanner.setBeanNameGenerator(this.nameGenerator);
    scanner.registerFilters();
    scanner.scan(StringUtils.tokenizeToStringArray(this.basePackage, ConfigurableApplicationContext.CONFIG_LOCATION_DELIMITERS));
  }

结论:

1.自己会配置一个sqlSessionFactory
2.springboot自动装配@MybatisAutoConfiguration,会自动注册sqlSessionFactory,sqlSessionTemplate
3.@MapperScanner会import一个MapperScannerRegistrar(类型是importBeanDefinitonRegister),会生成MapperScannerConfigurer(类型也是importBeanDefinitonRegister)。
去扫描配置目录下的Mapper,生成BeanDefinition,其中的BeanClass为MapperFactoryBean
4.容器把所有的Mapper,通过getBean()来生成,生成则是从SqlSession.getMapper()拿到的代理对象,后面就可以使用了

你可能感兴趣的:(007-ConfigurationClassPostProcessor的实践)