# springboot-experiment02 **Repository Path**: classmate-he/springboot-experiment02 ## Basic Information - **Project Name**: springboot-experiment02 - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-04-18 - **Last Updated**: 2021-08-31 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # **实验二 利用Spring boot的自动装配特性实现动态注册组件** ## 1、**实验目的** 1. 掌握Spring Boot的自动配置原理; 2. 掌握Spring框架动态注册Bean的原理; 3. 掌握自动生成元数据文件。 4. 掌握spring框架的事件模型。 ## 2、**实验环境** 1. JDK 1.8或更高版本 2. Maven 3.6+ 3. IntelliJ IDEA ## 3、**实验任务** ### 1.通过IntelliJ IDEA的Spring Initializr向导创建Spring Boot项目。 ### 2.创建一个自定义的CommandLineRunner接口的实现类。 ​ `CommandLineRunner` 接口的 `Component` 会在所有 `Spring Beans `都初始化之后,`SpringApplication.run() `之前执行,适合拿来在项目启动之前做初始化 ### 3.创建一个自定义的自动配置类 ​ ### 4、创建spring.factories文件 运行结果: 由上图可知,我们自定义的自动配置类已经生效。 ### 5、给自动配置类添加有效条件。 步骤如下: #### 1)利用 **@ConditionalOnProperty** 注解,添加属性条件。 #### 2)在application.properties属性文件中添加一个自定义的属性。 #### 3)切换属性值false/true,观察终端的显示,判断自动装配的配置类是否生效。 ​ 切换属性值,不论属性值为true或false,自动装配的配置类都会生效 ### 6、自定义的一个Bean,绑定属性值,并生成spring配置类的元数据文件。 步骤如下: #### 1)创建一个类,并在类上加@ConfigurationProperties注解,设置注解的prefix属性指定绑定的属性的前缀。 #### 2)在某个配置类上添加@EnableConfigurationProperties,并指定装配的属性Bean。 #### 3.使用spring boot框架提供的注解处理器生成自定义属性的元数据文件。 **说明:** Spring Boot应程序打包后的jar文件中包含元数据文件,这些文件提供了所有受支持的配置属性的详细信息。这些文件旨在让IDE开发人员在编辑application.properties或application.yml文件时提供上下文帮助和“代码完成” 。Interllj IDEA默认支持。 元数据文件位于META-INF目录下,名字spring-configuration-metadata.json。 元数据文件可以自己写,或使用spring boot官方提供的依赖包自动生成。 在pom.xml文件中引入spring-boot-configuration-processor依赖。这个依赖包里有spring boot提供的注解处理器,在项目编译时检查项目内所有@ConfigurationProperties的类,并生成元数据文件。 a.在pom.xml文件中引入spring-boot-configuration-processor依赖: b.编译打包项目。观察target目录下的元数据文件: c.现在我们再回去编辑属性文件时,只要输入属性的部分关键字,idea会自动提示,如下图: [推荐阅读:配置元数据官方文档](https://docs.spring.io/spring-boot/docs/current/reference/html/appendix-configuration-metadata.html) 7.根据阅读框架源码,我们可以自定义一个事件发布器,并设置线程池,实现异步发布事件。 **注意**:这个自定义的事件发布器的Bean的名称必须是“applicationEventMulticaster”。 源码如下图: ​ ![img](https://qqadapt.qpic.cn/txdocpic/0/553d2201e4df208c6d701c711df0d221/0?w=2092&h=1072) a.自定义的事件发布器: b.自定义事件类。 c.自定义事件监听器。 d.编写一个测试用例,检查发布事件时,是否使用了多线程异步处理。 运行单元测试结果如下: 8、自定义 ApplicationReadyEvent 的事件监听器。( 2020年10月新增 ) a.根据SpringApplication.run方法的源码分析,当spring boot执行完所有的启动流程后,会发布 **ApplicationReadyEvent** 事件。 ​ ![img](https://docimg2.docs.qq.com/image/mi_e8tTd2_Q06SYOha8alQ?w=1938&h=398) b.从run方法源码可知,发布ApplicationReadyEvent的时间是在回调 CommandLineRunner之后。 c.**尝试自定义一个ApplicationReadyEvent的事件监听器,并在终端输出指定信息,确定是在CommandLineRunner的输出信息之后。** 监听ApplicationReadyEvent事件 **深入思考**: 在上面的例子中,我们使用了Spring Boot框架提供的默认线程池。默认线程池在自动配置类TaskExecutionAutoConfiguration中定义。我们可以自定义一个自己的线程池,这样可以配置更多的属性。尝试一下自定义一个线程池,然后给自定义的事件发布器使用。 ​ ![img](https://qqadapt.qpic.cn/txdocpic/0/376de7a2852f3867e37a10c8d1b11abe/0?w=1388&h=290)