Springboot自定义starter

文章目录

  • 前言
  • 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
Springboot自定义starter_第1张图片
kafka的默认配置:
Springboot自定义starter_第2张图片

1.引入依赖

两者选着其中之一即可。

1.1 json的转换

    
    <dependency>
      <groupId>com.alibabagroupId>
      <artifactId>fastjsonartifactId>
      <version>1.2.56version>
      
      <optional>trueoptional>
    dependency>

    
    <dependency>
      <groupId>com.google.code.gsongroupId>
      <artifactId>gsonartifactId>
      <version>2.8.9version>
      <optional>trueoptional>
    dependency>

1.2 xml转换依赖

   
    <dependency>
      <groupId>com.thoughtworks.xstreamgroupId>
      <artifactId>xstreamartifactId>
      <version>1.4.9version>
    dependency>

2.定义Formate核心转化接口

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

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

3.1 json转换的实现

/**
 * 实现json格式的转换
 */
public class JsonFormatProcessor implements FormatProcessor{
    /**
     *
     * @param obj
     * @return
     * @param 
     */
    @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 
     */
    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 环境搭建

 
    <dependency>
      <groupId>com.elite.springbootgroupId>
      <artifactId>format-spring-boot-starterartifactId>
      <version>1.0.0version>
    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格式测试:
Springboot自定义starter_第3张图片

9.4 配置xml

配置yml:

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

9.5 测试

Springboot自定义starter_第4张图片

你可能感兴趣的:(springboot,spring,boot,java)