如何将Spring组件扫描限制为仅在我的战争中的文件?

时间:2011-06-17 06:23:15

标签: java spring jboss

我正在使用Spring的组件扫描在我的应用程序中查找bean。

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

然而,在我们的登台服务器(部署了大量应用程序的JBoss 5)上部署应用程序时的性能要比开发中慢得多(同样是JBoss 5,但应用程序很少)。组件扫描需要很长时间。我怀疑这是由于更大的类路径?

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

5 个答案:

答案 0 :(得分:3)

两个提示;

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

答案 1 :(得分:3)

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

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

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

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

我们知道它有效,但我们不知道是否有人想要更改其应用程序以使用该功能。故意耦合是否值得提高速度?

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

感谢, 约书亚

答案 2 :(得分:2)

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

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

答案 3 :(得分:2)

如果您指定

,该怎么办?
<context:component-scan base-package="com.myapp" resource-pattern="/WEB-INF/classes/**/*.class"/>

或这种方法的其他替代方案?

答案 4 :(得分:0)

您是否可以更加具体地使用基本包指令?