# 实验二:利用SB的自动装配特性实现动态注册组件 **Repository Path**: li-huahua/spring-boot-test-two ## Basic Information - **Project Name**: 实验二:利用SB的自动装配特性实现动态注册组件 - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-10-25 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 东莞理工学院网络空间安全学院 | **课程名称:** | 企业级开发框架专题 | **学期**:2020秋季 | | :----------------- | :-------------------------------------------: | :------------------: | | **实验名称**: | 利用Spring boot的自动装配特性实现动态注册组件 | **实验序号**:二 | | **姓名**:李华铧 | **学号**:201841413114 | **班级**:18网工1班 | | **实验地址**:线上 | **实验日期**:2020-10-19 | **指导老师**:黎志雄 | | **教师评语**:XXX | **实验成绩**:XXX | **同组同学**:无 | ## 实验二 利用Spring boot的自动装配特性实现动态注册组件 ### 实验目的 >1. 掌握Spring Boot的自动配置原理; >2. 掌握Spring框架动态注册Bean的原理; >3. 掌握自动生成元数据文件。 >4. 掌握spring框架的事件模型。 ### 实验环境 >1. JDK 1.8或更高版本 >2. Maven 3.6+ >3. IntelliJ IDEA ### 实验任务 #### 任务一 >通过IntelliJ IDEA的Spring Initializr向导创建Spring Boot项目 通过Spring Initializr创建项目,选择添加 **Spring Configuration Processor** 依赖, 创建项目: ![输入图片说明](https://images.gitee.com/uploads/images/2020/1025/112455_6cfdf4b2_8060135.png "屏幕截图.png") #### 任务二 > 创建一个自定义的CommandLineRunner接口的实现类 创建类CustomCommandLineRunner,实现 CommandLineRunner 接口 ![输入图片说明](https://images.gitee.com/uploads/images/2020/1025/112526_0c8ee21b_8060135.png "屏幕截图.png") #### 任务三 > 创建一个自定义的自动配置类 创建自动配置类==DutaoAutoConfig== ,并以@Bean注解将 CustomCommandLineRunner 注入容器 ![输入图片说明](https://images.gitee.com/uploads/images/2020/1025/112553_295bdbbb_8060135.png "屏幕截图.png") #### 任务四 > 创建spring.factories文件 在==resoures/META-INF==目录下创建文件==spring.factories== ,以 key-value 形式加入==AutoConfig==类的全限定类名 如图, ![输入图片说明](https://images.gitee.com/uploads/images/2020/1025/112610_1929e582_8060135.png "屏幕截图.png") 启动程序,控制台显示, ![输入图片说明](https://images.gitee.com/uploads/images/2020/1025/112615_56428e1f_8060135.png "屏幕截图.png") #### 任务五 > 给自动配置类添加有效条件 利用==@ConditionalOnProperty==为创建该 Bean 加入条件 ![输入图片说明](https://images.gitee.com/uploads/images/2020/1025/112639_3b3ad4fe_8060135.png "屏幕截图.png") 设置的期望的属性值为 true ,先启动程序, ![输入图片说明](https://images.gitee.com/uploads/images/2020/1025/112648_fd755fee_8060135.png "屏幕截图.png") ![输入图片说明](https://images.gitee.com/uploads/images/2020/1025/112715_9873f414_8060135.png "屏幕截图.png") 设置属性值味false ![输入图片说明](https://images.gitee.com/uploads/images/2020/1025/112742_8da6ff9b_8060135.png "屏幕截图.png") #### 任务六 > 自定义的一个Bean,绑定属性值,并生成spring配置类的元数据文件 1)创建一个类,并在类上加@ConfigurationProperties注解,设置注解的prefix属性指定绑定的属性的前缀 ![输入图片说明](https://images.gitee.com/uploads/images/2020/1025/112920_d38e7090_8060135.png "屏幕截图.png") 2)在配置类上添加@EnableConfigurationProperties,并指定装配的属性Bean。 ![输入图片说明](https://images.gitee.com/uploads/images/2020/1025/112948_06152680_8060135.png "屏幕截图.png") 3)使用spring boot框架提供的注解处理器生成自定义属性的元数据文件。 a.在pom.xml文件中引入spring-boot-configuration-processor依赖 ![输入图片说明](https://images.gitee.com/uploads/images/2020/1025/113043_6c643798_8060135.png "屏幕截图.png") b. 编译打包项目。观察target目录下的元数据文件: ![输入图片说明](https://images.gitee.com/uploads/images/2020/1025/113115_e49b869e_8060135.png "屏幕截图.png") c.IDE 通过该元数据文件获得编码提示 ![输入图片说明](https://images.gitee.com/uploads/images/2020/1025/113213_5611361b_8060135.png "屏幕截图.png") #### 任务七 > 根据阅读框架源码,我们可以自定义一个事件发布器,并设置线程池,实现异步发布事件 自定义一个事件发布器,注入容器 ![输入图片说明](https://images.gitee.com/uploads/images/2020/1025/113227_4a09353b_8060135.png "屏幕截图.png") 创建一个事件类,继承==ApplicationEvent==类 ![输入图片说明](https://images.gitee.com/uploads/images/2020/1025/113233_5b65dd11_8060135.png "屏幕截图.png") 创建事件监听器 ![输入图片说明](https://images.gitee.com/uploads/images/2020/1025/113239_63bfebc6_8060135.png "屏幕截图.png") 编写测试单元, ![输入图片说明](https://images.gitee.com/uploads/images/2020/1025/113245_39a1b453_8060135.png "屏幕截图.png") 运行后,可见控制台输出 ![输入图片说明](https://images.gitee.com/uploads/images/2020/1025/113304_ac06958d_8060135.png "屏幕截图.png") #### 任务八 > 自定义 ApplicationReadyEvent 的事件监听器 定义一个==ApplicationReadyEvent==的事件监听器 ![输入图片说明](https://images.gitee.com/uploads/images/2020/1025/113313_7984c16a_8060135.png "屏幕截图.png") 运行程序后,可见控制台 ![输入图片说明](https://images.gitee.com/uploads/images/2020/1025/113318_c863b997_8060135.png "屏幕截图.png") ### 实验总结 > 总体上并无大问题,遇到问题根据调试信息去百度搜索解决方法。