1. 包扫描的路径

@ComponentScan 注解可以指定包扫描的路径(而且还可以声明不止一个),它的写法是使用 @ComponentScan 的 value / basePackages 属性:

  1. @Configuration
  2. @ComponentScan("com.linkedbear.spring.annotation.e_basepackageclass.bean")
  3. public class BasePackageClassConfiguration {
  4. }

1.1 声明几个组件类+配置类

继续沿用之前注解驱动 IOC 的包吧,咱这里创建一个 e_basepackageclass 包,声明几个组件和配置类:
image.png

1.2 标注配置类的包扫描规则

配置类中,声明包扫描配置,咱先拿 DemoService 传进去:

  1. @Configuration
  2. @ComponentScan(basePackageClasses = DemoService.class)
  3. public class BasePackageClassConfiguration {
  4. }

1.3 测试运行

编写启动类,驱动 IOC 容器,并打印容器中所有的 Bean 的名称:

  1. public class BasePackageClassApplication {
  2. public static void main(String[] args) throws Exception {
  3. AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(BasePackageClassConfiguration.class);
  4. String[] beanDefinitionNames = ctx.getBeanDefinitionNames();
  5. Stream.of(beanDefinitionNames).forEach(System.out::println);
  6. }
  7. }

运行 main 方法,发现控制台中只打印了 DemoService 与 DemoDao :

  1. org.springframework.context.annotation.internalConfigurationAnnotationProcessor
  2. org.springframework.context.annotation.internalAutowiredAnnotationProcessor
  3. org.springframework.context.annotation.internalCommonAnnotationProcessor
  4. org.springframework.context.event.internalEventListenerProcessor
  5. org.springframework.context.event.internalEventListenerFactory
  6. basePackageClassConfiguration
  7. demoDao
  8. demoService

说明它确实以 DemoService 所在的包为基准扫描了,不过没有扫描到 DemoComponent 。

1.4 加入DemoComponent