一、starter 工程的命名
starter 是一个开箱即用的组件,减少不必要的重复代码,重复配置。
Spring 官方定义的 starter 通常命名遵循的格式为 spring-boot-starter-{name},例如 spring-boot-starter-web。非官方 starter 命名应遵循 {name}-spring-boot-starter 的格式,例如,dubbo-spring-boot-starter。
二、需求
写一个序列化的插件,并且可以自由的选择 fastjson 还是 gson,如果没选的情况下默认选择 fastjson。
三、具体步骤
org.springframework.boot
spring-boot-starter
org.springframework.boot
spring-boot-autoconfigure
org.springframework.boot
spring-boot-configuration-processor
true
com.alibaba
fastjson
1.2.56
com.google.code.gson
gson
public interface IJsonFormat {
/**
* 将json转为指定对象
* @param json
* @param clazz
* @return T 目标类型
*/
T json4Object(String json, Class clazz);
/**
* 将对象转json字符串
* @param t
* @return String
*/
String object4json(Object obj);
}
public class FastJsonFormatImpl implements IJsonFormat {
@Override
public T json4Object(String json, Class clazz) {
return JSON.parseObject(json, clazz);
}
@Override
public String object4json(Object obj) {
return JSON.toJSONString(obj);
}
}
(2)Gson的实现类
public class GjsonFormatImpl implements IJsonFormat {
private Gson gson = new Gson();
@Override
public T json4Object(String json, Class clazz) {
return gson.fromJson(json, clazz);
}
@Override
public String object4json(Object obj) {
return gson.toJson(obj);
}
}
@ConfigurationProperties(prefix = JsonProperties.JSON_PREFIX)
public class JsonProperties {
public static final String JSON_PREFIX = "json.format";
private String type;
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
}
public class JsonFormatTemplate {
private IJsonFormat jsonFormat;
public JsonFormatTemplate(IJsonFormat jsonFormat) {
this.jsonFormat = jsonFormat;
}
public T json4Object(String json, Class clazz) {
return jsonFormat.json4Object(json, clazz);
}
public String object4json(Object obj) {
return jsonFormat.object4json(obj);
}
}
@Configuration
@EnableConfigurationProperties(value = JsonProperties.class)
public class JsonConfig {
@Autowired
private JsonProperties jsonProperties;
@ConditionalOnClass(com.alibaba.fastjson.JSON.class)
@Bean
@Primary
public IJsonFormat fastJsonFormat() {
return new FastJsonFormatImpl();
}
@ConditionalOnClass(com.google.gson.Gson.class)
@Bean
public IJsonFormat gsonFormat() {
return new GjsonFormatImpl();
}
@Bean("jsonFormatTemplate")
public JsonFormatTemplate getTemplate(IJsonFormat jsonFormat) {
System.err.println(jsonProperties.getType());
IJsonFormat format;
if ("0".equals(jsonProperties.getType())) {
format = new FastJsonFormatImpl();
} else if ("1".equals(jsonProperties.getType())) {
format = new GjsonFormatImpl();
} else {
format = jsonFormat;
}
return new JsonFormatTemplate(format);
}
}
# Auto Configrution
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.json.inter.config.JsonConfig
如此就完成了。
三:测试自定义starter
json-spring-boot-starter
json-starter
0.0.1-SNAPSHOT