【问题标题】:How to exclude a class from Spring in applicationContext?如何在applicationContext中从Spring中排除一个类?
【发布时间】:2012-10-23 15:55:10
【问题描述】:

这里我们只想从某个类路径中排除一个类,比如说

com.abc.projectA.service.orderService.sectionA.orderService.class

但是有另一个类同名但在不同的类路径中

com.abc.projectA.service.orderService.sectionB.orderService.class

这样只有按类名的文件管理器不起作用。

但是我尝试了以下方法:

<context:component-scan base-package="com.abc">
    <!--other filters-->
    <!--.......-->
    <context:exclude-filter expression="projectA\.service\.orderService\.sectionA\.orderService" type="regex" />
</context:component-scan>

它不起作用。所以我打赌&lt;context:exclude-filter&gt; 仅在包级别有效,但不适用于特定类?如果是这样,如何从 bean 注入中排除一个类,以便我们可以选择与类一起使用相同的类名?

提前致谢。

【问题讨论】:

    标签: java spring


    【解决方案1】:

    不,排除应该有效,您遇到的问题可能是您假设正则表达式中的路径将预先添加不正确的基本包..所以只需指定完整包

    <context:component-scan base-package="com.abc">
        <!--other filters-->
        <!--.......-->
        <context:exclude-filter expression="com\.abc\.projectA\.service\.orderService\.sectionA\.orderService" type="regex" />
    </context:component-scan>
    

    【讨论】:

    • 谢谢。如果在实际情况中我们真的想排除一个方面(不是表达式,而是 aspect.aj 和 aspact.class),我们怎样才能达到同样的目标呢?
    【解决方案2】:

    当您设置 bean 时,您应该包括类的完整包位置,这样重复名称的类就不会成为问题。例如:

    <bean id="orderServiceA" class="com.foo.bar.a.OrderService">
    
    <bean id="orderServiceB" class="com.foo.barr.b.OrderService">
    

    现在您可以两者兼得,而不会遇到任何问题。也许我遗漏了一些东西,但我不明白为什么你需要消除一个类,因为它与不同包中的另一个类具有相同的名称。我的意思是 Java SDK 有多个名为 List 的类,它永远不会导致问题。

    【讨论】:

    • 感谢您的建议,但是因为默认情况下 Spring 将通过名称而不是 id 来识别 bean,在实际情况下,我们实际上想要排除一个方面而不是常规类,因此可能不使用 id 来识别豆子。
    • 然后为beans提供一个name属性。
    【解决方案3】:

    在我看来,您试图打破 Java Spec: section 7.7 中描述的唯一包名称约定。

    或者您是否尝试加载相同类的不同版本?您的类加载器可能无法消除歧义。

    【讨论】:

    • 感谢您的建议。是的,这不是一个好的做法,它是一种特殊情况。
    猜你喜欢
    • 1970-01-01
    • 2011-10-14
    • 2019-07-03
    • 2018-10-29
    • 1970-01-01
    • 1970-01-01
    • 2017-11-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多