Springboot自定义starter

news2025/1/10 20:20:26

文章目录

  • 前言
  • 1.引入依赖
    • 1.1 json的转换
    • 1.2 xml转换依赖
  • 2.定义Formate核心转化接口
  • 3.实现核心接口json和xml的转换
    • 3.1 json转换的实现
    • 3.2 xml转换的实现
  • 4. FormatProperties类
  • 5.FormatAutoConfiguration 类配置
  • 6.提供一个MyFormatTemplate 模板类
  • 7.注册到springboot
  • 8.创建spring.factories文件
  • 9.创建测试引入start
    • 9.1 环境搭建
    • 9.2 测试实体
    • 9.3 controller
    • 9.4 配置xml
    • 9.5 测试

前言

springboot的自动配置功能能够减少我们手动配置,约定大于配置。本篇我们手动写一个starter,自定义配置实现具体的格式转化,第三方接口经常会用到JSON格式或者XML格式传输数据,根据配置是转入json还是xml格式。

我们可以看看现有的默认配置的结构:
elasticsearch
elasticsearch
kafka的默认配置:
kafka

1.引入依赖

两者选着其中之一即可。

1.1 json的转换

    <!--可以使用ali的fastjson也可以使用google的gson-->
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>fastjson</artifactId>
      <version>1.2.56</version>
      <!-- 可选 -->
      <optional>true</optional>
    </dependency>

    <!--gson-->
    <dependency>
      <groupId>com.google.code.gson</groupId>
      <artifactId>gson</artifactId>
      <version>2.8.9</version>
      <optional>true</optional>
    </dependency>

1.2 xml转换依赖

   <!--xstream xml转换工具-->
    <dependency>
      <groupId>com.thoughtworks.xstream</groupId>
      <artifactId>xstream</artifactId>
      <version>1.4.9</version>
    </dependency>

2.定义Formate核心转化接口

/**
 * 定义核心格式转换的处理器
 * 
 */
public interface FormatProcessor {
    /**
     * 定义一个格式化的方法
     * @param obj
     * @param <T>
     * @return
     */
    <T> String formate(T obj);
}

3.实现核心接口json和xml的转换

3.1 json转换的实现

/**
 * 实现json格式的转换
 */
public class JsonFormatProcessor implements FormatProcessor{
    /**
     *
     * @param obj
     * @return
     * @param <T>
     */
    @Override
    public <T> String formate(T obj) {
        return JSON.toJSONString(obj);
    }
}

3.2 xml转换的实现

/**
 * xml转换
 */
public class XmlFormatProcessor implements FormatProcessor{
    @Override
    public <T> String formate(T obj) {
        XStream xStream= new XStream();
        return xStream.toXML(obj);
    }
}

4. FormatProperties类

/**
 * 配置类,可以配置yml或者properties配置转化的具体的格式
 */
@ConfigurationProperties(prefix = "spring.myformat")
public class FormatProperties {

    //定义默认的格式
   public static final String DEFAULT_FORMATE="com.elite.springboot.format.JsonFormatProcessor";

    /**
     * 配置外部的类型
     */
    private String format;

    public String getFormat() {
        return format;
    }

    public void setFormat(String format) {
        this.format = format;
    }
}

5.FormatAutoConfiguration 类配置

/**
 * 核心格式转换自动配置类
 */
@Configuration(proxyBeanMethods = false)
@EnableConfigurationProperties(FormatProperties.class)
public class FormatAutoConfiguration {

    //引入配置类
    private final FormatProperties properties;

    //构造器传入properties
    public FormatAutoConfiguration(FormatProperties properties) {
        this.properties = properties;
    }
    /**
     * 根据配置加载格式处理器
     * @return
     */
    @Bean
    @ConditionalOnClass(name="com.alibaba.fastjson.JSON")
    public FormatProcessor getFormatProcessor(){
        if(this.properties.getFormat()==null){
           return new JsonFormatProcessor();
        }else{
          if(this.properties.getFormat().equals("JSON")){
              return new JsonFormatProcessor();
          }else if(this.properties.getFormat().equals("XML")) {
              return new XmlFormatProcessor();
          }else{
             throw new RuntimeException();
          }
        }
    }
}

6.提供一个MyFormatTemplate 模板类

/**
 * 定义一个格式化模板类
 */
public class MyFormatTemplate {
    //加载配置格式化类
    private FormatProcessor formatProcessor;

    public MyFormatTemplate(FormatProcessor processor) {
        this.formatProcessor = processor;
    }

    /**
     * 执行格式转化
     * @param obj
     * @return
     * @param <T>
     */
    public <T> String doFormat(T obj) {
        return formatProcessor.formate(obj);
    }

}

7.注册到springboot

/**
 * 自动注册模板类
 */
@Configuration
@Import(FormatAutoConfiguration.class)
public class MyFormatAutoConfiguration {

    /**
     * 将模板类注入到bean
     * @param formatProcessor
     * @return
     */
    @Bean
    public MyFormatTemplate helloFormatTemplate(FormatProcessor formatProcessor){
        return new MyFormatTemplate(formatProcessor);
    }
}

8.创建spring.factories文件

在resources下创建META-INF目录,再在其下创建spring.factories文件
install 打包,然后就可以在SpringBoot项目中依赖改项目来操作了。

9.创建测试引入start

9.1 环境搭建

 <!--引入自定义的starter-->
    <dependency>
      <groupId>com.elite.springboot</groupId>
      <artifactId>format-spring-boot-starter</artifactId>
      <version>1.0.0</version>
    </dependency>

9.2 测试实体

public class Person {
    private String name;
    private int age;
    //省略 get set
}

9.3 controller

@RestController
public class FormatController {
    @Autowired
    MyFormatTemplate myFormatTemplate;

    @GetMapping("/format")
    public String jsonformat(){
        Person p = new Person();
        p.setName("elite");
        p.setAge(22);
        String s = myFormatTemplate.doFormat(p);
        System.out.println("s="+s);
        return s;
    }
}

JSON格式测试:
JSON

9.4 配置xml

配置yml:

server:
  port: 8888
spring:
  myformat:
    format: XML

9.5 测试

xml

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

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

相关文章

cavity开盖制作的辅助层别

cavity开盖工艺制作的辅助层别 数量&#xff1a;6个

suricata的flow流会话管理分析1

在《suricata中的线程管理分析》一文中&#xff0c;我们看到suricata中有FlowWorker和FlowManager两个线程来处理流表&#xff0c;说明流表的实现应该不简单&#xff0c;果然&#xff0c;看了流相关的这块代码后&#xff0c;发现确实有点复杂&#xff0c;代码估计得慢慢坑&…

[SpringMVC]Controller控制器、Interceptor拦截器、RestFul风格、异常处理、JSON数据格式与AJAX请求

文章目录 MVC理论基础配置环境并搭建项目Controller控制器配置视图解析器和控制器RequestMapping详解RequestParam和RequestHeader详解CookieValue和SessionAttrbutie重定向和请求转发Bean的Web作用域 RestFul风格Interceptor拦截器创建拦截器多级拦截器 异常处理JSON数据格式与…

C# Socket入门编程winform案例(附下载链接)

C# socket编程实现信息的接收&#xff08;winform&#xff09; 点我下载项目资源 服务器端&#xff1a; 第一步&#xff1a;建立一个用于通信的Socket对象 第二步&#xff1a;使用bind绑定IP地址和端口号 第三步&#xff1a;使用listen监听客户端 第四步&#xff1a;使用accep…

宝安西乡产业园变九年制学校,新增宅地、商地。

6月5日&#xff0c;宝安区城市更新和土地整备局发布《西乡街道盐田社区银田地块土地整备利益统筹项目土地整备规划&#xff08;草案&#xff09;》&#xff08;以下简称草案&#xff09;。 草案显示&#xff0c;该项目经过调整后&#xff1a; ● 新增一块二类居住用地&#xf…

王者荣耀战区活跃度排名怎么实现的?这篇文章给你答案!

&#x1f349;博客主页:阿博历练记 &#x1f4d6;文章专栏:数据结构与算法 &#x1f68d;代码仓库:阿博编程日记 &#x1f365;欢迎关注:欢迎友友们点赞收藏关注哦&#x1f339; 文章目录 &#x1f308;前言&#x1f36a;堆的实现&#x1f50d;1.堆的结构框架&#x1f50d;2.堆…

通过ChatGPT打造10W+公众号文章

大家好&#xff0c;我是可夫小子&#xff0c;关注AIGC、读书和自媒体。解锁更多ChatGPT、AI绘画玩法。加&#xff1a;keeepdance&#xff0c;备注&#xff1a;chatgpt。 这是一篇非常具有实操性的指南&#xff0c;可能会动到一些某些行业人的蛋糕&#xff0c;但我无益于此。我是…

pnpm的安装和使用

1 安装 1.1 安装教程 npm全局安装pnpm npm install -g pnpm设置镜像地址 获取当前配置的镜像地址 pnpm get registry设置新的镜像地址 pnpm set registry https://registry.npm.taobao.org设置包存放地址 pnpm config set store-dir E:/xxx1.2 安装问题 当在vscode上使用…

在labview里使用LabSQL连接ACCESS数据库

使用LabSQL连接ACCESS数据库 写在前面ODBC数据源管理器的配置LV软件里使用结束 写在前面 ACCESS数据库一般包含在Office组件里&#xff0c;安装完Office后就可以直接拿来使用&#xff0c;要求不高的场合适合使用。 LabSQL工具包直接放进LV的安装目录下&#xff0c;打开软件后在…

SpringBootWeb案例-1(下: 来源黑马程序员)

3. 员工管理 完成了部门管理的功能开发之后&#xff0c;我们进入到下一环节员工管理功能的开发。 基于以上原型&#xff0c;我们可以把员工管理功能分为&#xff1a; 分页查询带条件的分页查询删除员工新增员工修改员工 3.1 分页查询 3.1.1 基础分页 3.1.1.1 需求分析 我…

YOLOV8 Onnxruntime Opencv DNN C++部署

1.Opencv介绍 OpenCV由各种不同组件组成。OpenCV源代码主要由OpenCV core(核心库)、opencv_contrib和opencv_extra等子仓库组成。近些年,OpenCV的主仓库增加了深度学习相关的子仓库:OpenVINO(即DLDT, Deep Learning Deployment Toolkit)、open_model_zoo,以及标注工具CV…

C++标准模板库 队列容器的使用

队列&#xff1a;在数据结构中也成为操作受限的线性表&#xff0c;是一种只允许在表的一端插入&#xff0c;在另一端删除的线性表 特点&#xff1a;先进先出&#xff0c;像打饭《排在最前面的先买&#xff0c;后到的排在队尾&#xff0c;即删除在队头&#xff0c;插入在队尾》…

面试测试工程师,都要考察什么?

今年刚接触了&#xff08;功能&#xff09;测试工程师的面试工作&#xff0c;有遇到对信贷业务流程较熟悉的、工作内容纯测试app功能的、什么都接触过但是不够深入的&#xff0c;发现简历上写的东西和实际真的有点差距&#xff0c;面试也是一个艺术活。 如果你想学习自动化测试…

Security Onion(安全洋葱)开源入侵检测系统(ids)安装

文章目录 Security Onion介绍安装配置&#xff08;最低&#xff09;安装步骤web界面 Security Onion介绍 Security Onion是一款专为入侵检测和NSM(网络安全监控)设计的Linux发行版。其安装过程很简单&#xff0c;在短时间内就可以部署一套完整的NSM收集、检测和分析的套件。Se…

高完整性系统(6)Alloy核心语法 + 有限状态机(Finite State Machines);check assertion amination

文章目录 Alloy 核心内容sig数据类型varonefactpre-conditionfunpred 谓词谓词的构成谓词的结果 / 普通条件约束和 pre-post condition 的区别 Finite State Machines 有限状态机FSM in Alloy Check Specification动画&#xff08;Animation&#xff09;&#xff1a;run 关键字…

安装superset并连接clickhouse

说明&#xff1a; Apache Superset是一个现代的数据探索和可视化平台。它功能强大且十分易用&#xff0c;可对接各种数据源&#xff0c;包括很多现代的大数据分析引擎&#xff0c;拥有丰富的图表展示形式&#xff0c;并且支持自定义仪表盘。 使用的服务器操作系统为CentOS 7&a…

路径规划算法:基于天牛须优化的路径规划算法- 附代码

路径规划算法&#xff1a;基于天牛须优化的路径规划算法- 附代码 文章目录 路径规划算法&#xff1a;基于天牛须优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要&#xff1a;本文主要介绍利用智能优化算法…

【数据结构与算法篇】深入浅出——二叉树(详解)

​&#x1f47b;内容专栏&#xff1a;《数据结构与算法专栏》 &#x1f428;本文概括&#xff1a; 二叉树是一种常见的数据结构&#xff0c;它在计算机科学中广泛应用。本博客将介绍什么是二叉树、二叉树的顺序与链式结构以及它的基本操作&#xff0c;帮助读者理解和运用这一重…

微信开发框架WxJava之微信公众号开发的入门使用篇

微信开发框架WxJava之微信公众号开发的入门使用篇 WxJava介绍微信公众号申请测试公众号测试公众号配置 WxJava微信公众号开发添加依赖配置微信参数实例化WxMpService对接微信公众号回调接收与回复消息 微信消息路由器WxMpMessageHandlerWxMessageInterceptor自定义Handle自定义…

Vue.js devtools运行但调试窗口未出现的解决方案

Vue.js devtools是一款基于Chrome浏览器的调试Vue.js应用的扩展程序。然而&#xff0c;有时即使该插件已经在运行&#xff0c;调试窗口也可能未出现。这主要可能有以下几个原因&#xff0c;并附有相应的解决方法&#xff1a; 1. Chrome扩展程序选项的问题 首先&#xff0c;右上…