007-ConfigurationClassPostProcessor的實踐

Mybatis和spring集成原理:

ConfigurationClass
1.component
解析類的成員(內(nèi)部類)
2.ComponentScans
解析我們自己注冊的類

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

3.import
如果是configuration類,直接生成configuration對象
如果是importSelector直接解析生產(chǎn)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、調(diào)用 DeferedImportSelectors 中的selectImportGroup還是selectImports(),自動裝配配置類
這一步也可能拿到ImportBeanDefinitionRegistrar,供下一步過程使用

通常我們會加@SpringBootApplication注解
分析:這里自動注入一個MybatisAutoConfiguration.會自動注入SqlSessionTemplate,SqlSessionFactory(如果沒有)
@MapperScan(basePackages = { "com.test.mapper" })
@SpringBootApplication
public class Application{
      xxxx
}

5、調(diào)用 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));
  }

結(jié)論:

1.自己會配置一個sqlSessionFactory
2.springboot自動裝配@MybatisAutoConfiguration,會自動注冊sqlSessionFactory,sqlSessionTemplate
3.@MapperScanner會import一個MapperScannerRegistrar(類型是importBeanDefinitonRegister),會生成MapperScannerConfigurer(類型也是importBeanDefinitonRegister)。
去掃描配置目錄下的Mapper,生成BeanDefinition,其中的BeanClass為MapperFactoryBean
4.容器把所有的Mapper,通過getBean()來生成,生成則是從SqlSession.getMapper()拿到的代理對象,后面就可以使用了

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容