尝试编写自定义 BeanPostProcessor 我发现许多教程展示了从我的 bean 创建代理对象并将其返回由另一个 BeanPostProcessor 处理的简单方法。我想知道,这种方法是否会破坏进一步的 BPP 链,因为下一个 BPP 将看不到类元数据?是否有一些其他技巧可以避免这些教程中未显示的断链?另外,在创建同一个bean的@Transactional、@Async等代理时,spring本身如何处理这种情况?
如果在 DefaultSingletonBeanRegistry::getSingleton 中放置断点,您将能够内省 this.beanPostProcessors 并查看处理器及其顺序。 事务后处理器是 APO,因此它们将使用 CGLib 来扩展您的原始 bean,对于事务,您可以在
AbstractBeanFactoryAwareAdvisingPostProcessor::prepareProxyFactory
中放置一个断点来查看哪些 bean 被 @Trancational 包装。
与 Spring 中的大多数内容一样,
@Ordered
可用于控制后处理器的应用顺序,一个经典示例是如何处理(Spring 集成)@Retry 和 @Transactional,Spring Retry with Transactional。