0

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

对于这个特定的部分,我们想要一种更快的从上下文中提取 bean 的方法(只是一个直接的 applicationContext.getBean())。我知道我们放弃了 IoC 这样做,但这是一种特殊情况,而不是正常模式。

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

4

1 回答 1

1

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

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

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

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

如果您要追求性能,请注意,上面的内容并不比BeanFactory在启动应用程序时创建对 的静态引用并实例化它更干净,因此您最好使用静态引用,因为它更简单。

于 2013-03-29T13:52:41.597 回答