- @ConditionalOnClass:如果类路径中存在这个类,则触发指定行为
- @ConditionalOnMissingClass:如果类路径中不存在这个类,则触发指定行为
- @ConditionalOnBean:如果容器中存在这个Bean(组件),则触发指定行为
- @ConditionalOnMissingBean:如果容器中不存在这个Bean(组件),则触发指定行为
综上,我们总结一下:
- 首先我们创建一个SpringBoot工程,这个工程中包含了 spring-boot-starter-parent 这个pom 父工程,这个父工程中继承了spring-boot-dependencie 这个pom父工程,而这个spring-boot-dependencies主要的职责就是管理了 SpringBoot 全场景的依赖版本信息。
- 接下里我们导入具体的场景启动器,这里我们以 spring-boot-starter-web 为例,它 继承了 spring-boot-starter 这个父工程(所有的场景启动器都会继承这个父工程),spring-boot-starter 这个父工程 包含了 全场景的所有依赖,而 spinrg-boot-starter-web这个pom文件中定义的依赖可以理解为 激活了 这个父工程中 某些和web相关的依赖组件 比如 spring-tomcat、springmvc、spring-json等等。
- 其实将这些特定场景所需的依赖导入进来还是远远不够的,因为我们知道,还需要对它们进行配置属性,还需要将它们加入到容器中,而 spring-boot-starter 这个pom文件中还包含了一个很关键的 spring-boot-autoConfigure,这个包里面包含了 全场景的依赖的自动配置类,同样的,虽然包含了所有场景的自动配置类,但是并不是所有都会开启,只有符合当前场景要求的才会开启。
下面我介绍一下@SpringBootAppliacation这个注解
XXXAutoConfiguration 类的作用
- 首先我们知道,@Configuration这个注解的作用就是 配置类,我们可以通过编写这个配置类,加入@Bean的注解,让一些Entity加入容器,所以这个XXXAutoConfiguration这个类的作用就是让 外部类 加入 容器 称为Bean。
- 其次我们还看到,这些配置类中,还加入了 xxxxProperties.class 的配置属性类,用来给Bean设置属性的。
- 而这些xxxxProperties又是根据application.properties中的信息,将属性提取出来的。(当然,这里application.properties中没有定义这些属性,所以它这里用的是一些默认的属性,而当我们自己在appliacation.properties中定义这些属性的适合,就会生效了)。