如何自己实现一个Spring Boot Starter

现在很多开源的组件都会提供对应的 springboot-starter 包给我们去用,要做一个 starter 包并不难。参照Spring内置的实现就好了:
1、在工程里引入 starter 打包相关的依赖。
2、在我们工程内建 spring.factories 文件,编写我们配置类的全限类名。

一、自定义步骤详解

使用AOP实现拦截方法执行和打印日志的功能

1.1、创建Starter项目

名称 zhinian-log-spring-boot-starter , 版本号是 1.0-SNAPSHOT 。且同时引入下方依赖。

1.2、引入pom依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.zn.opit.base</groupId>
    <artifactId>zhinian-log-spring-boot-starter</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <version>2.7.13</version>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
            <version>2.7.13</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <classifier>exec</classifier>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

1.3、定义Starter需要的配置类(Properties)

package com.zn.opit.base.config;

import org.springframework.boot.context.properties.ConfigurationProperties;

@ConfigurationProperties(prefix = "zn.log")
public class ZhiNianLogProperties {

    private boolean enabled;

    public boolean isEnabled() {
        return enabled;
    }

    public void setEnabled(boolean enabled) {
        this.enabled = enabled;
    }
}

如果我们需要从 application.yaml 或 application.properties 中拿到一些使用者配置的数据,那么我们就需要定义一个properties类。这个properties类主要作用是将 application.yaml 或 application.properties 中的配置信息映射成实体类,比如我们这里指定 prefix = “zn.log” 这样,我们就能将以zn.log为前缀的配置项拿到了。

1.4、编写Starter项目的业务功能

AOP切面逻辑

package com.zn.opit.base.component;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class WebLogAspect {
    @Pointcut("execution(* *..*Controller.*(..))")
    public void webLog(){}

    @Before("webLog()")
    public void doBefore(JoinPoint joinPoint) throws Throwable {
        //方法开始前,打印开始日志
        System.out.println("zn-starter --------doBefore");

    }

    @AfterReturning(returning = "ret", pointcut = "webLog()")
    public void doAfterReturning(Object ret) throws Throwable {
        // 处理完请求,打印结束日志
        System.out.println("zn-starter --------doAfterReturning");
    }
}

1.5、编写自动配置类

package com.zn.opit.base.config;

import com.zn.opit.base.component.WebLogAspect;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration // 表示该类是一个配置类
@EnableConfigurationProperties({ZhiNianLogProperties.class}) // 该注解的作用是为 xxxProperties 开启属性配置功能,并将这个类以组件的形式注入到容器中
@ConditionalOnProperty(prefix = "zn.log", value = "enabled") // 当指定的配置项等于你想要的时候,配置类生效
public class ZnLogAutoConfig {

    @Bean // @Bean:该注解用于将方法的返回值以 Bean 对象的形式添加到容器中
    @ConditionalOnMissingBean // @ConditionalOnMissingBean(xxx.class):该注解表示当容器中没有 xxx 类时,该方法才生效
    public WebLogAspect webLogAspect() {
        return new WebLogAspect();
    }
}

1.6、编写spring.factories文件加载自动配置类

org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.zn.opit.base.config.ZnLogAutoConfig

1.7、构建starter制品包

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <classifier>exec</classifier>
            </configuration>
        </plugin>
    </plugins>
</build>

在项目根目录下执行mvn clean install,打包并放到maven仓库中(maven仓库地址和配置有关)

显示build success,表示starter制品包打包完成

二、其它项目引用验证

2.1、pom中引入自定义starter依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.zn.opit.base</groupId>
    <artifactId>zhinian-log-starter-test</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>2.7.13</version>
        </dependency>

        <dependency>
            <groupId>com.zn.opit.base</groupId>
            <artifactId>zhinian-log-spring-boot-starter</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    </dependencies>
</project>

2.2、写一个Controller接口

(要符合starter里的aop拦截表达式规则,否则拦截不到)

package com.zn.opit.base.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RequestMapping("/hello")
@RestController
public class HelloController {

    @GetMapping("/test")
    public String test() {
        return "SUCCESS";
    }
}

2.3、配置文件 application.properties

zn.log.enabled=true
server.port=8077

2.4、验证

启动业务项目,访问接口,验证
在这里插入图片描述
在这里插入图片描述

至此,一个简单的starter示例就写完了。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JavaScript 学习笔记(WEB APIs Day2)

「写在前面」 本文为 b 站黑马程序员 pink 老师 JavaScript 教程的学习笔记。本着自己学习、分享他人的态度&#xff0c;分享学习笔记&#xff0c;希望能对大家有所帮助。推荐先按顺序阅读往期内容&#xff1a; 1. JavaScript 学习笔记&#xff08;Day1&#xff09; 2. JavaSc…

C# 使用System.Threading.Timer 实现计时器

写在前面 以往一般都是用 System.Timers.Timer 来做计时器&#xff0c;而 System.Threading.Timer 也可以实现计时器功能&#xff0c;并且还可以配置首次执行间隔&#xff0c;在功能上比System.Timers.Timer更加丰富&#xff1b;根据这个特性就可以实现按指定时间间隔对委托进…

Postman如何做接口测试:如何导入 swagger 接口文档

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

samba服务搭建,并将共享目录映射到windows

系统版本&#xff1a;centos7 1、centos 安装samba yum -y install samba 2、查看安装信息 rpm -qa |grep samba 3、设置开机自启动 systemctl enable smb.service systemctl enable nmb.service 4、设置samba服务器配置文件 sudo vi /etc/samba/smb.conf 注意&#…

【blender渲染】blender流体模拟基础

各位新年好哇&#xff0c;最近在做demo的时候&#xff0c;为了更好的效果&#xff0c;开始摸索一点离线渲染的东西。像这种后续渲染的处理&#xff0c;由于3ds max是更偏向于建模的dcc&#xff0c;有点不那么好使&#xff08;没有说看不起vray的意思哈&#xff09;。 像在实时…

计算机组成原理 01:计算机的发展历程

计算机的发展历程 导言什么是计算机系统计算机系统 硬件软件因此&#xff0c;计算机性能的好坏取决于“软”、“硬” 件功能的总和。 硬件的发展计算机发展阶段第一代&#xff1a;电子管时代第二代&#xff1a;晶体管时代第三代&#xff1a;中小规模集成电路时代第四代&#x…

算法第二十二天-最大数

最大数 题目要求 解题思路 今天的题目&#xff0c;让我们将一组数字重新组合&#xff0c;构成一个最大的整数。由于构成的整数非常大&#xff0c;所以返回结果需要字符串格式。 分析一下规律&#xff1a; 为了避免用int型或者long型越界&#xff0c;所以我们需要把数字先转换…

独立服务器有哪些优势

建立和维护一个强大的线上网站存在对于个人、企业和组织来说至关重要。而作为构建一个稳定、高效网站的基石之一&#xff0c;服务器的选择变得越来越重要。在服务器的选择中&#xff0c;独立服务器已经成为了许多人首选的方案。 独立服务器究竟有哪些优势呢&#xff1f; 1、稳…

拦截器与过滤器

拦截器&#xff08;Interceptor&#xff09;是一种特殊的组件&#xff0c;它可以在请求处理的过程中对请求和响应进行拦截和处理。拦截器可以在请求到达目标处理器之前、处理器处理请求之后以及视图渲染之前执行特定的操作。拦截器的主要目的是在不修改原有代码的情况下&#x…

常用芯片学习——HC245芯片

HC245三态输出八路总线收发器 使用说明 这些八路总线收发器专为数据总线之间的异步双向通信而设计。控制功能实现可更大限度地减少外部时序要求。根据方向控制 (DIR) 输入上的逻辑电平&#xff0c;此类器件将数据从 A 总线发送至 B 总线&#xff0c;或者将数据从 B 总线发送至…

macOS Sonoma 14.3RC(23D56)发布

系统介绍 黑果魏叔1 月18日消息&#xff0c;苹果今日向 Mac 电脑用户推送了 macOS 14.3 RC 更新&#xff08;内部版本号&#xff1a;23D56&#xff09;&#xff0c;本次更新距离上次发布隔了 41 天。 如何升级 iOS / iPadOS / watchOS / macOS 开发版和公测版&#xff1f; 升…

【数学建模】图论模型

文章目录 图的基础理论及networkx简介图的基本概念图的表示及Networkx简介图的表示NetworkX简介 最短路算法及其Python实现固定起点到其余各点的最短路算法每对顶点间的最短路算法最短路应用 最小生成树算法及其networkx实现基本概念最小生成树算法最小生成树应用 匹配问题最大…

五、垃圾回收

1. 垃圾回收基础 1.1 什么是垃圾 简单说就是&#xff1a;内存中已经不再被使用到的内存空间就是垃圾。 1.2 如何判定是垃圾 1.2.1 引用计数法 引用计数法&#xff1a;给对象添加一个引用计数器&#xff0c;有访问就 1&#xff0c;引用失效就 -1 引用计数法的优缺点&#…

GIS项目实战10:MySQL数据库的安装与配置教程

MySQL是一个关系型数据库管理系统&#xff0c;由瑞典 MySQL AB 公司开发&#xff0c;属于 Oracle 旗下产品。MySQL是最流行的关系型数据库管理系统之一&#xff0c;在 WEB 应用方面&#xff0c;MySQL是最好的RDBMS (Relational Database Management System&#xff0c;关系数据…

2024年【黑龙江省安全员C证】免费试题及黑龙江省安全员C证作业考试题库

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年【黑龙江省安全员C证】免费试题及黑龙江省安全员C证作业考试题库&#xff0c;包含黑龙江省安全员C证免费试题答案和解析及黑龙江省安全员C证作业考试题库练习。安全生产模拟考试一点通结合国家黑龙江省安全员C证…

根据音乐合成舞蹈;提升预训练扩散模型分辨率;基于扩散模型的视频超分;LLM推理加速框架;3D控制运动人像合成

本文首发于公众号&#xff1a;机器感知 根据音乐合成舞蹈&#xff1b;提升预训练扩散模型分辨率&#xff1b;基于扩散模型的视频超分&#xff1b;LLM推理加速框架&#xff1b;3D控制运动人像合成 DanceMeld: Unraveling Dance Phrases with Hierarchical Latent Codes for M…

架构篇11:架构设计流程-设计备选方案

文章目录 架构设计第 2 步&#xff1a;设计备选方案设计备选方案实战小结 上一期我讲了架构设计流程第 1 步识别复杂度&#xff0c;确定了系统面临的主要复杂度问题后&#xff0c;方案设计就有了明确的目标&#xff0c;我们就可以开始真正进行架构方案设计了。今天我来讲讲架构…

CVE重要通用漏洞复现java phpCVE-2021-44228

在进行漏洞复现之前我们需要在linux虚拟机上进行docker的安装 我不喜欢win上安因为不知道为什么总是和我的vmware冲突 然后我的kali内核版本太低 我需要重新安装一个新的linux 并且配置网络 我相信这会话费我不少时间 查看版本 uname -a 需要5.5或以上的版本 看错了浪…

理想斯特林循环空调

理想斯特林循环空调 淘汰传统的压缩机、摒弃现有的斯特林制冷机&#xff0c;理想斯特林循环制冷机是未来制冷空调领域的发展方向&#xff01; 采用理想斯特林循环制冷机&#xff0c;是目前全球首创、国际领先、世界唯一、效率最高的斯特林制冷机。 取消了传统压缩机空调的蒸发器…

计算机视觉的应用

计算机视觉&#xff08;Computer Vision&#xff09;是一门研究如何让计算机能够理解和分析数字图像或视频的学科。简单来说&#xff0c;计算机视觉的目标是让计算机能够像人类一样对视觉信息进行处理和理解。为实现这个目标&#xff0c;计算机视觉结合了图像处理、机器学习、模…