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,一经查实,立即删除!

相关文章

大数据日志数据量过大如何处理

如果是web端的埋点数据&#xff0c;我们可以对这些数据进行分流。 我们可以采用事件分流&#xff0c;步骤如下 定义事件类型&#xff1a; 根据埋点数据的内容&#xff0c;定义不同的事件类型。例如&#xff0c;可以有页面访问事件、按钮点击事件、表单提交事件等。 提取关键信…

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和…

QT基础篇(6)QT5图形与图片

1.QT5位置相关函数 在Qt5中&#xff0c;有一些与位置相关的函数可以帮助您处理窗口和控件的位置。下面是一些常用的位置相关函数&#xff1a; move(x, y): 将窗口或控件移动到屏幕上的指定位置&#xff0c;其中x和y表示要移动到的坐标。 resize(width, height): 调整窗口或控…

go切片参数传递用值还是指针

Go 中常用的切片 slice 数据结构是动态数组&#xff0c;切片长度并不固定&#xff0c;在容量不足的时候会自动扩容。 切片实质上是对一个底层数组的抽象视图&#xff0c;由 Go 运行时维护。在运行时&#xff0c;切片由如下的 SliceHeader 结构体表示&#xff0c;其中 Data 字段…

机器人说明书---名词解释030课_python语言_方法重写

这里写自定义目录标题 方法重写类属性与方法类的私有属性类的方法类的私有方法实例类的私有方法实例如下&#xff1a; 类的专有方法&#xff1a;视频讲解 方法重写 如果你的父类方法的功能不能满足你的需求&#xff0c;你可以在子类重写你父类的方法&#xff0c;实例如下&…

【极光系列】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…

数据库负载均衡部署(使用ipvadm ,docker)

文章目录 … 要在Docker中使用IPVS配置MariaDB数据库的高可用集群&#xff0c;并设置VIP地址为192.168.201.4&#xff0c;密码全部设为123456你可以按照以下步骤进行操作&#xff1a; 第一步 创建一个docker网络 docker network create --subnet192.168.200.0/24 mariadb_netw…

FPGA 原理图细节--画引脚

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

芯片设计重要工具—— IBM LSF 分布式高性能计算调度平台

IBM Spectrum LSF Suites 是面向分布式高性能计算 (HPC) 的工作负载管理平台和作业调度程序。基于 Terraform 的自动化现已可用&#xff0c;该功能可在 IBM Cloud 上为基于 IBM Spectrum LSF 的集群供应和配置资源。 借助我们针对任务关键型 HPC 环境的集成解决方案&#xff0…

常见的限流算法

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

fgetc函数和fputc函数

目录 getchar和putchargetc和putcfgetc和fputc 橙色 getchar和putchar int getchar(void); // 从标准输入 stdin 获取一个字符&#xff08;一个无符号字符&#xff09;。这等同于 getc 带有 stdin 作为参数int putchar(int char); // 把参数 char 指定的字符&#xff08;一个…

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…

Redis面试系列-03

1. 为什么 Redis 集群的最大槽数是 16384 个&#xff1f; 在redis节点发送心跳包时需要把所有的槽放到这个心跳包中&#xff0c;以便让节点知道当前集群信息&#xff0c;即1638416k&#xff0c;在发送心跳包时使用char进行bitmap压缩后是2k&#xff08;2*8 (8bit)*1024(1k)16K…