使用@ComponentScan或<context:component-scan />只有一个类

Sha*_*adi 27 spring spring-mvc component-scan

我正在维护一个包含两组主程序包的项目,该项目使用的是Spring和Spring MVC,其中一个程序包包含多个控制器,并使用XML configuration(<context:component-scan />)进行扫描.

问题是在另一个包中有一个类(未扫描),我需要扫描这个类,但只需要这个类,而不是包中的其他类.我现在无法改变它的包装,因为它现在风险太大了.

那么有没有办法使用注释或XML 来做到这一点?

Eme*_*gia 54

@Bart对XML的说法.

如果您需要使用注释引入该类,请将以下内容添加到其中一个@Configuration类中

@ComponentScan(
    basePackageClasses = YourClass.class, 
    useDefaultFilters = false,
    includeFilters = {
        @ComponentScan.Filter(type = ASSIGNABLE_TYPE, value = YourClass.class)
    })
Run Code Online (Sandbox Code Playgroud)

  • 将包添加到`basePackages`,将类添加到`value`属性,使其成为使用大括号的数组. (3认同)
  • 它有效,但我想知道是否有更少"冗长" (3认同)
  • 如果我需要从不同的包中提取一堆个别类怎么办? (2认同)

Bar*_*art 21

简单地添加就像你的上下文中的bean一样

<bean class="my.package.MyClass" />
Run Code Online (Sandbox Code Playgroud)

  • 有没有办法在普通Java中做到这一点?我知道@Bean然后我总是要返回一个bean的实例,而不仅仅是类,让spring实现它... (4认同)

Rob*_*unt 9

除了艾默生·法鲁吉亚(Emerson Farrugia)所描述的方法外,还有一个较为简单的解决方案,该解决方案自Spring Framework 4.2以来就得到了支持,如此处的文档所述

从Spring Framework 4.2开始,@Import还支持对常规组件类的引用,类似于该 AnnotationConfigApplicationContext.register方法。如果要通过使用一些配置类作为入口点来显式定义所有组件,从而避免组件扫描,则此功能特别有用。

因此,您的示例将变成:

@Import(YourClass.class)
Run Code Online (Sandbox Code Playgroud)