微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

基于Spring怎么整合mybatis的mapper

本篇内容主要讲解“基于Spring怎么整合mybatis的mapper”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“基于Spring怎么整合mybatis的mapper”吧!

    Spring整合mybatis的mapper生成过程

    基于Spring怎么整合mybatis的mapper

    mapperScannerConfigurer实现了BeandiFinitionRegistryPostProcessor

    后置处理beanfactory时会调用其postProcessBeanDeFinitionRegistry

    基于Spring怎么整合mybatis的mapper

    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.setMapperfactorybeanClass(this.mapperfactorybeanClass);
        scanner.registerFilters();
    //扫描包集合,注册mapper的beandiFinition
        scanner.scan(StringUtils.tokenizetoStringArray(this.basePackage, ConfigurableApplicationContext.CONfig_LOCATION_DELIMITERS));
      }

    基于Spring怎么整合mybatis的mapper

    ClasspathMapperScanner#doScan

    public Set<BeanDeFinitionHolder> doScan(String... basePackages) {
        Set<BeanDeFinitionHolder> beanDeFinitions = super.doScan(basePackages);
     
        if (beanDeFinitions.isEmpty()) {
          LOGGER.warn(() -> "No MyBatis mapper was found in '" + Arrays.toString(basePackages) + "' package. Please check your configuration.");
        } else {
    //会对bean信息进行一些更改和添加,如设置propertyValues,向其中添加sqlsessionFactory等属性信息等
          processBeanDeFinitions(beanDeFinitions);
        }
     
        return beanDeFinitions;
      }

    ClasspathBeanDeFinitionScanner#doScan

    protected Set<BeanDeFinitionHolder> doScan(String... basePackages) {
    		Assert.notEmpty(basePackages, "At least one base package must be specified");
    		Set<BeanDeFinitionHolder> beanDeFinitions = new LinkedHashSet<>();
    		for (String basePackage : basePackages) {
    //遍历集合扫描包,获取包下的可用的mapper信息
    			Set<BeanDeFinition> candidates = findCandidateComponents(basePackage);
    			for (BeanDeFinition candidate : candidates) {
    				ScopeMetadata scopeMetadata = this.scopeMetadataResolver.resolveScopeMetadata(candidate);
    				candidate.setScope(scopeMetadata.getScopeName());
    				String beanName = this.beanNameGenerator.generateBeanName(candidate, this.registry);
    				if (candidate instanceof AbstractBeanDeFinition) {
    					postProcessBeanDeFinition((AbstractBeanDeFinition) candidate, beanName);
    				}
    				if (candidate instanceof AnnotatedBeanDeFinition) {
    					AnnotationConfigUtils.processCommonDeFinitionAnnotations((AnnotatedBeanDeFinition) candidate);
    				}
    				if (checkCandidate(beanName, candidate)) {
    					BeanDeFinitionHolder deFinitionHolder = new BeanDeFinitionHolder(candidate, beanName);
    					deFinitionHolder =
    							AnnotationConfigUtils.applyScopedProxyMode(scopeMetadata, deFinitionHolder, this.registry);
    					beanDeFinitions.add(deFinitionHolder);
    					registerBeanDeFinition(deFinitionHolder, this.registry);
    				}
    			}
    		}
    		return beanDeFinitions;
    	}

     

    基于Spring怎么整合mybatis的mapper

    如上在进行包扫描时,会调用ClasspathBeanDeFinitionScanner#doScan,进行beanDeFinition的扫描和注册

    执行完后调用ClasspathMapperScanner#processBeanDeFinitions

    private void processBeanDeFinitions(Set<BeanDeFinitionHolder> beanDeFinitions) {
    //有省略部分
           
        //这里有遍历所有mapper
    //将所有mapper的beanClass改为了mapperfactorybean,最后生成的bean也是该类型的,只有在用到的
    //时候才会调用getobject生成mapper
          deFinition.setBeanClass(this.mapperfactorybeanClass);
    //接下来是添加一些Mapperfactorybean属性信息到beandeFinition里,在生成实例的时候,会根据
    //此处传入的值来进行具体设置,如sqlsessionFactory
          deFinition.getPropertyValues().add("addToConfig", this.addToConfig);
     
          
          if (StringUtils.hasText(this.sqlSessionfactorybeanName)) {
            deFinition.getPropertyValues().add("sqlSessionFactory", new RuntimeBeanReference(this.sqlSessionfactorybeanName));
          
          } else if (this.sqlSessionFactory != null) {
            deFinition.getPropertyValues().add("sqlSessionFactory", this.sqlSessionFactory);
            
          }
     
          if (StringUtils.hasText(this.sqlSessionTemplateBeanName)) {
            
            deFinition.getPropertyValues().add("sqlSessionTemplate", new RuntimeBeanReference(this.sqlSessionTemplateBeanName));
            
          } else if (this.sqlSessionTemplate != null) {
            
            deFinition.getPropertyValues().add("sqlSessionTemplate", this.sqlSessionTemplate);
            
          }
      }

    确定了所有的mapper的beanDeFinition为Mapperfactorybean类型后,

    确定在生成的bean皆为Mapperfactorybean,在getBean时会调用Mapperfactorybean#getobject

    基于Spring怎么整合mybatis的mapper

    mapperInterface是在Mapperfactorybean创建时,会调用有参构造创建实例,值是创建是

    基于Spring怎么整合mybatis的mapper

    基于Spring怎么整合mybatis的mapper

     构造方法参数的获取从mdb中

    基于Spring怎么整合mybatis的mapper

    创建除了传入mapperInterface,还会在设置属性值时调用Mapperfactorybean父类sqlSessionDaoSupport#setSqFactory 将mdb中的sqlsessionfactory传入其中

    基于Spring怎么整合mybatis的mapper

    mdb的sqlsessionFactory信息来历

    基于Spring怎么整合mybatis的mapper

    查看方法调用,可以看到在开始填充属性时会去mdb中判断是否有propertyValue,如果有就返回,这就是之前扫描mapper后ClasspathMapperScanner#processBeanDeFinitions对mdb的一些设置

    在创造service时,如果有@Autowire 注入mapper,在createBean时会调用getobject

    mdb只有一份,可得sqlsessionfactory即只有一份,sqlsessionTemplate一个mapper一份。

    到此,相信大家对“基于Spring怎么整合mybatis的mapper”有了更深的了解,不妨来实际操作一番吧!这里是编程之家网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

    版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

    相关推荐