如何限制Spring组件扫描到我的战争中的文件?

问题描述:

我使用Spring的组件扫描在我的应用程序中查找bean。如何限制Spring组件扫描到我的战争中的文件?

<context:component-scan base-package="com.myapp"/> 

然而,当应用程序部署我们的临时服务器上(JBoss的5有很多的应用程序的部署)的性能比发展(也JBoss的5,但一些应用程序)要慢得多。组件扫描需要很长时间。我怀疑这是由于一个更大的类路径?

有没有一种简单的方法让Spring只在我的war文件中查找bean?即WEB-INF/classes和WEB-INF/lib?还是有另一种解决方案?

+0

我现在有确切的要求。你知道了吗? – Ravi 2012-10-04 22:17:14

+0

没有。我实际上摆脱了组件扫描,并在applicationContext.xml中列出了这些bean。 – 2012-10-05 18:22:16

+0

感谢您回复。我也使用弹簧控制器。你是如何处理@Controller类的? (假设你使用spring mvc) – Ravi 2012-10-10 14:42:02

你能不能只针对你的基础包指令更具体?

+0

这只是一个例子。真正的是非常具体的,只涵盖了不到100班。 – 2011-06-17 06:29:28

两个提示;

  • 尝试尽可能与base-package一样具体:您可以在base-package属性中提供几个包,用逗号分隔。
  • 使用过滤器;检查文档here。 - 您可以指定要扫描的注释(例如,如果您只使用@Component)并且还可以指定类名必须匹配的正则表达式。

您应该将类​​路径扫描设置设置为您的包(例如“com.foo”)。但是,在阶段与开发阶段,classpath中类的数量应该没有太大差别。这将是你的WAR加上服务器范围的类,它应该大致相同。具体而言,您的类路径中不会有其他WAR中的类。

我怀疑服务器过载。您应该从该机器获得一些统计信息:即CPU利用率是多少?有很多磁盘I/O?分页/交换是否过度?同时检查JVM的内存使用情况 - 也许它花了很多时间进行垃圾回收。

如果指定

<context:component-scan base-package="com.myapp" resource-pattern="/WEB-INF/classes/**/*.class"/> 

或这种方法的一些替代的是什么?

+0

不适用于我..春天只是忽略类@upvoter这种方法适合你吗? – Ravi 2012-10-04 22:18:02

我不知道你是否有解决方案,但有同事,我有一个潜在的解决方案。

完全披露我们在Snowdrop项目上为Red Hat工作,该项目为JBoss上的Spring应用程序提供支持。

潜在的解决方案是使用雪莲的JBoss命名空间中的组件扫描 - https://github.com/snowdrop/snowdrop/tree/CustomBeanScanner

使用,你可以添加自定义组件扫描仪等等,而不是<context:component-scan base-package="foo.bar"/>,你可以使用:<jboss:component-scan base-package="foo.bar"/>

我们知道它的作用,但我们不知道是否有人想改变他们的应用程序来使用该功能。有意识的耦合值得加速吗?

上面列出的分支上的代码可供任何人试用/使用。

谢谢, 约书亚

+0

我应该补充说JBoss已经为应用中的类编制了索引,我们正在利用这一点,同时防止Spring再次索引它。 – 2013-07-12 14:08:25

+0

“CustomBeanScanner”的链接已死亡。 – 2017-03-13 10:09:42

+0

我只是点了它,它适用于我。 – 2017-03-15 02:57:48