最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

基于Spring整合mybatis的mapper生成過(guò)程

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

Spring整合mybatis的mapper生成過(guò)程

mapperScannerConfigurer實(shí)現(xiàn)了BeandifinitionRegistryPostProcessor

后置處理beanFactory時(shí)會(huì)調(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();
//掃描包集合,注冊(cè)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 {
//會(huì)對(duì)bean信息進(jìn)行一些更改和添加,如設(shè)置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;
	}

 

如上在進(jìn)行包掃描時(shí),會(huì)調(diào)用ClassPathBeanDefinitionScanner#doScan,進(jìn)行beanDefinition的掃描和注冊(cè)

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

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

mapperInterface是在MapperFactoryBean創(chuàng)建時(shí),會(huì)調(diào)用有參構(gòu)造創(chuàng)建實(shí)例,值是創(chuàng)建是

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

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

mdb的sqlsessionFactory信息來(lái)歷

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

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

mdb只有一份,可得sqlsessionfactory即只有一份,sqlsessionTemplate一個(gè)mapper一份

總結(jié)

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

相關(guān)文章

  • java中transient關(guān)鍵字的作用解析

    java中transient關(guān)鍵字的作用解析

    這篇文章主要介紹了java中transient關(guān)鍵字的作用解析,日常業(yè)務(wù)中,為了安全起見,有些敏感信息我們不希望在網(wǎng)絡(luò)間被傳輸可以使用transient對(duì)字段進(jìn)行修飾,不進(jìn)行序列化,則返回獲取到的字段為null,需要的朋友可以參考下
    2023-11-11
  • SpringBoot項(xiàng)目引入MCP的實(shí)現(xiàn)示例

    SpringBoot項(xiàng)目引入MCP的實(shí)現(xiàn)示例

    本文主要介紹了SpringBoot項(xiàng)目引入MCP的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2025-04-04
  • 詳解使用spring aop實(shí)現(xiàn)業(yè)務(wù)層mysql 讀寫分離

    詳解使用spring aop實(shí)現(xiàn)業(yè)務(wù)層mysql 讀寫分離

    本篇文章主要介紹了使用spring aop實(shí)現(xiàn)業(yè)務(wù)層mysql 讀寫分離,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-01-01
  • 使用遞歸算法結(jié)合數(shù)據(jù)庫(kù)解析成Java樹形結(jié)構(gòu)的代碼解析

    使用遞歸算法結(jié)合數(shù)據(jù)庫(kù)解析成Java樹形結(jié)構(gòu)的代碼解析

    這篇文章主要介紹了使用遞歸算法結(jié)合數(shù)據(jù)庫(kù)解析成Java樹形結(jié)構(gòu)的代碼解析的相關(guān)資料,需要的朋友可以參考下
    2017-09-09
  • Java 實(shí)戰(zhàn)練習(xí)之網(wǎng)上電商項(xiàng)目的實(shí)現(xiàn)

    Java 實(shí)戰(zhàn)練習(xí)之網(wǎng)上電商項(xiàng)目的實(shí)現(xiàn)

    讀萬(wàn)卷書不如行萬(wàn)里路,只學(xué)書上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實(shí)戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+vue+Springboot+ssm+mysql+maven+redis實(shí)現(xiàn)一個(gè)網(wǎng)上電商項(xiàng)目,大家可以在過(guò)程中查缺補(bǔ)漏,提升水平
    2021-11-11
  • 基于mybatis like %%的問(wèn)題

    基于mybatis like %%的問(wèn)題

    這篇文章主要介紹了mybatis like %%的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • Java?代碼本地設(shè)置Hadoop用戶名密碼的方法

    Java?代碼本地設(shè)置Hadoop用戶名密碼的方法

    在Hadoop環(huán)境中,通常使用Kerberos進(jìn)行身份驗(yàn)證,這篇文章主要介紹了Java?代碼本地設(shè)置Hadoop用戶名密碼的方法,需要的朋友可以參考下
    2024-08-08
  • Java中finally關(guān)鍵字對(duì)返回值的影響詳解

    Java中finally關(guān)鍵字對(duì)返回值的影響詳解

    這篇文章主要介紹了Java中finally關(guān)鍵字對(duì)返回值的影響詳解,執(zhí)行完try catch里面內(nèi)容準(zhǔn)備return時(shí),如果還有finally需要執(zhí)行這是編譯器會(huì)為我們?cè)黾右粋€(gè)全局變量去暫存return 的值,等到finally執(zhí)行完成去return這個(gè)全局變量,需要的朋友可以參考下
    2024-01-01
  • SpringCloud注冊(cè)中心之consul詳細(xì)講解使用方法

    SpringCloud注冊(cè)中心之consul詳細(xì)講解使用方法

    Consul是一款由HashiCorp公司開源的,用于服務(wù)治理的軟件,Spring Cloud Consul對(duì)其進(jìn)行了封裝,這篇文章主要介紹了springcloud組件consul服務(wù)治理,需要的朋友可以參考下
    2022-11-11
  • Java8新特性Stream流詳解

    Java8新特性Stream流詳解

    Java8 Stream使用的是函數(shù)式編程模式,如同它的名字一樣,它可以被用來(lái)對(duì)集合進(jìn)行鏈狀流式的操作,本文就將帶著你如何使用 Java 8 不同類型的 Stream 操作,同時(shí)還將了解流的處理順序,以及不同順序的流操作是如何影響運(yùn)行時(shí)性能的
    2023-07-07

最新評(píng)論

慈溪市| 华池县| 平湖市| 长子县| 政和县| 五河县| 蓝山县| 安仁县| 邛崃市| 睢宁县| 晋中市| 邢台市| 湘西| 洪雅县| 广南县| 治县。| 海盐县| 施秉县| 广东省| 斗六市| 祁门县| 荥经县| 东至县| 桐梓县| 麻阳| 奉化市| 楚雄市| 扬州市| 罗江县| 葵青区| 婺源县| 郁南县| 游戏| 大悟县| 南华县| 荃湾区| 苗栗县| 徐汇区| 涡阳县| 榆树市| 襄垣县|