Java Spring的替代品';出于性能原因,s@可配置吗?
我将@configurablebeans用于非托管spring实例,这段代码必须具有高性能。我们在新操作符中使用了大量非托管bean,在我们的评测中,我们注意到@Configurable注释的使用大大降低了速度 对于这个特定的部分,我们想要一种从上下文中提取bean的更快的方法(只是一个直接的applicationContext.getBean()。我知道我们放弃了国际奥委会这样做,但这是一种特殊的情况,不是一种正常的模式Java Spring的替代品';出于性能原因,s@可配置吗?,java,spring,configurable,aspect,Java,Spring,Configurable,Aspect,我将@configurablebeans用于非托管spring实例,这段代码必须具有高性能。我们在新操作符中使用了大量非托管bean,在我们的评测中,我们注意到@Configurable注释的使用大大降低了速度 对于这个特定的部分,我们想要一种从上下文中提取bean的更快的方法(只是一个直接的applicationContext.getBean()。我知道我们放弃了国际奥委会这样做,但这是一种特殊的情况,不是一种正常的模式 我们正在使用CTW进行编织,但我想知道spring在幕后使用什么机制来获
我们正在使用CTW进行编织,但我想知道spring在幕后使用什么机制来获取应用程序上下文,这样我们就可以简单地获取它并使用getBean了?静态应用程序上下文?它是否存储在threadlocal中?方面是由AspectJ管理的单例。当您在Spring配置文件中放入一个方面时,Spring实际上并没有创建这个方面。相反,它使用
aspectOf()
获取对方面的引用
这意味着(在编译时,当您编织时,@Configurable注释会连接到singletonannotationbeanconfigurationspect
)。然后,当您加载应用程序上下文时,Spring获得对同一个单例方面的引用,并对该方面调用setBeanFactory()
方法(因为它实现了BeanFactoryAware
)
这种魔法当然会带来麻烦。如果您有两个应用程序上下文,那么第二个将覆盖第一个应用程序上下文的配置,这可能会非常混乱
要直接回答您的问题,这意味着您所要做的就是创建一个实现BeanFactoryAware
(以下是您可以用作示例的代码)的新方面,然后在spring配置文件中“实例化”同一方面,您的方面现在就可以访问bean工厂了
如果你想提高性能,那么请注意,上面的内容并不比创建一个对
BeanFactory
的静态引用,并在启动应用程序时实例化它干净多少,所以你最好做一个简单的静态引用。这个问题对我来说没有多大意义。Spring文档描述了@Configurable是如何实现的(参见3.1参考的第8.8.1节),它们还描述了如何访问应用程序上下文。但是,真的,你认为getBean()
将如何让你的生活更轻松?如果您准确地描述您使用@Configurable做什么,您的问题会更好(并且更有可能得到有用的答案),因为可能有更好的解决方案。看看Apache Wicket module Wicket ioc是如何处理依赖注入的。他们的方法对非托管bean非常有效,并且出于性能原因,采用了缓存机制。我已经创建了他们模块的一个依赖于intedependent的版本,因此它可以作为@Configurable的替代品在任何地方使用——我们最终使用了一个spring托管bean的静态引用,该bean中注入了依赖项,而且性能要好得多,谢谢。