# 利用Spring boot的自动装配特性实现动态注册组件 **Repository Path**: xie-hong/experiment-2 ## Basic Information - **Project Name**: 利用Spring boot的自动装配特性实现动态注册组件 - **Description**: 实验二:利用Spring boot的自动装配特性实现动态注册组件 - **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**: 2021-10-27 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 东莞理工学院网络空间安全学院 | **课程名称:** | 企业级开发框架专题 | **学期**:2020秋季 | | :----------------- | :-------------------------------------------: | :------------------: | | **实验名称**:实验二 | 利用Spring boot的自动装配特性实现动态注册组件 | **实验序号**:二 | | **姓名**:谢泓泓 | **学号**:201841413134 | **班级**:18网工1班 | | **实验地址**:线上 | **实验日期**:2020-10-19 | **指导老师**:黎志雄 | | **教师评语**: | **实验成绩**: | **同组同学**:无 | # 实验二:利用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 Boot项目,并添加 **Spring Configuration Processor** 依赖。 ![输入图片说明](https://images.gitee.com/uploads/images/2020/1025/222956_9db24a52_8031809.png "屏幕截图.png") #### 任务二 > 创建一个自定义的CommandLineRunner接口的实现类。 ![输入图片说明](https://images.gitee.com/uploads/images/2020/1025/223557_beadc854_8031809.png "屏幕截图.png") #### 任务三 > 创建一个自定义的自动配置类。 创建一个自动配置类hxieAutoConfig,并以@Bean注解将 CustomCommandLineRunner 注入容器 ![输入图片说明](https://images.gitee.com/uploads/images/2020/1025/223355_53a7040c_8031809.png "屏幕截图.png") #### 任务四 > 创建spring.factories文件。 在目录resources下创建子目录META-INF,在该目录创建spring.factories文件,并以key-value的形式导入AutoConfig的全限定类名 ![输入图片说明](https://images.gitee.com/uploads/images/2020/1025/224059_9ddd8b05_8031809.png "屏幕截图.png") 运行测试(由运行结果可知,自定义的自动配置类已经生效): ![输入图片说明](https://images.gitee.com/uploads/images/2020/1025/224321_b57f40a9_8031809.png "屏幕截图.png") #### 任务五 > 给自动配置类添加有效条件。 1)利用 @ConditionalOnProperty 注解,添加属性条件。 ![输入图片说明](https://images.gitee.com/uploads/images/2020/1025/230619_57c6b216_8031809.png "屏幕截图.png") 2)在application.properties属性文件中添加一个自定义的属性。 ![输入图片说明](https://images.gitee.com/uploads/images/2020/1025/230730_14be77ba_8031809.png "屏幕截图.png") 3)切换属性值false/true,观察终端的显示,判断自动装配的配置类是否生效。 当属性值为false时,自动装配的配置类不生效 ![输入图片说明](https://images.gitee.com/uploads/images/2020/1025/230940_b3df897d_8031809.png "屏幕截图.png") 当属性值为true时,自动装配的配置类生效,注入成功 z ![输入图片说明](https://images.gitee.com/uploads/images/2020/1025/231141_31984d3c_8031809.png "屏幕截图.png") #### 任务六 > 自定义的一个Bean,绑定属性值,并生成spring配置类的元数据文件。 1)创建一个类,并在类上加@ConfigurationProperties注解,设置注解的prefix属性指定绑定的属性的前缀。 ![输入图片说明](https://images.gitee.com/uploads/images/2020/1025/231326_8222cf45_8031809.png "屏幕截图.png") 2)在某个配置类上添加@EnableConfigurationProperties,并指定装配的属性Bean。 ![输入图片说明](https://images.gitee.com/uploads/images/2020/1025/231459_b2f21061_8031809.png "屏幕截图.png") 3)使用spring boot框架提供的注解处理器生成自定义属性的元数据文件。 编译打包项目。观察target目录下的元数据文件: ![输入图片说明](https://images.gitee.com/uploads/images/2020/1025/231715_26e1b9af_8031809.png "屏幕截图.png") 可看到自动生成的描述,内容就是类中属性的注释 4)当再回去编辑属性文件时,只要输入属性的部分关键字,idea会自动提示: ![输入图片说明](https://images.gitee.com/uploads/images/2020/1025/231811_c4dbde9e_8031809.png "屏幕截图.png") #### 任务七 > 根据阅读框架源码,我们可以自定义一个事件发布器,并设置线程池,实现异步发布事件。 1)自定义一个事件发布器: ![输入图片说明](https://images.gitee.com/uploads/images/2020/1025/234053_746d73e1_8031809.png "屏幕截图.png") 2)自定义一个事件类,继承ApplicationEvent类 ![输入图片说明](https://images.gitee.com/uploads/images/2020/1025/234154_77dde69f_8031809.png "屏幕截图.png") 3)创建事件监听器 ![输入图片说明](https://images.gitee.com/uploads/images/2020/1025/234228_980c7b5d_8031809.png "屏幕截图.png") 4)编写测试单元,检查发布事件时,是否使用了多线程异步处理 ![输入图片说明](https://images.gitee.com/uploads/images/2020/1025/234317_24741b40_8031809.png "屏幕截图.png") 5)运行单元测试结果如下: ![输入图片说明](https://images.gitee.com/uploads/images/2020/1025/234406_b8571aaa_8031809.png "屏幕截图.png") #### 任务八 > 自定义 ApplicationReadyEvent 的事件监听器。 ![输入图片说明](https://images.gitee.com/uploads/images/2020/1025/234634_07ca38fb_8031809.png "屏幕截图.png") 运行程序后,可在终端观察到ApplicationReadyEvent 的事件监听器的输出是在CommandLineRunner的输出信息之后: ![输入图片说明](https://images.gitee.com/uploads/images/2020/1025/234707_5ed46302_8031809.png "屏幕截图.png") ### 四、实验总结 通过完成本次实验,在过程中大致没有遇到什么麻烦,但感觉更深层的东西还是不太熟悉,还是得在私下花时间去理解。