SpringBoot自定义Starter(@EnableXXX和META-INF的SPI自动添加)

目录

  • 1. 自定义Starter
    • 1.1 场景和效果
    • 1.2 starter实现
      • 1.2.1 创建自定义starter项目
      • 1.2.2 把所有maven依赖导入
      • 1.2.3 实现公共代码逻辑
      • 1.2.4 添加方式一:实现RobotAutoConfiguration配置类
      • 1.2.5 添加方式二:实现RobotAutoConfiguration配置类 + @EnableRobot功能开关
      • 1.2.6 添加方式三:实现RobotAutoConfiguration配置类 + META-INF的imports文件
      • 1.2.7 打包到本地仓库
    • 1.3 项目使用
      • 1.3.1 把starter的maven依赖导入
      • 1.3.2 application.properties添加配置参数
      • 1.3.3 注入方式一:使用@Import
      • 1.3.4 注入方式二:使用@EnableRobot
      • 1.3.5 注入方式二:自动注入
      • 1.3.6 功能测试

1. 自定义Starter

1.1 场景和效果

  • 场景:抽取聊天机器人场景,它可以打招呼
  • 效果:任何项目导入此starter都具有打招呼功能,并且可以在配置文件中修改问候语中的人名

1.2 starter实现

1.2.1 创建自定义starter项目

自定义starter项目

1.2.2 把所有maven依赖导入

    <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><optional>true</optional></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><skip>true</skip>    <!-- 这样没有main主程序类也可以打包 --><excludes><exclude><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></exclude></excludes></configuration></plugin></plugins></build>

1.2.3 实现公共代码逻辑

  1. 删除RobotSpringBootStarterApplication主程序类,删除src/test目录

  2. RobotProperties.java:绑定application.properties中robot开头的配置到属性name和age

package com.hh.robot.properties;import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;@ConfigurationProperties(prefix = "robot")
@Component
@Data
public class RobotProperties {private String name;private String age;
}
  1. RobotService.java:从robotProperties获取属性name和age
package com.hh.robot.service;import com.hh.robot.properties.RobotProperties;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service
public class RobotService {@AutowiredRobotProperties robotProperties;public String sayHello() {return "你好:" +"名字:【" + robotProperties.getName() + "】, " +"年龄:【" + robotProperties.getAge() + "】";}
}
  1. RobotController.java:接收请求,返回robot的问候语
package com.hh.robot.controller;import com.hh.robot.service.RobotService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class RobotController {@AutowiredRobotService robotService;@GetMapping("/robot")public String sayHello() {String hello = robotService.sayHello();return hello;}
}

1.2.4 添加方式一:实现RobotAutoConfiguration配置类

实现RobotAutoConfiguration配置类,给IOC容器导入Robot功能要用的所有组件。如下所示

package com.hh.robot.config;import com.hh.robot.controller.RobotController;
import com.hh.robot.properties.RobotProperties;
import com.hh.robot.service.RobotService;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;@Import({RobotController.class, RobotProperties.class, RobotService.class})
@Configuration
public class RobotAutoConfiguration {}

1.2.5 添加方式二:实现RobotAutoConfiguration配置类 + @EnableRobot功能开关

参照添加方式一实现RobotAutoConfiguration配置类。再实现@EnableRobot功能开关,添加RobotAutoConfiguration配置类。如下所示:

package com.hh.robot.annotation;import com.hh.robot.config.RobotAutoConfiguration;
import org.springframework.context.annotation.Import;import java.lang.annotation.*;@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
@Documented
@Import(RobotAutoConfiguration.class)
public @interface EnableRobot {}

1.2.6 添加方式三:实现RobotAutoConfiguration配置类 + META-INF的imports文件

参照添加方式一实现RobotAutoConfiguration配置类。再在src\main\resources\META-INF\spring\org.springframework.boot.autoconfigure.AutoConfiguration.imports文件中,添加RobotAutoConfiguration配置类的全类名。文件内容如下:

com.hh.robot.config.RobotAutoConfiguration

1.2.7 打包到本地仓库

使用maven命令mvn clean install进行打包到本地仓库

1.3 项目使用

1.3.1 把starter的maven依赖导入

        <dependency><groupId>com.hh</groupId><artifactId>robot-spring-boot-starter</artifactId><version>0.0.1-SNAPSHOT</version></dependency>

1.3.2 application.properties添加配置参数

application.properties添加配置参数如下:

robot.name=jim
robot.age=18

1.3.3 注入方式一:使用@Import

使用@Import注解,将RobotAutoConfiguration注入到IOC容器,就会自动将robot项目的所有组件注册到IOC容器。如下所示:

......省略部分......
@SpringBootApplication
@Import({RobotAutoConfiguration.class})
public class SpringBootTestApplication {
......省略部分......
}

1.3.4 注入方式二:使用@EnableRobot

使用@EnableRobot注解,自动将RobotAutoConfiguration注入到IOC容器,就会自动将robot项目的所有组件注册到IOC容器。如下所示:

......省略部分......
@SpringBootApplication
@EnableRobot
public class SpringBootTestApplication {
......省略部分......
}

1.3.5 注入方式二:自动注入

基本原理:springboot启动的时候,会自动从robot-spring-boot-starter-0.0.1-SNAPSHOT.jar的src\main\resources\META-INF\spring\org.springframework.boot.autoconfigure.AutoConfiguration.imports,找到RobotAutoConfiguration配置类,将RobotAutoConfiguration注入到IOC容器,就会自动将robot项目的所有组件注册到IOC容器

1.3.6 功能测试

访问http://localhost:8080/robot,页面效果如下:
功能测试

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/623598.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux下如何快速调试I2C设备

Linux下如何快速调试I2C设备 目录 1 什么场景下需要快速调试I2C设备 2 如何快速调试I2C设备 3 如何获取I2C Tools工具集 3.1 获取I2C Tools工具集源码 3.2 编译I2C Tools工具集源码 3.3 为设备添加I2C Tools工具集 4 如何使用I2C Tools工具集 5 小结 1 什么场景下需要快…

强化app广告变现用户隐私合规,移动广告变现合规技巧

移动广告技术的发展帮助开发者极大提升了广告变现效率&#xff0c;APP作为用户个人信息处理的重要载体&#xff0c;自从《个人信息保护法》颁布以来&#xff0c;个人信息的使用已经成为监管重点&#xff0c;开发者强化合规意识&#xff0c;让广告变现业务“细水长流”&#xff…

Ansible Filter滤波器的使用

一、【说在前面】 Ansible Filter一般被称为滤波器或者叫过滤器。 这个东西初次听到以为是什么科学计算的东西&#xff0c;但是想来ansible不太可能有什么滤波操作&#xff0c;所以这个东西本质是一个数值筛选器&#xff0c;内置函数&#xff0c;本质是一个为了做区别化的工具…

AcrelEMS-CB商业建筑能源管理系统解决方案-安科瑞 蒋静

1概述 AcrelEMS-CB商业建筑能源管理系统&#xff0c;集电力监控、电能质量监测与治理、电气安全预警、能耗分析、照明控制、新能源使用、能源收费以及设备运维等功能于一体&#xff0c;通过一套系统对商业建筑的能源进行统一监控、统一运维和调度&#xff0c;系统可以通过WEB和…

【极光系列】springBoot集成Hibernate

【极光系列】springboot集成hibernate gitee地址 直接下载可用 https://gitee.com/shawsongyue/aurora.git 模块&#xff1a;aurora_hibernate mysql安装教程 参考我另外一篇文章&#xff0c;直接下载安装 https://blog.csdn.net/weixin_40736233/article/details/1355829…

FPGA 原理图细节--画引脚

BGA引脚表示 1.1 FPGA此引脚要正确和清晰&#xff0c;会在“Package Pin”中用到次物理接口 1.2, MCU 只用管对应的GPIO逻辑接口就可以了 标识Bank电平 标识出对应Bank的电平&#xff0c;在电路设计中可以清晰的知道对应的脚位输出电平。在"IO std"也方便的选择 Ea…

常见的限流算法

本文已收录至我的个人网站&#xff1a;程序员波特&#xff0c;主要记录Java相关技术系列教程&#xff0c;共享电子书、Java学习路线、视频教程、简历模板和面试题等学习资源&#xff0c;让想要学习的你&#xff0c;不再迷茫。 天下武学出同源 正所谓天下武学殊途同归&#xff…

N5181A/安捷伦Agilent N5181A信号发生器

181/2461/8938产品概述&#xff1a; 规格&#xff08;说明书&#xff09;&#xff1a;表示已校准的仪器在工作温度范围0-55C内存放至少2小时&#xff0c;除非另有说明&#xff0c;并经过45分钟预热期后的保证性能。的指标包括测量不确定度。除非另有说明&#xff0c;本文档中的…

【Python数据可视化】matplotlib之绘制高级图形:散点图、热力图、等值线图、极坐标图

文章传送门 Python 数据可视化matplotlib之绘制常用图形&#xff1a;折线图、柱状图&#xff08;条形图&#xff09;、饼图和直方图matplotlib之设置坐标&#xff1a;添加坐标轴名字、设置坐标范围、设置主次刻度、坐标轴文字旋转并标出坐标值matplotlib之增加图形内容&#x…

全自动洗衣机什么牌子好?内衣洗衣机便宜好用的牌子推荐

随着内衣洗衣机的流行&#xff0c;很多小伙伴在纠结该不该入手一款内衣洗衣机&#xff0c;专门来洗一些贴身衣物&#xff0c;答案是非常有必要的&#xff0c;因为我们现在市面上的大型洗衣机只能做清洁&#xff0c;无法对我们的贴身衣物进行一个高度除菌&#xff0c;而小小的内…

基于python的深度神经网络原理与实践

理论基础 什么是神经网络 我们知道深度学习是机器学习的一个分支&#xff0c;是一种以人工神经网络为架构&#xff0c;对数据进行表征学习的算法。而深度神经网络又是深度学习的一个分支&#xff0c;它在 wikipedia 上的解释如下&#xff1a; 深度神经网络&#xff08;Deep N…

Vue中keep-alive缓存的详解(深度理解)

文章目录 一、Keep-alive 是什么二、使用场景三、原理分析四、思考题&#xff1a;缓存后如何获取数据beforeRouteEnteractived 参考文献 一、Keep-alive 是什么 keep-alive是vue中的内置组件&#xff0c;能在组件切换过程中将状态保留在内存中&#xff0c;防止重复渲染DOM ke…

四搭建dockerhub私有仓库

搭建dockerhub私有仓库 很多场景下&#xff0c;我们需使用私有仓库管理Docker镜像。相比Docker Hub&#xff0c;私有仓库有以下优势&#xff1a; 节省带宽&#xff0c;对于私有仓库中已有的镜像&#xff0c;无需从Docker Hub下载&#xff0c;只需从私有仓库中下载即可&#x…

MySQL篇—通过Clone插件进行远程克隆数据(第三篇,总共三篇)

在介绍 Clone 最终篇之前&#xff0c;我们先简要回顾一下前面所讲的内容。在第一篇中&#xff0c;我们探讨了 Clone 的用途、使用的前提条件、存在的限制&#xff0c;以及它的备份原理。Clone 是一种用于复制和备份数据的工具&#xff0c;它能够快速高效地创建数据的精确副本。…

Spark原理——逻辑执行图

逻辑执行图 明确逻辑计划的边界 在 Action 调用之前&#xff0c;会生成一系列的RDD,这些RDD之间的关系&#xff0c;其实就是整个逻辑计划 val conf new SparkConf().setMaster("local[6]").setAppName("wordCount_source") val sc new SparkContext(conf)v…

JVM篇--Java内存区域高频面试题

java内存区域 1 Java 堆空间及 GC&#xff1f; 首先我们要知道java堆空间的产生过程&#xff1a; 即当通过java命令启动java进程的时候&#xff0c;就会为它分配内存&#xff0c;而分配内存的一部分就会用于创建堆空间&#xff0c;而当程序中创建对象的时候 就会从堆空间来分…

2024--Django平台开发-Redis集群(十一)

内容回顾 主从复制。 哨兵&#xff1a;实例启动了&#xff0c;哨兵节点没启动&#xff0c;Python通过redis-py连接报错。一定要确保实例节点和哨兵节点都启动了。 搭建集群用的是虚拟机的多台centos服务器&#xff0c;你在跟着学习的时候&#xff0c;一定要全部都是虚拟机&am…

5.矩阵分析

矩阵分析 文章目录 矩阵分析一、方阵范数1.1 矩阵范数1.2 与矩阵乘积相容的矩阵范数【定义】自相容范数 / 方阵范数 1.3 与向量范数相容的矩阵范数【定义】矩阵范数与向量范数相容【定理】任意自相容范数必存在与它相容的向量范数 二、算子范数2.1 方阵的算子范数【定理】由向量…

PVE虚拟机安装qemu guest agent

pve虚拟机安装guest agent&#xff0c;使web平台可以直接显示虚拟机的ip&#xff0c;方便管理。 一、虚拟机需开启Qemu代理 首先&#xff0c;虚拟机需开启Qemu代理&#xff0c;需要关闭虚拟机再启动虚拟机并安装agent。网上有些文章说要把网卡配置为virtio&#xff0c;经测试是…

可协作植物管理工具HortusFox

什么是 HortusFox &#xff1f; HortusFox 是一个自托管的协作植物管理系统&#xff0c;您可以在自己的环境中使用它来管理所有的植物。您可以添加植物&#xff0c;并附带各种详细信息和照片&#xff0c;并将它们分配到环境中的位置。系统提供了一个仪表板&#xff0c;显示所有…