Springboot手写starter

一、starter 工程的命名
starter 是一个开箱即用的组件,减少不必要的重复代码,重复配置。
Spring 官方定义的 starter 通常命名遵循的格式为 spring-boot-starter-{name},例如 spring-boot-starter-web。非官方 starter 命名应遵循 {name}-spring-boot-starter 的格式,例如,dubbo-spring-boot-starter。
二、需求
写一个序列化的插件,并且可以自由的选择 fastjson 还是 gson,如果没选的情况下默认选择 fastjson。
三、具体步骤

  1. 创建一个springboot工程,json-spring-boot-starter
    Springboot手写starter_第1张图片
  2. 引入相关依赖

		
			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
      
  1. 定义一个顶级接口
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);
}
  1. 创建两个具体的实现类
    (1)fastJson的实现类
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);
	}
}
  1. 创建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;
	}
}
  1. 创建模版类,向redisTemplate等一样,
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);
	}
}
  1. 核心配置类
@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);
	}
}
  1. 创建spring.factories
    在resource下面创建文件夹META-INF,并创建文件spring.factories
    如图:
    Springboot手写starter_第2张图片
    输入:
# Auto Configrution
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.json.inter.config.JsonConfig

如此就完成了。
三:测试自定义starter

  1. 在setting.xml中配置好maven本地仓库后,直接右键json-spring-boot-starter项目install后就可以引入依赖使用了;Springboot手写starter_第3张图片
  2. 引入依赖:

			json-spring-boot-starter
			json-starter
			0.0.1-SNAPSHOT
		

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