【发布时间】:2010-11-15 03:53:30
【问题描述】:
当您开始弄乱 Spring 的自动代理的东西时,您经常会遇到记录在案的这种行为:
实现的类 BeanPostProcessor 接口是 特殊的,所以他们被对待 因容器而异。全部 BeanPostProcessors 及其直接 引用的 bean 将被实例化 在启动时,作为特殊的一部分 的启动阶段 ApplicationContext,然后所有这些 BeanPostProcessors 将被注册 以一种有序的方式 - 并应用于 所有进一步的豆子。由于 AOP 自动代理被实现为 BeanPostProcessor 本身,没有 BeanPostProcessors 或直接 引用的 bean 有资格 自动代理(因此不会有 方面“编织”到其中。
对于任何这样的 bean,你应该看到一个 信息日志消息:“Bean 'foo' 不是 有资格被所有人处理 BeanPostProcessors(例如:不是 符合自动代理的条件)”。
换句话说,如果我编写自己的 BeanPostProcessor,并且该类直接引用上下文中的其他 bean,那么这些引用的 bean 将不符合自动代理的条件,并且会记录一条消息。
我的问题是跟踪直接引用的位置可能非常困难,因为“直接引用”实际上可能是一个传递依赖链,最终会占用应用程序上下文中的一半 bean。 Spring 给你的只是单一的信息消息,除了告诉你一个 bean 何时被这个引用网络捕获之外,它并没有太大的帮助。
我正在开发的 BeanPostProcessor 确实有对其他 bean 的直接引用,但它是一组非常有限的引用。尽管如此,根据日志消息,我上下文中的几乎所有 bean 都被排除在自动代理之外,但我看不到这种依赖关系发生在哪里。
有没有人找到更好的方法来追踪这个问题?
【问题讨论】:
-
您还可以获得
PersistenceExceptionTranslator类的信息消息。