我在一段必须高性能的代码中为非托管spring实例使用了@Configurable。我们在new运算符中使用了大量的非托管bean,并且在我们的概要分析中,我们注意到@Configurable注解的使用大大降低了速度。
对于这一特定部分,我们希望有一种更快的方法从上下文中提取bean(只需直接使用applicationContext.getBean())。我知道我们放弃了IoC这样做,但这是一个特殊的情况,不是一个正常的模式。
我们使用CTW进行编织,但我想知道spring在幕后使用了什么机制来获取应用程序上下文,这样我们就可以简单地获取它并使用getBean?静态应用程序上下文?它是否存储在某个地方的threadlocal中?
发布于 2013-03-29 21:52:42
Aspects是由AspectJ管理的单例。当您将一个方面放入Spring配置文件中时,Spring实际上并没有创建这个方面。相反,它使用aspectOf()获取对方面的引用。
这意味着(在编译时,当你编织时)你的@可配置注解被挂接到单例AnnotationBeanConfigurerAspect中。然后,当您加载应用程序上下文时,Spring将获得对相同单例方面的引用,并对该方面调用setBeanFactory()方法(因为它实现了BeanFactoryAware)。
当然,这种魔法可能会带来麻烦。如果您有两个应用程序上下文,那么第二个上下文将覆盖第一个上下文的配置,这可能会非常混乱。
为了直接回答您的问题,这意味着您所要做的就是创建一个实现BeanFactoryAware的新方面(这里是AnnotationBeanConfigurerAspect的代码,您可以将其用作示例),然后在spring配置文件中“实例化”相同的方面,您的方面现在将可以访问bean工厂。
如果你追求的是性能,那么请注意,上面的方法并不比创建一个对BeanFactory的静态引用并在你启动应用程序时实例化它干净多少,所以你最好还是做静态引用,因为它更简单。
https://stackoverflow.com/questions/15704094
复制相似问题