文章目录
- 前言
- 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
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>*/@Overridepublic <T> String formate(T obj) {return JSON.toJSONString(obj);}
}
3.2 xml转换的实现
/*** xml转换*/
public class XmlFormatProcessor implements FormatProcessor{@Overridepublic <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;//构造器传入propertiespublic 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*/@Beanpublic 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 {@AutowiredMyFormatTemplate 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格式测试:
9.4 配置xml
配置yml:
server:port: 8888
spring:myformat:format: XML