ComponentScan.basePackageClasses与ComponentScan.basePackages一起注册一个Spring webMVC控制器?

时间:2014-06-09 22:39:14

标签: spring spring-mvc

我想在Spring WebApplicationContext中添加一个特定的控制器类。我遇到了以下示例:(它在Scala中,但是从这里改编:using ComponentScan or context:component-scan with only one class

@Configuration 
@ComponentScan(
  basePackages = Array("com.example.controllers"),
  useDefaultFilters = false,
  includeFilters = Array(
    new ComponentScan.Filter(`type` = FilterType.ASSIGNABLE_TYPE,
      value = Array(classOf[com.example.controllers.MyController]))))
class MyConfig {
}

这很好用(但非常详细)。 但Spring的@ComponentScan也有basePackageClasses

@Configuration 
@ComponentScan( basePackageClasses=Array(classOf[com.example.controllers.MyController])) 
class MyConfig {
}

对于basePackageClasses,Spring的文档说:

Type-safe alternative to basePackages() for specifying the packages to
scan for annotated components.

然而,虽然第一个ComponentScan正确地添加了com.example.controllers.MyController,但第二个导致我的所有@Controller被扫描并添加!为什么? basePackageClasses有什么用?

例如:https://github.com/mikaelhg/springmvc-example/blob/master/src/main/java/mikaelhg/example/ExampleConfiguration.java 建议basePackageClasses可用于加载单个组件。


更新:

顺便说一下,替换:

@Configuration 
@ComponentScan(
  basePackages = Array("com.example.controllers"),
  useDefaultFilters = false,
  includeFilters = Array(
    new ComponentScan.Filter(`type` = FilterType.ASSIGNABLE_TYPE,
      value = Array(classOf[com.example.controllers.MyController]))))
class MyConfig {
}

@Configuration 
class MyConfig {

  @Bean
  var myController = new com.example.controllers.MyController

}

似乎MyController永远不会连接到servlet(行为更改为404-NotFound) - 添加到WebApplicationContext时。

1 个答案:

答案 0 :(得分:15)

该属性的完整javadoc读取

  

basePackages()的类型安全替代方法,用于指定包   扫描带注释的组件。 指定的每个类的包   将被扫描。

     

考虑在每个中创建一个特殊的无操作标记类或接口   除了被引用之外没有任何目的的包   属性。

通过类型安全,您无法使用包名称的String值进行任何错误。如果指定了不正确的类,它将在编译时失败。

当您指定basePackageClasses时,Spring将扫描您指定的类的包(以及子包)。这是一个很好的技巧,使用无操作类/接口,如ControllersServices等。将所有控制器放在一个包含Controllers类的包中,并指定Controllers basePackageClasses中的课程。春天会把它们都拿起来。

您仍需要指定过滤器。