# springBoot_Experiment_2
**Repository Path**: Agneszyp/springBoot_Experiment_2
## Basic Information
- **Project Name**: springBoot_Experiment_2
- **Description**: No description available
- **Primary Language**: Java
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2020-04-10
- **Last Updated**: 2020-12-19
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 实验二 利用Spring boot的自动装配特性实现动态注册组件
## 一、 实验目的
1. 掌握Spring Boot的自动配置原理;
2. 掌握Spring框架动态注册Bean的原理;
3. 掌握自动生成元数据文件。
4. 掌握spring框架的事件模型。
## 二、 实验环境
1. JDK 11
2. Maven 3.6.0
3. IntelliJ IDEA
## 三、 实验任务
1. 通过IntelliJ IDEA的Spring Initializr向导创建Spring Boot项目,并添加 `Spring Configuration Processor` 依赖。
2. 创建一个自定义的CommandLineRunner接口的实现类,不加@Component注解。
3. 再创建一个自定义的自动配置类,同样也不加@Configuration注解
再创建spring.factories,放在META-INF目录下,写入以下代码,指明MyAutoConfig是一个配置类
```
org.springframework.boot.autoconfigure.EnableAutoConfiguration=
com.example.experiment_2.config.MyAutoConfig
```
4. 运行程序,从下图可知我们模拟的自动配置已经生效了
5. 在自动配置类中加入`@ConditionalOnProperty`注解,添加属性条件
这句代码的意思:判断配置文件中是否存在某个配置`example.auto.enable`,如果存在,判断是成立的,即把`MyCommandLineRunner`注入到容器中
6. 在`application.properties`属性文件中添加一个自定义的属性
```
example.auto.enable=true
```
运行程序可以发现配置类已经生效
如果把true改为false,即
```
example.auto.enable=false
```
运行程序可以发现配置类未生效
7. 创建一个类,并在类上加`@ConfigurationProperties`注解,设置注解的`prefix`属性指定绑定的属性的前缀。
@ConfigurationProperties:告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定;
prefix = "example.auto":与配置文件中属性进行一一映射
只有这个组件是容器中的组件,才能容器提供的`@ConfigurationProperties`功能,所以要启动该类的`ConfigurationProperties`功能
8. 在配置类上添加@EnableConfigurationProperties,并指定装配的属性Bean。
@EnableConfigurationProperties:启动指定类的`ConfigurationProperties`功能;将配置文件中对应的值和指定类绑定起来;并把指定类加入到ioc容器中,这里的指定类是MyProperties类
9. 使用spring boot框架提供的注解处理器生成自定义属性的元数据文件
1)确保pom.xml文件中引入spring-boot-configuration-processor依赖
2)编译打包项目。target目录下出现元数据文件`spring-configuration-metadata.json`
3) 生成元数据文件后我们在`application.properties`编辑属性文件时,只要输入属性的部分关键字,idea会自动提示
10. 自定义一个事件发布器,并设置线程池,实现异步发布事件
1)自定义事件发布器,这个自定义的事件发布器的Bean的名称必须是`applicationEventMulticaster`
2)自定义事件类,继承父类`ApplicationEvent`编写事件类
3)自定义事件监听器,实现接口`ApplicationListener`编写事件监听器
4)测试使用线程池异步发布事件
运行程序可发现发布事件时,使用了多线程异步处理
11. 自定义一个线程池
1)先定义一个线程池,并添加属性
2)创建线程任务
3)单元测试一下,记得添加两个注解
运行程序