首页 > 其他分享 >注解解析的BeanDefinition

注解解析的BeanDefinition

时间:2023-09-20 12:06:15浏览次数:42  
标签:beanName 校验 bean 注册 alisa 注解 解析 methodOverrides BeanDefinition

配置文件解析完后,剩下的工作就是注册了,是processBeanDefinition函数中的BeanDefinitionReaderUtils.registerBeanDefinition(bdHodler,getReaderContext().getRegistry())代码的解析了。

public static void registryBeanDefinition(BeanDefinitionHolder definitionHolder,BeanDefinitionRegistry registry)
// 使用beanName做唯一标识注册
// 注册所有的别名

1.通过beanName注册BeanDefinition

对于beanName的注册,或许许多人认为的方式就是将beanDefinition直接放入map中就好了,使用beanName作为key,确实spring就是这么做的,除此之外,还做了点别的事。

public void registryBeanDefinition(String beanName,Definition beanDefinition) throws BeanDefinitionStoreException
// 注册前的最后一次校验,这里的校验不同于之前的XML文件校验,主要是对于AbstractBeanDefinition属性中的methodOverrides校验,校验methodOverrides是否与工厂方法并存或者methodOverrides对应方法根本不存在
// 因为beanDefinitionMap是全局变量,这里肯定会存在并发访问的情况
// 处理注册已经注册的beanName情况
// 如果对应的BeanName已经注册且在配置中配置了bean不允许被覆盖,则抛出异常
// 记录beanName
// 注册beanDefinition
// 重置所有beanName对应的缓存
}

上面的代码可以看出,对于bean的注册处理方法上,主要进行了几个步骤:

a.对于AbstractBeanDefinition的校验。在解析XML文件的时候,是针对XML格式的校验,而此时的校验时是对于AbstractBeanDefinition的methodOverrides属性的;

b.对beanName已经注册情况的处理。如果没有设置不允许bean的覆盖,则需要抛出异常,否则加入map缓存。

c.清除解析之前留下的对应beanName的缓存。

2.通过别名注册BeanDefinition

在理解了注册bean原理之后,理解别名注册的原理就容易多了。

public void registryAlias(String name,String alisa)
// 如果beanName与alisa相同的话不记录alisa,并删除对应的alisa
// 如果alisa不允许被覆盖则抛异常
}

由以上代码可以得知注册alisa的步骤如下:

a.alisa与beanName相同情况处理,若alisa与beanName并名称相同则不要处理并删除原有alisa;

b.alisa覆盖处理,若alisaName已经使用并已经指向了另一beanName则需要用户的设置进行处理;

c.alisa循环检查,单A->B存在时,若再次出现A->C->B的时候则会抛出异常;注册alis。

标签:beanName,校验,bean,注册,alisa,注解,解析,methodOverrides,BeanDefinition
From: https://blog.51cto.com/u_11315052/7535811

相关文章

  • Mybatis 05 注解实现增删改查
    UserMapperpublicinterfaceUserMapper{/*注解实现增删改查*/@Select("select*fromtb_user")List<User>selectAll2();@Insert("insertintotb_uservalues(null,#{username},#{password},#{gender},#{addr})")voidinsert......
  • 网关配置类,拦截和解析token
      @Component@Slf4jpublicclassAuthorizeFilterimplementsGlobalFilter,Ordered{@OverridepublicMono<Void>filter(ServerWebExchangeexchange,GatewayFilterChainchain){ServerHttpRequestrequest=exchange.getRequest();......
  • token生成与解析
    publicclassAppJwtUtil{//TOKEN的有效期一天(S)privatestaticfinalintTOKEN_TIME_OUT=3_600;//加密KEYprivatestaticfinalStringTOKEN_ENCRY_KEY="MDk4ZjZiY2Q0NjIxZDM3M2NhZGU0ZTgzMjYyN2I0ZjY";//最小刷新间隔(S)privatestat......
  • Python异步编程高并发执行爬虫采集,用回调函数解析响应
    一、问题:当发送API请求,读写数据库任务较重时,程序运行效率急剧下降。异步技术是Python编程中对提升性能非常重要的一项技术。在实际应用,经常面临对外发送网络请求,调用外部接口,或者不断更新数据库或文件等操作。这这些操作,通常90%以上时间是在等待,如通过REST,gRPC向服务器发送请......
  • UDP组播接收端解析
    https://blog.51cto.com/u_4042309/3602677网络中的一台主机如果希望能够接收到来自网络中其它主机发往某一个组播组的数据报,那么这么主机必须先加入该组播组,然后就可以从组地址接收数据包。在广域网中,还涉及到路由器支持组播路由等,但本文希望以一个最为简单的例子解释清楚协议......
  • 探秘移动端BI:发展历程与应用前景解析
    什么是移动端BI维基百科上对于移动端商业智能的定义是这样的>MobileBIisasystemthatpresentshistoricalandreal-timeinformationonmobiledevicesforeffectivedecision-makingandmanagementsupport.Itenablesanalysisonsmartphonesandtablets,lead......
  • Vue3 watch揭秘:基本用法与原理深度解析
    Vue3中的watch函数用于监听数据的变化,当数据发生变化时,可以执行一些操作。watch函数的基本用法如下:import{ref,watch}from'vue';exportdefault{setup(){constcount=ref(0);watch(count,(newValue,oldValue)=>{console.log(`count的新值为:${......
  • Spring注解工具类
    前言在看Spring源码的时候,经常会有处理注解的时候,比如从方法上获取注解,类上获取注解,注解属性别名。JDK中自带的获取注解API有点简单,不会从父类方法或者接口上的方法去查找,不能为属性定义别名等,因此Spring封装了一个便利的工具类,更加方便的去获取注解信息。JDK自带方法Annotated......
  • 第05章-自定义函数和JSON数据解析
    目录5.1实现自定义UDF25.2实现自定义UDTF35.3实现自定义UDAF45.4解析JSON数据65.4.1解析OBJECT数据65.4.2解析ARRAY数据75.4.3禁止使用get_json_object函数8第05章自定义函数和JSON数据解析自定义函数简介有一些sql很难处理的逻辑,我们可以使用自定义函数去处理。比......
  • 深入解析 MySQL 中的字符串处理函数:RIGHT()、LEFT() 和 CHAR_LENGTH
    在MySQL数据库中,字符串处理是一个常见的任务,特别是当你需要从字符串中提取特定部分或者计算字符串的长度时。我们在之前的博文中已经介绍过SUBSTRING_INDEX()、SUBSTRING_INDEX()、SUBSTRING_INDEX(),感兴趣的朋友了可以翻一下我们之前的博文;在本文中,我们将深入探讨三个重要的字......