gpt4 book ai didi

java - 出于性能原因,可以替代 Spring 的 @Configurable 吗?

转载 作者:行者123 更新时间:2023-12-01 14:43:28 27 4
gpt4 key购买 nike

我在一段必须高性能的代码中将 @Configurable beans 用于非托管 spring 实例。我们通过 new 运算符使用了大量非托管 bean,在我们的分析中,我们注意到 @Configurable 注释的使用大大减慢了速度。

就这个特定部分而言,我们希望有一种更快的方法从上下文中提取 bean(只需直接 applicationContext.getBean())。我知道我们放弃了 IoC 这样做,但这是一个特殊的场景,而不是正常的模式。

我们使用 CTW 进行编织,但我想知道 spring 在幕后使用什么机制来获取应用程序上下文,以便我们可以简单地获取它并使用 getBean?静态应用程序上下文?它是否存储在 threadlocal 的某个地方?

最佳答案

方面是由 AspectJ 管理的单例。当您将一个方面放入 Spring 配置文件时,Spring 实际上并不创建该方面。相反,它使用 aspectOf() 获取对该方面的引用。 .

这意味着(在编译时进行编织时)您的 @Configurable 注释被挂接到单例 AnnotationBeanConfigurerAspect 中。 。然后,当您加载应用程序上下文时,Spring 会获取对同一单例方面的引用并调用 setBeanFactory()方面的方法(因为它实现了 BeanFactoryAware )。

这种魔法当然会带来麻烦。如果您有两个应用程序上下文,那么第二个应用程序上下文将覆盖第一个应用程序上下文的配置,这可能会非常困惑。

要直接回答您的问题,这意味着您所要做的就是创建一个实现 BeanFactoryAware 的新方面。 (这里是 AnnotationBeanConfigurerAspect 的代码,您可以将其用作示例),然后在 spring 配置文件中“实例化”相同的方面,您的方面现在可以访问 bean 工厂。

如果您追求性能,请注意上面的内容并不比创建对 BeanFactory 的静态引用干净多少。并在启动应用程序时实例化它,这样您也可以执行静态引用,因为它更简单。

关于java - 出于性能原因,可以替代 Spring 的 @Configurable 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15704094/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com