springboot的自动配置功能能够减少我们手动配置,约定大于配置。本篇我们手动写一个starter,自定义配置实现具体的格式转化,第三方接口经常会用到JSON格式或者XML格式传输数据,根据配置是转入json还是xml格式。
我们可以看看现有的默认配置的结构:
elasticsearch
kafka的默认配置:
两者选着其中之一即可。
<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>
<dependency>
<groupId>com.thoughtworks.xstreamgroupId>
<artifactId>xstreamartifactId>
<version>1.4.9version>
dependency>
/**
* 定义核心格式转换的处理器
*
*/
public interface FormatProcessor {
/**
* 定义一个格式化的方法
* @param obj
* @param
* @return
*/
<T> String formate(T obj);
}
/**
* 实现json格式的转换
*/
public class JsonFormatProcessor implements FormatProcessor{
/**
*
* @param obj
* @return
* @param
*/
@Override
public <T> String formate(T obj) {
return JSON.toJSONString(obj);
}
}
/**
* xml转换
*/
public class XmlFormatProcessor implements FormatProcessor{
@Override
public <T> String formate(T obj) {
XStream xStream= new XStream();
return xStream.toXML(obj);
}
}
/**
* 配置类,可以配置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;
}
}
/**
* 核心格式转换自动配置类
*/
@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();
}
}
}
}
/**
* 定义一个格式化模板类
*/
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);
}
}
/**
* 自动注册模板类
*/
@Configuration
@Import(FormatAutoConfiguration.class)
public class MyFormatAutoConfiguration {
/**
* 将模板类注入到bean
* @param formatProcessor
* @return
*/
@Bean
public MyFormatTemplate helloFormatTemplate(FormatProcessor formatProcessor){
return new MyFormatTemplate(formatProcessor);
}
}
在resources下创建META-INF目录,再在其下创建spring.factories文件
install 打包,然后就可以在SpringBoot项目中依赖改项目来操作了。
<dependency>
<groupId>com.elite.springbootgroupId>
<artifactId>format-spring-boot-starterartifactId>
<version>1.0.0version>
dependency>
public class Person {
private String name;
private int age;
//省略 get set
}
@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;
}
}
配置yml:
server:
port: 8888
spring:
myformat:
format: XML