Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring的替代品';出于性能原因,s@可配置吗?_Java_Spring_Configurable_Aspect - Fatal编程技术网

Java Spring的替代品';出于性能原因,s@可配置吗?

Java Spring的替代品';出于性能原因,s@可配置吗?,java,spring,configurable,aspect,Java,Spring,Configurable,Aspect,我将@configurablebeans用于非托管spring实例,这段代码必须具有高性能。我们在新操作符中使用了大量非托管bean,在我们的评测中,我们注意到@Configurable注释的使用大大降低了速度 对于这个特定的部分,我们想要一种从上下文中提取bean的更快的方法(只是一个直接的applicationContext.getBean()。我知道我们放弃了国际奥委会这样做,但这是一种特殊的情况,不是一种正常的模式 我们正在使用CTW进行编织,但我想知道spring在幕后使用什么机制来获

我将@configurablebeans用于非托管spring实例,这段代码必须具有高性能。我们在新操作符中使用了大量非托管bean,在我们的评测中,我们注意到@Configurable注释的使用大大降低了速度

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


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

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

这意味着(在编译时,当您编织时,@Configurable注释会连接到singleton
annotationbeanconfigurationspect
)。然后,当您加载应用程序上下文时,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中注入了依赖项,而且性能要好得多,谢谢。