我想在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时。
答案 0 :(得分:15)
该属性的完整javadoc读取
basePackages()的类型安全替代方法,用于指定包 扫描带注释的组件。 指定的每个类的包 将被扫描。
考虑在每个中创建一个特殊的无操作标记类或接口 除了被引用之外没有任何目的的包 属性。
通过类型安全,您无法使用包名称的String
值进行任何错误。如果指定了不正确的类,它将在编译时失败。
当您指定basePackageClasses
时,Spring将扫描您指定的类的包(以及子包)。这是一个很好的技巧,使用无操作类/接口,如Controllers
,Services
等。将所有控制器放在一个包含Controllers
类的包中,并指定Controllers
basePackageClasses
中的课程。春天会把它们都拿起来。
您仍需要指定过滤器。