1. 为什么扫描包的时候默认扫描主启动类所在的包?

如题,在开发中,一般要求标注 @Component@Repository 等注解的类所在包要和主启动类同一个包,否则就要在主启动类配置 @ComponentScan 注解的 basePackages 来指定要扫描的包。

其实,问题的根源就在 @ComponentScan 注解上。

@ComponentScan

@ComponentScan 注解对应 Spring XML 配置形式中的 <context:component-scan> 元素,用于配合一些元信息 Java Annotation,比如 @Component@Repository 等,将标注了这些元信息 Annotation 的 bean 定义类批量采集到 Spring 的 IoC 容器中。

参考《SpringBoot 揭秘》

而通过 basePackages 属性可以指定扫描包的范围,如果不指定,默认 Spring 框架实现会从声明 @ComponentScan 所在类的 package 进行扫描。

那么 SpringBoot 为什么能默认扫描到主启动类所在包下的 bean 呢?

其实对于 SpringBoot 而言,主启动类上的 @SpringBootApplication 注解整合了 @ComponentScan 注解,导致默认扫描的包为主启动类所在的包。

  1. @Target(ElementType.TYPE)
  2. @Retention(RetentionPolicy.RUNTIME)
  3. @Documented
  4. @Inherited
  5. @SpringBootConfiguration
  6. @EnableAutoConfiguration
  7. @ComponentScan(excludeFilters = {
  8. @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
  9. @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class)})
  10. public @interface SpringBootApplication

2. SpringBoot 启动前的初始化方法

https://blog.csdn.net/li3455277925/article/details/100587885
https://mp.weixin.qq.com/s/NAgG-1OzwxnBKadWnQbF1Q

SpringBoot Application事件监听

下面按照加载顺序排序依次为:

  1. ApplicationEnvironmentPreparedEvent:当在上下文中使用的 Environment 已知但在创建上下文之前发送 ApplicationEnvironmentPreparedEvent
  2. ApplicationPreparedEvent: 在开始刷新之前,bean 定义被加载之后发送 ApplicationPreparedEvent
  3. ApplicationStartingEvent: 在运行开始时但在任何处理之前发送 ApplicationStartingEvent ,但监听器和初始化程序的注册除外。
  4. ApplicationStartedEvent:在刷新上下文之后但在调用任何应用程序和命令行运行程序之前发送 ApplicationStartedEvent 。
  5. ApplicationReadyEvent:在调用任何应用程序和命令行运行程序后发送 ApplicationReadyEvent 。它表示应用程序已准备好为请求提供服务。
  6. ApplicationFailedEvent:如果启动时发生异常,则发送 ApplicationFailedEvent 。

    CommandLineRunner、ApplicationRunner

    ApplicationRunnerCommandLineRunner的执行在 ApplicationReadyEvent之后)

    SpringBoot(五)外部化配置 - Environment

    https://www.cnblogs.com/loongk/p/12046582.html