追查Spring“不符合自动代理资格”的原因

2023-12-07

当你开始摆弄 Spring 的自动代理功能时,你经常会遇到这种行为,如下所示:

实现的类 BeanPostProcessor接口有 特殊,所以他们受到待遇 因容器而异。全部 BeanPostProcessors 及其直接 引用的bean将被实例化 启动时,作为特殊的一部分 的启动阶段 ApplicationContext,然后所有这些 BeanPostProcessor 将被注册 以排序的方式 - 并应用于 所有进一步的豆子。自从AOP 自动代理是作为 BeanPostProcessor 本身,没有 BeanPostProcessors 或直接 引用的 Bean 有资格获得 自动代理(因此不会有 各个方面“编织”到其中。

对于任何这样的 bean,您应该看到 信息日志消息:“Bean 'foo' 不是 有资格被所有人处理 BeanPostProcessors(例如:不 有资格自动代理)”。

换句话说,如果我编写自己的 BeanPostProcessor,并且该类直接引用上下文中的其他 bean,那么这些引用的 bean 将不符合自动代理的条件,并且会记录一条消息来说明这一点。

我的问题是,追踪直接引用的位置可能非常困难,因为“直接引用”实际上可能是一系列传递依赖项,最终会占用应用程序上下文中的一半 bean。 Spring 给你的只是一条信息消息,除了告诉你一个 bean 何时被捕获在这个引用网络中之外,它并没有多大帮助。

我正在开发的 BeanPostProcessor 确实有对其他 bean 的直接引用,但它是一组非常有限的引用。尽管如此,根据日志消息,我上下文中的几乎每个 bean 都被排除在自动代理之外,但我看不到这种依赖关系发生在哪里。

有没有人找到更好的方法来追踪这个问题?


按照这个食谱:

  1. Open BeanPostProcessorChecker在你的 IDE 中(它是一个内部类AbstractApplicationContext)

  2. 设置断点if (logger.isInfoEnabled()) {在方法中postProcessAfterInitialization

  3. 运行你的代码

  4. 当您到达断点时,查找对getBean(String,Class<T>)在你的堆栈跟踪中。

    其中一个调用将尝试创建一个BeanPostProcessor。罪魁祸首应该是那个豆子。

背景

想象一下这种情况:

public class FooPP implements BeanPostProcessor {
    @Autowire
    private Config config;
}

当 Spring 必须创建时config(因为它是一个依赖项FooPP),它有一个问题:合同说所有BeanPostProcessor必须应用于正在创建的每个 bean。但是当Spring需要的时候config,至少有一个PP(即FooPP) 尚未准备好提供服务!

当您使用@Configuration定义这个bean的类:

@Configuration
public class BadSpringConfig {
     @Lazy @Bean public Config config() { return new Config(); }
     @Lazy @Bean public FooPP fooPP() { return new FooPP(); }
}

每个配置类都是一个 bean。这意味着要建造一个豆类工厂BadSpringConfig,Spring需要应用后处理器fooPP但要做到这一点,它首先需要 bean 工厂......

在此示例中,可以打破循环依赖性之一。你(们)能做到FooPP实施BeanFactoryAware让 Spring 注入BeanFactory进入后处理器。这样,您就不需要自动装配。

稍后在代码中,您可以懒惰地请求 bean:

private LazyInit<Config> helper = new LazyInit<Config>() {
    
    @Override
    protected InjectionHelper computeValue() {
        return beanFactory.getBean( Config.class );
    }
};

@Override
public Object postProcessBeforeInitialization( Object bean, String beanName ) throws BeansException {
     String value = helper.get().getConfig(...);
}

(LazyInit 的来源)

要打破 bean 工厂和后处理器之间的循环,您需要在 XML 配置文件中配置后处理器。 Spring 可以读取它并构建所有结构而不会感到困惑。

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

追查Spring“不符合自动代理资格”的原因 的相关文章

  • 如何在servlet 3.0的web.xml-less中定义

    我有现有的 web 应用程序 我想将其转换为 servlet 3 0 的 web xml less 我已经设法让它工作 但是 web xml 中有 2 个标签 我仍然不知道无 web xml 环境中的等效代码
  • 对 Java 安全性和 BouncyCastle API 感到茫然和困惑

    我一直在尝试理解 Java 的 BouncyCastle 加密 API 不幸的是 我发现 Java 密码学总体上被服务提供者接口和术语所掩盖 以至于我无法理解任何东西的实际作用 我已经尝试反复阅读必要的文档 但它仍然难以理解 引入了许多远远
  • PowerMock,模拟静态方法,然后对所有其他静态调用真实方法

    我正在设置模拟类的静态方法 我必须在 Before 带注释的 JUnit 设置方法 我的目标是设置类来调用真正的方法 except对于那些我明确嘲笑的方法 基本上 Before public void setupStaticUtil Pow
  • Spring / AOP:在数据库中实现活动日志的最佳方式

    我已经阅读了一些 Spring AOP 教程 并且对相关概念有了一定的熟悉 现在满足我的要求 我需要创建一个活动日志实现 它将在数据库中保存登录用户的活动 范围包括申请服务或在以下情况下创建新用户Admin用户等 在调用任何具有注释的方法时
  • Java中如何保存DOM文档?

    我在用DOM解析器和XPATH解析我的XML文件 我改变了一个节点的值Document Object 然而当我打开我的XML文件 它没有向我显示任何反射 我的DOM解析器代码如下 private void setPortNumber int
  • ScrollPane滚动到底部问题

    我的 Java 应用程序中有 TextArea 并且我附加了很多文本行 我需要 ScrollPane 滚动到最后附加的 到 TextArea 的底部 我怎样才能做到这一点 您可以通过将插入符号位置移动到底部来做到这一点 这会自动滚动 Tex
  • 使用 Powermock 测试 Spring 控制器

    我有一个测试特定控制器的类 它工作正常 RunWith SpringJUnit4ClassRunner class ContextConfiguration locations classpath config test applicati
  • 如何获取 JSF 2 中所有会话范围的 bean?

    据我所知 JSF 将所有会话范围 bean 保存在某种 Map 中 如果我错了 请纠正我 在我的应用程序中 我有一个名为 userDetailsBean 的会话范围 由 Spring 管理并注入到支持 bean 中 bean 是否有可能通过
  • Java字符串模式识别

    我有一个大约一千个字符长的字符串 由 L T 和 A 组成 我很确定其中有一个简单的模式 我想知道是否有任何快速简便的方法可以找到它 该字符串会发生变化 因此这不仅仅是一次性的 我正在寻找的模式例如如果字符串是 LLLLLLLLAATAAL
  • 亚马逊 AWS Java API。我看不到我的 AMI

    我正在使用 Amazon AWS 的 Java API 我成功进行了身份验证 然后获取了所有图像 但我的图像不在其中 我的 AMI 是私有的 但我想自从我经过身份验证后我仍然会看到它们 这是我的来源 final AmazonEC2 clie
  • 来自复杂对象的 spring RestTemplate POST 参数

    我正在尝试使用 postForObject 方法使用restTemplate 来测试我们的REST 服务 单元测试 Test public void testPostOrder String url BASE URL orders Orde
  • 为什么在 GWT(或任何 Web 应用程序)中使用命令模式?

    根据这个视频 7 50 Google 建议在其请求处理 API 之上使用命令模式 还有一个看起来很有帮助的项目gwt 调度 http code google com p gwt dispatch 实现该模式 根据 gwt 调度我需要为每个命
  • 我怎样才能设置在中间呢?

    我尝试用Java画一个矩形 我设置了框架大小 800 400 和可调整大小 假 矩形的x 50 y 50宽度 700高度 300 为什么它不在中间 谢谢 如果没有任何其他证据 我会guess你已经覆盖了paint类似的方法JFrame并直接
  • 跨不同的类访问 @BeforeTest 和 @AfterClass (TestNG) 中的变量?

    我正在使用 Java 和 TestNG 框架为我的公司编写一些 selenium 自动化 UI 测试 我正在定义驱动程序Base类 我想在一个中实际初始化驱动程序 BeforeTest并退出它 AfterTest方法 假设它们位于不同的类中
  • 在java正则表达式中获取组名

    我正在尝试接收模式和字符串并返回组名称 gt 匹配结果的映射 Example
  • Maven“部署”导致签名操作后代码重新打包(BAD 签名)

    我想将一个工件部署到 Sonatype OSS 存储库 当我使用以下命令进行部署时 签名无效 mvn clean source jar javadoc jar install gpg sign deploy gt gpg verify ta
  • Android:上下文是否影响用于取消警报的filterEquals()?

    要取消闹钟 我使用alarmManager cancel pendingIntent 根据 Android 开发者的说法Removes any alarms with a matching Intent Any alarm of any t
  • JPA:如何在不加载延迟加载集的情况下计算子记录数

    我正在编写一个 J2EE JPA Spring 3 应用程序 试图保持纯粹的 JPA 2 0 我想获得子对象的计数而不必加载它们 因为这显然是一个昂贵的操作 例如 这是一个简化的示例 Organisation OrgID OrgName E
  • 用于只读 DB 的 java ORM

    我了解 hibernate 但我想知道是否有一个更轻的 ORM 引擎只读数据库 我的意思是 我不需要一些事务查询或更新一些记录 另一方面 我需要处理一些大的记录列表 List
  • 逆变方法参数类型

    wiki 逆变方法参数类型 https en wikipedia org wiki Covariance and contravariance 28computer science 29 Contravariant method argum

随机推荐

  • 理解 __get__ 和 __set__ 以及 Python 描述符

    I am trying了解 Python 的描述符是什么以及它们的用途 我理解它们是如何工作的 但我有疑问 考虑以下代码 class Celsius object def init self value 0 0 self value flo
  • 防止箭头键转到上一个/下一个单元格

    在 Visual Studio Code 中使用 Jupyter 笔记本 使用 Microsoft 的 Python 扩展 时 是否可以配置应用程序以防止箭头键退出当前单元格 基本上 当我使用箭头键在可编辑单元格 代码或降价 内移动时 我不
  • 如何检测操作系统或设备类型等系统信息

    我想知道的最重要的事情是设备类型 操作系统版本 是否有硬件键盘 也许还有屏幕分辨率 但如果您知道其他有用的调试信息 请添加它们 我找到了操作系统版本 string OS Version System getProperty os versi
  • 可能出现意外的参考比较

    我有以下代码给出警告 可能出现意外的参考比较 要进行值比较 请将左侧转换为类型 string if lblStatus Content ACTIVE Do stuff else Do other Stuff 我假设警告是因为lblStatu
  • 由于 mscordbi.dll 版本错误,托管调试不再起作用

    我正在尝试使用 Visual Studio 进行托管调试内存转储 但失败并显示以下错误消息 托管调试对此小型转储不可用 无法找到托管小型转储调试所需的库 mscordbi dll 版本 4 0 30319 0 尝试以下任一步骤后重新启动调试
  • 编译 K&R 示例时出现问题

    我在编译本书第 5 11 节中提供的示例程序时遇到问题 我删除了大部分代码 只留下了相关的内容 define MAXLINES 5000 char lineptr MAXLINES void qsort1 void lineptr int
  • :target 伪选择器和选项卡

    所以我想创建一个仅使用 CSS 的选项卡系统 到目前为止我所拥有的有效 但我不知道如何使一个选项卡默认可见 选项卡 section class tabs ul li a href tab1 1 a li li a href tab2 2 a
  • Laravel - 完整性约束违规:1452 无法添加或更新子行:外键约束失败

    我目前正在通过个人项目学习 Laravel Context 在类似博客的应用程序中 我需要将文章链接到其作者 当我保存文章时 出现以下错误 Error SQLSTATE 23000 违反完整性约束 1452 无法添加或更新子行 外键约束失败
  • Serilog Logcontext 属性在异常处理程序之后消失

    在我的网站中 我正在集成 Serilog 以将错误记录到自定义接收器 日志记录通过 LogContext 进行了丰富 其中需要传递一些自定义属性 如果我使用 Log Information 它会带着 LogEvent 中的属性到达我的接收器
  • 使用 CSS3DRenderer 创建等效的 CubeGeometry

    我正在寻找示例代码 它将展示如何创建一个立方体 类似于THREE CubeGeometry 在 ThreeJS 中使用CSS3DRenderer 像下面这样的东西 var my cube new CSS3dCubeGeometry cube
  • 如何输出带条件的访问报告

    亲爱的 美好的一天 我有一个表单可以运行带条件的报告 当我运行该表单时 过滤器 条件 可以正确用于报告 但是当我创建 PDF DoCmd OutputTo 时 PDF 返回所有值 过滤器或条件不起作用 这是我的代码 fSetAccessWi
  • SwiftUI @EnvironmentObject 错误:可能缺少此视图的祖先 - 在 init() 中访问对象

    以下代码会产生运行时错误 EnvironmentObject 错误 可能缺少此视图的祖先 环境中的 tState 是一个 ObservedObject struct TEditorView View EnvironmentObject pr
  • 文件放在哪里才能读取?

    嘿 我要使用 fstream 读取的文本文件应该放在哪里 在本教程中 http www gamedev net reference articles article1127 asp 他们说 ifstream fin 输入 txt input
  • Twitter Bootstrap 自定义 CSS 包含

    当将自定义 css 与覆盖某些样式的 Twitter Bootstrap 一起使用时 将自定义 css 链接放置在引导响应式 css 之前还是之后更好 or
  • 当第一个参数是变量时,使用 new URL() 创建相对 URL 的行为会有所不同。为什么?

    我正在尝试在 NextJs 中实现网络工作者 我遵循了他们的example但我无法将工作人员相对 URL 作为变量传递给new URL url baseUrl 以下代码片段是调用工作者的地方 import useEffect useRef
  • Python时间延迟

    好吧 我想知道如何延迟程序的一部分而不暂停整个程序 我不一定擅长Python 所以如果可能的话 如果你能给我一个相对简单的答案 那就太好了 我想让乌龟在每次调用此函数时在屏幕上画一个圆圈 这就是我所拥有的 import time from
  • 检查字符串中是否存在数组元素

    我认为这对于本地 php 函数来说是一件简单的事情 但我发现了一些不同的 非常复杂的人们试图实现它的方法 检查字符串是否包含数组中的一个或多个元素的最有效方法是什么 即 下面 其中 data description 是一个字符串 观察下面的
  • 尝试调整 RichTextBox 中的图像大小时光标闪烁

    我希望这是一个简单的问题 我执行以下操作 在VS2010中 我创建一个Windows窗体应用程序 从工具箱中 将 RichTextBox 控件拖到窗体中 将窗体和 RichTextBox 控件调整为足够大以显示小图片 运行 开始调试 从 W
  • 更新chrome(35.0.1916.114 m)后,webkitNotifications不起作用

    我的chrome浏览器版本是35 0 1916 114 m 更新后 window webkitNotifications 对象未定义 为什么 请帮我 chrome webkit api 被替换 https groups google com
  • 追查Spring“不符合自动代理资格”的原因

    当你开始摆弄 Spring 的自动代理功能时 你经常会遇到这种行为 如下所示 实现的类 BeanPostProcessor接口有 特殊 所以他们受到待遇 因容器而异 全部 BeanPostProcessors 及其直接 引用的bean将被实