zl程序教程

您现在的位置是:首页 >  后端

当前栏目

mybatis-spring源码解析--mapper注册详解

Spring注册mybatis源码 详解 解析 -- Mapper
2023-06-13 09:15:23 时间

上一篇《mybatis3源码解析--spring下mapper注册详解》分析了在spring中使用mybatis时,mapper的注册过程,可能不是很详,本篇将使用spring的方式编程式加载mybatis的mapper文件并进行测试。

在spring中使用mybatis,需要使用mapperScan注解,通常在该注解中指定basePackages和sqlSessionFactory。该注解中引入了MapperScannerRegistrar.class。

DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.genericBeanDefinition(MapperScannerConfigurer.class)
        .addPropertyValue("processPropertyPlaceHolders", false)
        .addPropertyValue("basePackage", "com.star.hello.mapper")
        .addPropertyValue("defaultScope", "")
        .addPropertyValue("sqlSessionFactoryBeanName", "sqlSessionFactory")
        .getBeanDefinition();
beanFactory.registerBeanDefinition("MapperScannerRegistrar", beanDefinition);

在MapperScannerRegistrar中做了一件事情就是注册bean定义信息,类型是MapperScannerConfigurer,这里直接使用BeanDefinitionBuilder进行模拟。

当然这里需要给该类设置相应的属性值,数据源和sqlSessionFactory,这里同样使用BeanDefinitionBuilder进行注册。

AbstractBeanDefinition myConfigBeanDefinition = BeanDefinitionBuilder.genericBeanDefinition(MyConfig.class)
                .getBeanDefinition();
beanFactory.registerBeanDefinition("MyConfig", myConfigBeanDefinition);

@Configuration
static class MyConfig {
    @Bean(name = "dataSource")
    public DataSource setDataSource() {
        return new EmbeddedDatabaseBuilder()
                .setType(EmbeddedDatabaseType.HSQL)
                .addScript("init.sql")
                .build();
    }
    @Bean(name = "sqlSessionFactory")
    public SqlSessionFactory setSqlSessionFactory(@Qualifier("dataSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        return bean.getObject();
    }
}

MapperScannerConfigurer实现了BeanDefinitionRegistryPostProcessor,该类又实现了bean工厂后置处理器(BeanFactoryPostProcessor),这里需要调用后置处理器逻辑。

{
  // 注册相关的后置处理器
  AnnotationConfigUtils.registerAnnotationConfigProcessors(beanFactory);
  // 执行MapperScan后置处理器
  beanFactory.getBeansOfType(BeanFactoryPostProcessor.class).values().forEach(beanFactoryPostProcessor -> {
    if (beanFactoryPostProcessor instanceof BeanDefinitionRegistryPostProcessor) {
        ((BeanDefinitionRegistryPostProcessor) beanFactoryPostProcessor).postProcessBeanDefinitionRegistry(beanFactory);
    } else {
        beanFactoryPostProcessor.postProcessBeanFactory(beanFactory);
    }
  });
  // 执行bean的后置处理器
  beanFactory.getBeansOfType(BeanPostProcessor.class).values().forEach(beanFactory::addBeanPostProcessor);
}

根据mybatis-spring的构造,就可以通过bean工厂获取mapper文件进行调用了。

UserMapper userMapper = beanFactory.getBean(UserMapper.class);
System.out.println(userMapper);
userMapper.getAllUserInfo().stream().forEach(e-> System.out.println(e.getNickName()+" "));
---------------------------------------------------------------
org.apache.ibatis.binding.MapperProxy@2e377400
star moon sun