SpringBoot---3.自动配置、监听机制、启动流程
一、SpringBoot自动配置
1.@Condition注解
Condition是在Spring 4.0增加的条件判断功能,通过这个功能可以实现选择性的创建Bean操作。
自定义条件:
①定义条件类:自定义类实现 Condition 接口,重写 matches 方法,在 matches 方法中进行逻辑判断,返回boolean 值 。 matches 方法两个参数:
- context :上下文对象,可以获取属性值,获取类加载器,获取 BeanFactory 等。
- metadata :元数据对象,用于获取注解属性。
②判断条件: 在初始化 Bean 时,使用 @Conditional 条件类 class 注解
SpringBoot 提供的常用条件注解:
- ConditionalOnProperty 判断配置文件中是否有对应属性和值才初始化 Bean
- ConditionalOnClass 判断环境中是否有对应字节码文件才初始化 Bean
- ConditionalOnMissingBean 判断环境中没有对应 Bean 才初始化 Bean
2.切换内置web服务器
SpringBoot的 web 环境中默认使用 tomcat 作为内置服务器,其实 SpringBoot 提供了 4 种内置服务器供我们选择,我们可以很方便的进行切换。
3.@Enable*注解
SpringBoot中提供了很多 Enable 开头的注解,这些注解都是用于动态启用某些功能的。而其底层原理是使用 @Import 注解导入一些配置类,实现 Bean 的动态加载。
场景:当前在com.itheima.springbootenable包下,想要获取第三方包(com.huawei.config)下的Bean
方法1:用@ComponentScan扫描com.itheima.config,@ComponentScan默认扫描范围为当前引导类所在包及其子包
缺点:第三方包很多的情况下,一个一个加扫描比较麻烦
方法2:使用@Import注解,加载类。这些类都会被Spring创建,并放入IOC容器。
缺点:第三方包很多的情况下,需要记录类名,一个一个导入比较麻烦
方法3:可以对@Import注解进行封装,第三方包里提供EnableUser注解,该注解可以帮我们引入bean,然后在本项目下使用@EnableUser注解。
4.@Import注解
@Enable底层依赖于 @Import 注解导入一些类,使用 @Import 导入的类会被 Spring 加载到 IOC 容器中。而 @Import 提供 4 种用法:
(1)导入 Bean
(2)导入配置类
(3)导入 ImportSelector 实现类
一般用于加载配置文件中的类
(4)导入 ImportBeanDefinitionRegistrar 实现类
5.@EnableAutoConfiguration注解
@EnableAutoConfiguration注解内部使用@Import(AutoConfigurationImportSelector.class)来加载配置类。
配置文件位置: META INF/spring.factories ,该配置文件中定义了大量的配置类,当 SpringBoot 应用启动时,会自动加载这些配置类,初始化 Bean。
并不是所有的 Bean 都会被初始化,在配置类中使用 Condition 来加载满足条件的 Bean。
举例:
二、SpringBoot监听机制
Java监听机制:
Java中的事件监听机制定义了以下几个角色:
- ①事件:Event,继承 java.util.EventObject 类的对象
- ②事件源:Source,任意对象 Object
- ③监听器:Listener,实现 java.util.EventListener 接口 的对象
SpringBoot的监听机制:
其实是对 Java 提供的事件监听机制的封装。
SpringBoot在项目启动时,会对几个监听器进行回调,我们可以实现这些监听器接口,在项目启动时完成一些操作。
ApplicationContextInitializer、 SpringApplicationRunListener 、 CommandLineRunner 、 ApplicationRunner
三、SpringBoot启动流程分析
参考链接:
【1】快速入门Java微服务架构Spring Boot