spring boot ValidationAutoConfiguration自动注入MethodValidationPostProcessor类导致bean提前被初始化

2023-11-05

前言

最近改一些项目,发现日志平凡的报 is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)

INFO PostProcessorRegistrationDelegate$BeanPostProcessorChecker:325 [main]  Bean 'com.alibaba.dubbo.config.RegistryConfig' of type [com.alib
aba.dubbo.config.RegistryConfig] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)

虽然报了这些错,但目前对项目并没有什么影响,但还是要看下为什么会有这些问题。

先弄明白这个错是什么意思:名字叫com.alibaba.dubbo.config.RegistryConfigRegistryConfig这个类型是com.alib aba.dubbo.config.RegistryConfig这个bean 不能合法被所有BeanPostProcessors 处理,比如不能合法的被自动代理。

1、什么是beanPostProcess

这里再回顾下beanPostProcess,我们知道spring 通过@autoWire自动注入一些属性,实际就是beanPostProcess帮助我们实现的,说白了beanPostProcess是对bean再次加工的一些处理类,比如说在@Trantional这个注解后,一个beanPostProcess就会帮这个类生成一个代理类,让有@Trantional注解的方法 变成一个事务方法。这就是beanPostProcess的作用。

还有一点要注意:BeanPostProcessor本身也是一个Bean,它的实例化比普通的业务bean要早,如果BeanPostProcessor依赖一些Bean,那么就导致了一些普通Bean的实例化早于BeanPostProcessor。
比如一个普通如果早于自动代理beanPorcessor,那么它就不会被生成代理对象。

2、看下BeanPostProcessorChecker这个报错的地方

@Override
public Object postProcessAfterInitialization(Object bean, String beanName) {
       //这里就是比较下这个bean实例化时 postProcess个数是否<目标个数,如果小于 说是这个bean在一些BeanPostProcessor的前面初始化了,那么就要注意
	if (bean != null && !(bean instanceof BeanPostProcessor) && !isInfrastructureBean(beanName) &&
			this.beanFactory.getBeanPostProcessorCount() < this.beanPostProcessorTargetCount) {
		if (logger.isInfoEnabled()) {
			logger.info("Bean '" + beanName + "' of type [" + bean.getClass().getName() +
					"] is not eligible for getting processed by all BeanPostProcessors " +
					"(for example: not eligible for auto-proxying)");
		}
	}
	return bean;
}

3、排查导致这么bean提前初始化的原因

通过日志看,并没能看出什么问题,只能通过断点来排查:
在这里插入图片描述

registerBeanPostProcessors这个方法实际就是注册一些BeanPostProcessors

3.1、查看registerBeanPostProcessors

通过查看registerBeanPostProcessors,发现是遍历orderedPostProcessorNames这个List,调用beanFactory.getBean(ppName, BeanPostProcessor.class) 这个方法实例化某个bean后就打印了那一堆,具体的bean是methodValidationPostProcessor
这个bean是在ValidationAutoConfiguration中自动注入的
在这里插入图片描述
这个方法有2个入参,Environment environment, Validator validator, 而bean的提前注入就是因为初始Environment 这个属性导致的,参数的注入是通过类型注入的,会调用getBeanNamesForType 来获取所有这个类型的候选类实例。
看下调用链:
在这里插入图片描述
doGetBeanNamesForType方法:
在这里插入图片描述
isTypeMatch:这个方法中有一行比较重要
在这里插入图片描述会判断待匹配的类是不是FactoryBean类型,我们这里是Environmet 显然不是,那么它会把FactoryBean这个类型也加入到匹配类中。国为FactoryBean类型getObject方法返回的类型是真正实例的类型。
在这里插入图片描述

注意这里调用的方法是 getTypeForFactoryBean(beanName, mbd);,看实例化bean传入bean名字是什么:
在这里插入图片描述
实例化时会传入&符号,这里提前初始化提factoryBean对象本身,而不是factoryBean.getObject()返回的对象。所以当我们在mapper类上写切面时 还是可以生效的。
我们beanDefinitionMap中存放是不带&符的bean,所以在普通bean实例化中 走代理器 生成代理对象
在这里插入图片描述
最后调用factory.getObject()方法返回真实对象。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

而ReferenceBean又依赖:
com.alibaba.dubbo.config.ApplicationConfig
com.alibaba.dubbo.config.RegistryConfig
com.alibaba.dubbo.config.MonitorConfig
所以,在ReferenceBean之前又实例化了这3个对象。

也就是说所有FactoryBean的对象都会被提前实例化。
SqlSessionFactoryBean``MapperFactoryBean ,而很多mapper其实也是MapperFactoryBean对象,所以也会提前初始化。

4、如何解决

这么看下来,实际就是ValidationAutoConfiguration自动注入MethodValidationPostProcessor导致的,而这个MethodValidationPostProcessor这个bean如果你命名用Validator.class ,那么就是自动注入。
所以需要排除ValidationAutoConfiguration的自动注入,或排除Validator.class所有包。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

spring boot ValidationAutoConfiguration自动注入MethodValidationPostProcessor类导致bean提前被初始化 的相关文章

随机推荐

  • FPGA-仿真读写bmp图片

    文章目录 位图说明 位图 Verilog代码实现 python处理代码 附 最近想完成FPGA图像处理 由于没有开发板 就像通过仿真完成 之前像的是通过python 将图像转化为txt文本 最后利用verilog 读取txt文件导入 对像素
  • 华为深信服信息安全从业者考试认证大全(cwasp/cisp/nisp sisp-pte......

    证书是IT从业者知识水平能力的一个体现 考证同时也是拓展自身知识的一个方法 近年来 安全行业风生水起 各种认证层出不穷 眼花缭乱 这里不对任何一个证书做评价 只是做出介绍 在国内 对任何事物的评价都会引起围攻 所以笔者不敢妄谈一个证书的含金
  • 库文件中找不到符号问题:CMAKE_CXX_FLAGS: -fvisibility=hidden

    问题描述 编译出来的预测库发现找不到符号 但是相关源文件的确编译到库里了 定位问题 cmake配置中打开了以下开关 set CMAKE CXX FLAGS CMAKE CXX FLAGS fvisibility hidden fvisibi
  • 树状数组(二叉索引树)

    目录 一 树状数组 1 树状数组 2 区间更新单点查询 3 离散化 二 模板代码 三 OJ实战 CodeForces 706B Interesting drink CSU 1770 按钮控制彩灯实验 HDU 1166 敌兵布阵 POJ 23
  • 连接数据库报错com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure的解决方法

    控制台报错 Caused by com mysql cj exceptions CJCommunicationsException Communications link failure com mysql cj jdbc exceptio
  • Dependency-check

    文章目录 前言 工具简介 工具原理 原理 检测过程 NVD CVSS 工具安装 工具地址 环境依赖 工具安装 Jenkins Plugin Command Line On nix On Windows On Mac rec Maven Pl
  • Linux下的man指令

    今天做笔试试卷的时候 有一道选择题是问Linux man指令中查找系统调用的指令是哪一个 当场就不知道选什么了 平常也很少用man指令 都是想要查资料直接上csdn的 这里重新回顾一下Linux下的man指令 man指令后面都可以指定加一个
  • mac系统 拉取vue项目启动时报错:: Permission denied

    Mac 系统运行 vue 启动项目时报错 Permission denied 的解决方式 1 从github拉取的vue项目启动时npm run dev报错 自己试了很多命令 主要还是细心一点对比查看自己目录就好了 解决方式 2 这是因为没
  • React中useRef()和createRef()的使用

    useRef import React useState useRef createRef useEffect from react const Test gt const index setIndex useState 1 const c
  • golang常用库viper

    1 viper的介绍 viper是go一个配置解决方案的库 支持各种配置文件 如JSON TOML YAML HCL envfile和Java属性配置文件 支持监听文件变化以及重新读取配置 支持从环境变量读取配置 支持从远程配置系统 etc
  • 罗定中学2021年高考成绩查询,2020年罗定市各中学高考喜报!罗定中学、廷锴纪念、罗定实验均创历史...

    原标题 2020年罗定市各中学高考喜报 罗定中学 廷锴纪念 罗定实验均创历史 罗定市2020年高考情况 罗定中学 广东省罗定中学 始创于1911年4月11日 由当时的罗定县公立中学和阖县中学合并而成 1912年定名为省立罗定中学校 1926
  • 探秘MySQL底层架构:设计与实现流程

    前言 Mysql 作为一款优秀而广泛使用的数据库管理系统 对于众多Java工程师来说 几乎是日常开发中必不可少的一环 无论是存储海量数据 还是高效地检索和管理数据 Mysql都扮演着重要的角色 然而 除了使用Mysql进行日常开发之外 我们
  • Matlab Excel数据转成面板数据格式

    Stata总是整不明白而且如果后续还想加新的数据列 还得单独用Stata转换 再合并挺麻烦的 于是希望用Matlab直接转成面板数据 然后直接复制粘贴 就方便得多 函数无参数则默认选中的文件中所有的工作簿都转换 有参数的话 第一参数是工作簿
  • git学习------>如何汉化GitLab?

    在上一篇博客中 已经正常安装好了GitLab 然而全部界面都是纯英文的 为了照顾整个团队的英文水平 因此这篇博客的目的是将纯英文的GitLab进行汉化 纯英文界面 第一步 确认GitLab版本号 运行如下命令 查看GitLab版本号 cat
  • sourcetree安装遇到的各种坑

    安装 SourceTree 时 需要使用atlassian授权 多数会卡到这一步 网上给出的办法跳过 atlassian账号 授权方法 安装之后 转到用户本地文件夹下的 SourceTree 目录 没有则新建 LocalAppData At
  • 获得ListView中所点击的数据

    最近写课设 被获取ListView中所点击的数据 必将他传给下一个Actyvity给烦到了 因为要写的与数据库有关联 且要获得数据跳来跳去的 所以写下这篇作为笔记 部分代码 获取数据库的数据并在列表中显示出来 DatabaseHelper
  • ACmix:卷积与self-Attention的融合

    先附代码和文章 可以先结合来看 代码 GitHub LeapLabTHU ACmix Official repository of ACmix CVPR2022 文章 2111 14556 On the Integration of Sel
  • simulink中模块库的建立和维护

    一 模块库的建立与修改 模块库的建立与模型model的建立类似 都是在File菜单栏中 只不过要选择Library而非Model 如下图 然后再该Library中添加了两个模块 并存为名为Interpolation mdl文件 如下图 注意
  • Linux下 C语言实现消息队列

    消息队列 Unix的通信机制之一 可以理解为是一个存放消息 数据 容器 将消息写入消息队列 然后再从消息队列中取消息 一般来说是先进先出的顺序 可以解决两个进程的读写速度不同 处理数据速度不同 系统耦合等问题 而且消息队列里的消息哪怕进程崩
  • spring boot ValidationAutoConfiguration自动注入MethodValidationPostProcessor类导致bean提前被初始化

    文章目录 前言 1 什么是beanPostProcess 2 看下BeanPostProcessorChecker这个报错的地方 3 排查导致这么bean提前初始化的原因 3 1 查看registerBeanPostProcessors 4