我在一段必须高性能的代码中使用@Configurable beans作为非托管spring实例。我们在new运算符中使用了很多非托管bean,在我们的分析中,我们注意到使用@Configurable注释会使事情变慢。
就这个特定部分而言,我们想要一种更快的方式从上下文中提取bean(只是直接的applicationContext.getBean())。我知道我们放弃IoC这样做,但这是一种特殊情况而不是正常模式。
我们正在使用CTW进行编织,但我想知道Spring在幕后使用什么机制来获取应用程序上下文,以便我们可以简单地抓住它并使用getBean?静态应用程序上下文?它存储在threadlocal的某个地方吗?
答案 0 :(得分:1)
方面是由AspectJ管理的单身人士。当你在Spring配置文件中放置一个方面时,Spring实际上并没有创建方面。相反,它使用aspectOf()
获取对方面的引用。
这意味着(在编织时编译时)@Configurable注释会挂钩到单例AnnotationBeanConfigurerAspect
。然后,当您加载应用程序上下文时,Spring获取对同一单例方面的引用,并在方面调用setBeanFactory()
方法(因为它实现了BeanFactoryAware
)。
这个魔法当然会导致麻烦。如果您有两个应用程序上下文,那么第二个将覆盖第一个可能非常混乱的配置。
要直接回答您的问题,这意味着您所要做的就是创建一个实现BeanFactoryAware
的新方面(这里是AnnotationBeanConfigurerAspect的代码,您可以将其作为示例),然后“实例化“弹簧配置文件中的相同方面,您的方面现在可以访问bean工厂。
如果你想要表现,那么请注意上面的内容并不比创建BeanFactory
的静态引用更清晰,并且在启动应用程序时实例化,所以你也可以将静态引用作为它更简单。