本篇内容主要讲解“基于Spring怎么整合mybatis的mapper”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“基于Spring怎么整合mybatis的mapper”吧!
Spring整合mybatis的mapper生成过程
mapperScannerConfigurer实现了BeandiFinitionRegistryPostProcessor
后置处理beanfactory时会调用其postProcessBeanDeFinitionRegistry
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)); }
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; }
如上在进行包扫描时,会调用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
mapperInterface是在Mapperfactorybean创建时,会调用有参构造创建实例,值是创建是
创建除了传入mapperInterface,还会在设置属性值时调用Mapperfactorybean的父类sqlSessionDaoSupport#setSqFactory 将mdb中的sqlsessionfactory传入其中
mdb的sqlsessionFactory信息来历
查看方法栈调用,可以看到在开始填充属性时会去mdb中判断是否有propertyValue,如果有就返回,这就是之前扫描mapper后ClasspathMapperScanner#processBeanDeFinitions对mdb的一些设置
在创造service时,如果有@Autowire 注入mapper,在createBean时会调用getobject
mdb只有一份,可得sqlsessionfactory即只有一份,sqlsessionTemplate一个mapper一份。
到此,相信大家对“基于Spring怎么整合mybatis的mapper”有了更深的了解,不妨来实际操作一番吧!这里是编程之家网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。