欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

基于Spring整合mybatis的mapper生成過程

 更新時間:2023年03月07日 15:09:16   作者:asLightYouAre  
這篇文章主要介紹了Spring整合mybatis的mapper生成過程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

Spring整合mybatis的mapper生成過程

mapperScannerConfigurer實現(xiàn)了BeandifinitionRegistryPostProcessor

后置處理beanFactory時會調(diào)用其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;
	}

 

如上在進行包掃描時,會調(diào)用ClassPathBeanDefinitionScanner#doScan,進行beanDefinition的掃描和注冊

執(zhí)行完后調(diào)用ClassPathMapperScanner#processBeanDefinitions

private void processBeanDefinitions(Set<BeanDefinitionHolder> beanDefinitions) {
//有省略部分
       
    //這里有遍歷所有mapper
//將所有mapper的beanClass改為了mapperFactoryBean,最后生成的bean也是該類型的,只有在用到的
//時候才會調(diào)用getObject生成mapper
      definition.setBeanClass(this.mapperFactoryBeanClass);
//接下來是添加一些MapperFactoryBean的屬性信息到beandefinition里,在生成實例的時候,會根據(jù)
//此處傳入的值來進行具體設置,如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時會調(diào)用MapperFactoryBean#getObject

mapperInterface是在MapperFactoryBean創(chuàng)建時,會調(diào)用有參構造創(chuàng)建實例,值是創(chuàng)建是

 構造方法參數(shù)的獲取從mdb中

創(chuàng)建除了傳入mapperInterface,還會在設置屬性值時調(diào)用MapperFactoryBean的父類SqlSessionDaoSupport#setSqFactory 將mdb中的sqlsessionfactory傳入其中

mdb的sqlsessionFactory信息來歷

查看方法棧調(diào)用,可以看到在開始填充屬性時會去mdb中判斷是否有propertyValue,如果有就返回,這就是之前掃描mapper后ClassPathMapperScanner#processBeanDefinitions對mdb的一些設置

在創(chuàng)造service時,如果有@Autowire 注入mapper,在createBean時會調(diào)用getObject

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

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • spring mvc DispatcherServlet之前端控制器架構詳解

    spring mvc DispatcherServlet之前端控制器架構詳解

    這篇文章主要為大家詳細介紹了spring mvc DispatcherServlet之前端控制器架構,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-04-04
  • java?freemarker實現(xiàn)動態(tài)生成excel文件

    java?freemarker實現(xiàn)動態(tài)生成excel文件

    這篇文章主要為大家詳細介紹了java如何通過freemarker實現(xiàn)動態(tài)生成excel文件,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2023-12-12
  • Java局部內(nèi)部類原理與用法實例分析

    Java局部內(nèi)部類原理與用法實例分析

    這篇文章主要介紹了Java局部內(nèi)部類原理與用法,結(jié)合實例形式分析了Java局部內(nèi)部類功能、用法及相關操作注意事項,需要的朋友可以參考下
    2019-09-09
  • SpringBoot整合ELK做日志超完整詳細教程

    SpringBoot整合ELK做日志超完整詳細教程

    本文詳細介紹了如何在springboot中快速接入ELK的過程,ELK可以說在實際項目中具有很好的適用價值,不管是小項目,還是中大型項目,都具備普適參考性,值得深入了解和學習,感興趣的朋友一起看看吧
    2024-01-01
  • Java Swing 非常漂亮外觀Nimbus的使用方法實例

    Java Swing 非常漂亮外觀Nimbus的使用方法實例

    Java Swing 非常漂亮外觀Nimbus的使用方法實例,需要的朋友可以參考一下
    2013-02-02
  • Java9 集合工廠方法解析

    Java9 集合工廠方法解析

    這篇文章主要介紹了Java9 集合工廠方法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • MyBatis update標簽詳解

    MyBatis update標簽詳解

    這篇文章主要介紹了MyBatis update標簽,使用 Map 傳遞參數(shù)會導致業(yè)務可讀性的喪失,繼而導致后續(xù)擴展和維護的困難,所以在實際應用中我們應該果斷廢棄該方式,需要的朋友可以參考下
    2023-10-10
  • SpringBoot+Redis+Lua防止IP重復防刷攻擊的方法

    SpringBoot+Redis+Lua防止IP重復防刷攻擊的方法

    本文主要介紹了SpringBoot+Redis+Lua防止IP重復防刷攻擊的方法,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • Springboot整合Activiti操作詳解

    Springboot整合Activiti操作詳解

    這篇文章主要給大家詳細介紹了Springboot整合Activiti的操作流程,文中流程步驟和代碼示例介紹的非常詳細,具有一定的參考價值,需要的朋友可以參考下
    2023-07-07
  • Java中常見的查找算法與排序算法總結(jié)

    Java中常見的查找算法與排序算法總結(jié)

    數(shù)據(jù)結(jié)構是數(shù)據(jù)存儲的方式,算法是數(shù)據(jù)計算的方式。所以在開發(fā)中,算法和數(shù)據(jù)結(jié)構息息相關。本文為大家整理了Java中常見的查找與排序算法的實現(xiàn),需要的可以參考一下
    2023-03-03

最新評論