关于ComponentScan

923 阅读1分钟

在项目中因为ComponentScan的错误使用,产生了bug,特来记录一下。

使用@ComponentScan注解,能够在Spring中启用逐渐扫描。

如果没有其他配置的话,按照默认规则,@ComponentScan会以配置类所在的包作为基础包(base package)来扫描组件。

有一个原因会促使我们明确地设置基础包,那就是我们想要将配置放置在单独的包里,使其与其他的应用代码区分开来。

为了指定不同的基础包,所需要做的就是在@ComponentScan的value属性中指明包的名称:

@Configuration
@ComponentScan("soundsystem")
public class CDPlayerConfig {}

如果你想更加清晰地表明你所设置的是基础包,那么可以通过backPackages属性进行配置:

@Configuration
@ComponentScan(basePackages="soundsystem")
public class CDPlayerConfig {}

如果需要设置多个基础包,只需要将basePackages属性设置为要扫描的包的一个数组即可:

@Configuration
@ComponentScan(basePackages={"soundsystem", "video"})
public class CDPlayerConfig {}

在上面例子中,所设置的基础包是以String类型表示的,但这种方法是类型不安全(not type-safe)的。如果你重构代码的话,那么指定的基础包就可能出现错误。

除了将包设置为简单的String类型之外,@ComponentScan还提供了另外一种方法,就是将其指定为包中所含的类或接口:

@Configuration
@ComponentScan(basePackageClasses={CDPlayer.class, DVDPlayer.class})
public class CDPlayerConfig {}