# SpringBootClass2 **Repository Path**: li_tiger_admin/SpringBootClass2 ## Basic Information - **Project Name**: SpringBootClass2 - **Description**: springboot第二次作业 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-04-12 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 实验二 利用SpringBoot的自动装配特性实现动态注册组件 ### 一、实验目的 1、掌握SpringBoot的自动配置原理。 2、掌握Spring框架动态注册Bean的原理。 3、掌握自动生成元数据文件。 4、掌握Spring框架的事件模型。 ### 二、实验环境 1、JDK1.8或更高版本。 2、Maven3.6+。 3、IntelliJ IDEA ### 三、实验任务 1、通过IntelliJ IDEA的Spring Initializr向导创建SpringBoot项目。 ![输入图片说明](https://images.gitee.com/uploads/images/2020/0412/164350_3efdad0e_4853686.png "屏幕截图.png") ![输入图片说明](https://images.gitee.com/uploads/images/2020/0412/164652_76880682_4853686.png "屏幕截图.png") 注意:创建项目时添加Spring Configuration Processor依赖。 2、创建一个自定义的CommandLineRunner接口的实现类。 ![输入图片说明](https://images.gitee.com/uploads/images/2020/0412/171045_16604cdd_4853686.png "屏幕截图.png") 注意:不要在自定义类上面添加@Component注解 3、创建一个自定义的自动配置类。 ![输入图片说明](https://images.gitee.com/uploads/images/2020/0412/171550_f68b66b7_4853686.png "屏幕截图.png") 4、创建spring.factories文件 ![输入图片说明](https://images.gitee.com/uploads/images/2020/0412/172111_843c6e0b_4853686.png "屏幕截图.png") 注意:spring.factories必须放在META-INF目录下。 ![输入图片说明](https://images.gitee.com/uploads/images/2020/0412/173149_38f38843_4853686.png "屏幕截图.png") 说明:key必须是EnableAutoConfiguration的权限定类名,值为自定义的自动配置类的权限定路径的类名。 测试运行程序成功: ![输入图片说明](https://images.gitee.com/uploads/images/2020/0412/174246_8733c428_4853686.png "屏幕截图.png") 5、给自动配置类添加有效条件。 步骤如下: 1)利用@ConditionalOnProperty注解,添加属性条件。 ![输入图片说明](https://images.gitee.com/uploads/images/2020/0412/174834_c082249e_4853686.png "屏幕截图.png") 2)在application.properties属性文件中添加一个自定义的属性。 ![输入图片说明](https://images.gitee.com/uploads/images/2020/0412/175018_05af1e87_4853686.png "屏幕截图.png") 3)切换属性值false/true,观察终端显示。false时不生效。 6、自定义的一个Bean,绑定属性值,并生成spring配置类的元数据文件。 步骤如下: 1)创建一个类,并在类上加@ConfigurationProperties注解,设置注解的prefix属性指定绑定的属性的前缀。 ![输入图片说明](https://images.gitee.com/uploads/images/2020/0412/180113_a2e65152_4853686.png "屏幕截图.png") 2)在某个配置类上添加@EnableConfigurationProperties,并指定装配的属性Bean。 ![输入图片说明](https://images.gitee.com/uploads/images/2020/0412/180528_ee28cf10_4853686.png "屏幕截图.png") 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依赖: ![输入图片说明](https://images.gitee.com/uploads/images/2020/0412/181723_be322fdc_4853686.png "屏幕截图.png") b、编译打包项目。观察target目录下的元数据文件: ![输入图片说明](https://images.gitee.com/uploads/images/2020/0412/182241_28a4b2c0_4853686.png "屏幕截图.png") c、我们再回去编辑属性文件时,只要输入属性的部分关键字,idea会自动提示。 7、根据阅读框架源码,我们可以自定义一个事件发布器,并设置线程池,实现异步发布事件。但注意:这个自定义的事件发布器的Bean的名称必须是“applicationEventMulticaster”。 自定义的事件发布器: ![输入图片说明](https://images.gitee.com/uploads/images/2020/0412/195915_df7755dc_4853686.png "屏幕截图.png") 8、自定义事件类: ![输入图片说明](https://images.gitee.com/uploads/images/2020/0412/195947_a585fb74_4853686.png "屏幕截图.png") 9、自定义事件监听器: ![输入图片说明](https://images.gitee.com/uploads/images/2020/0412/200048_29ccb82f_4853686.png "屏幕截图.png") 10、编写一个测试用例,检查发布事件时,是否使用了多线程异步处理。 ![输入图片说明](https://images.gitee.com/uploads/images/2020/0412/200643_0b175f73_4853686.png "屏幕截图.png") 单元测试运行结果: ![输入图片说明](https://images.gitee.com/uploads/images/2020/0412/200810_1f46fa68_4853686.png "屏幕截图.png")