一、starter 工程的命名
starter 是一个开箱即用的组件,减少不必要的重复代码,重复配置。
Spring 官方定义的 starter 通常命名遵循的格式为 spring-boot-starter-{name},例如 spring-boot-starter-web。非官方 starter 命名应遵循 {name}-spring-boot-starter 的格式,例如,dubbo-spring-boot-starter。
二、需求
写一个序列化的插件,并且可以自由的选择 fastjson 还是 gson,如果没选的情况下默认选择 fastjson。
三、具体步骤
- 创建一个springboot工程,json-spring-boot-starter
- 引入相关依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
</dependency>
<!-- 这个是用来提示用的-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.56</version>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
</dependency>
- 定义一个顶级接口
public interface IJsonFormat {
/**
* 将json转为指定对象
* @param json
* @param clazz
* @return T 目标类型
*/
<T> T json4Object(String json, Class<T> clazz);
/**
* 将对象转json字符串
* @param t
* @return String
*/
String object4json(Object obj);
}
- 创建两个具体的实现类
(1)fastJson的实现类
public class FastJsonFormatImpl implements IJsonFormat {
@Override
public <T> T json4Object(String json, Class<T> 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> T json4Object(String json, Class<T> clazz) {
return gson.fromJson(json, clazz);
}
@Override
public String object4json(Object obj) {
return gson.toJson(obj);
}
}
- 创建properties配置类,用来读取用户的选择,用户可以在yml文件或者propertires文件中来定义自己的选择。配置方式:
properties文件:json.format.type=0或1。
yml文件:json:
format:
type: 1或0
@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;
}
}
- 创建模版类,向redisTemplate等一样,
public class JsonFormatTemplate {
private IJsonFormat jsonFormat;
public JsonFormatTemplate(IJsonFormat jsonFormat) {
this.jsonFormat = jsonFormat;
}
public <T> T json4Object(String json, Class<T> 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);
}
}
- 创建spring.factories
在resource下面创建文件夹META-INF,并创建文件spring.factories
如图:
输入:
# Auto Configrution
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.json.inter.config.JsonConfig
如此就完成了。
三:测试自定义starter
- 在setting.xml中配置好maven本地仓库后,直接右键json-spring-boot-starter项目install后就可以引入依赖使用了;
- 引入依赖:
<dependency>
<groupId>json-spring-boot-starter</groupId>
<artifactId>json-starter</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>