IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Spring Boot自定义starter -> 正文阅读

[Java知识库]Spring Boot自定义starter

一、Spring Boot自定义starter的原理

建议跳过第一部分,自己跟着步骤手写一个插件,再回头看这段解释就豁然开朗了
????spring boot通过IO读取resources资源目录META-INF文件夹下的spring.factories文件,拿到类的全限定名,例如org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.david.learn.first.config.JsonConfiguration,而JsonConfiguration类名就是我们的配置类,将配置类中返回bean方法的业务逻辑类的实例交给spring ioc容器管理,这样就可以使用业务逻辑类的api方法去完成对第三方封装好的逻辑方法的调用。同时也支持接入starter的接入方定义配置参数,需要写Properties配置类,使用@ConfigurationProperties(prefix = "x.xx.xxx")注解去定义参数的前缀,配置类的属性字段+前缀决定了用户定义的是哪个自定义参数,在配置类JsonConfiguration中用@EnableConfigurationProperties(Properties.class)使配置参数生效,同时注入配置参数字段,这样就可以获取(get)到接入方的自定义的参数。
????其实这里用到了SPI(service provider interface)插件机制,一流产商定制接口,然后具体实现交给实现的厂商,就好比数据库的驱动类,上层定义了驱动接口,具体的驱动实现交给数据库厂商,比如mysql、oracle。类似于spring boot的自动装配,SPI机制是ServiceLoader读取META-INF/service目录下接口对应的文件,并读取里面的继承类名,然后通过类实例化到IOC容器中,最终我们就可以获取到了接口对应实现的子类。

二、手把手写一个Spring Boot自定义starter

????举个小需求的例子:提供一个starter,该starter完成对一个对象的格式化,例如传入一个对象,输出该对象的JSON表示,例如%对象的JSON文本%

2.1 编写业务处理类JsonConvertService

package com.david.learn.first.service;

import com.alibaba.fastjson.JSON;

/**
 * 业务处理类
 */
public class JsonConvertService {
    // 前缀
    private String prefixName;
    // 后缀
    private String suffixName;

    /**
     * 将Java对象转为带有指定前后缀的JSON字符串
     *
     * @param o 需要转换的Java对象
     * @return 转换后的字符串
     */
    public String objectToJson(Object o) {
        return prefixName + JSON.toJSONString(o) + suffixName;
    }

    public String getPrefixName() {
        return prefixName;
    }

    public void setPrefixName(String prefixName) {
        this.prefixName = prefixName;
    }

    public String getSuffixName() {
        return suffixName;
    }

    public void setSuffixName(String suffixName) {
        this.suffixName = suffixName;
    }
}

2.2 编写自定义参数类JsonProperties

package com.david.learn.first.config;

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

/**
 * @Description 配置类(类名一般为模块名+Properties) demo.json为Starter使用者通过yml配置文件动态修改属性值的变量名前缀
 */
@ConfigurationProperties(prefix = "demo.json")
public class JsonProperties {
    // Starter使用者没在配置文件中配置prefixName属性的值时的默认值
    public static final String DEFAULT_PREFIX_NAME = "@";

    // Starter使用者没在配置文件中配置suffixName属性的值时的默认值
    public static final String DEFAULT_SUFFIX_NAME = "@";

    private String prefixName = DEFAULT_PREFIX_NAME;

    private String suffixName = DEFAULT_SUFFIX_NAME;

    public String getPrefixName() {
        return prefixName;
    }

    public void setPrefixName(String prefixName) {
        this.prefixName = prefixName;
    }

    public String getSuffixName() {
        return suffixName;
    }

    public void setSuffixName(String suffixName) {
        this.suffixName = suffixName;
    }
}

2.3 编写JsonConfiguration配置类

package com.david.learn.first.config;

import com.david.learn.first.service.JsonConvertService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration // 表示当前是配置类
@ConditionalOnClass(JsonConvertService.class) //存在这个JsonConvertService类配置才生效
@EnableConfigurationProperties(JsonProperties.class) //使使用 @ConfigurationProperties 注解的类生效。
public class JsonConfiguration {
    private JsonProperties jsonProperties;

    /**
     * @autowired注解放在方法上:
     * 如果方法没有参数,spring IOC容器会在类加载完后执行一次这个方法;
     * 如果方法中有参数的话,还会从IOC容器中自动注入这个方法的参数,然后执行一次这个方法。
     * 自动注入配置类参数
     */
    @Autowired
    public JsonConfiguration(JsonProperties jsonProperties) {
        this.jsonProperties = jsonProperties;
    }

    @Bean
    @ConditionalOnMissingBean(JsonConvertService.class)
    public JsonConvertService jsonConvertService() {
        JsonConvertService jsonConvertService = new JsonConvertService();
        jsonConvertService.setPrefixName(jsonProperties.getPrefixName());
        jsonConvertService.setSuffixName(jsonProperties.getSuffixName());
        return jsonConvertService;
    }
}

2.4 将配置类的全路径名配置到spring.factories文件中

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.david.learn.first.config.JsonConfiguration

如果是多个配置类,则用英文,隔开,keyorg.springframework.boot.autoconfigure.EnableAutoConfiguration保持不变

2.5 提供starter方式

????用maven的打包命令,install是将jar包打到本地仓库,deploy则打包到maven的私服仓库,只需要将GAV信息提供给调用方,在调用项目的pom文件引入即可

<groupId>com.david.learn</groupId>
<artifactId>first-demo-spring-boot-starter</artifactId>
<version>0.0.2-SNAPSHOT</version>

注意:在大厂生产环境不会用SNAPSHOT包,而是打稳定的包不会被别人覆盖
以上就完成了手写一个starter的步骤,再去看原理就懂了,为啥要按照约定去spring.factories文件里配置上配置类的全限定名(类的包路径+类名)
????整体上看写好的starter结构是这样
在这里插入图片描述

三、Github代码

代码地址:https://github.com/BillDavidup/multi-starter-demo
如果安装了git,则可使用git克隆代码到本地:git clone git@github.com:BillDavidup/multi-starter-demo.git

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-07-17 16:07:52  更:2022-07-17 16:11:58 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 15:33:41-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码