一 前言
之前我们提到自动装配的定义是,尝试去装配class path下开发人员添加的jar依赖,不一定装配。这个是理论,而SpringBoot starter便是他的实现,理论需要落地,那就要自己动手写一个了。
二 实践
-
加载核心配置类
/** * @author 子羽 * @Description srping boot starter * @Date 2021/8/4 */ @Import(FormatAutoConfiguration.class) @Configuration @EnableConfigurationProperties(FormatProperties.class) public class QianYunFormatConfiguration { @Bean public ForTemplate helloFormatTemplate(FormatProperties formatProperties, FormatProcessor formatProcessor){ if (formatProperties.getType().equals("fastjson")) { return new ForTemplate(new FastJsonProcesser()); } if (formatProperties.getType().equals("gson")) { return new ForTemplate(new GsonFormatProcesser()); } return new ForTemplate(formatProcessor); } }
2.@Import(FormatAutoConfiguration.class) 加载FormatAutoConfiguration.class
/**
* @author 子羽
* @Description 条件装配 判断是否装配
* @Date 2021/8/4
*/
@Configuration
public class FormatAutoConfiguration {
@ConditionalOnClass(name = "com.alibaba.fastjson.JSON")
@Bean
@Primary
public FormatProcessor fastjsonFormat(){
return new FastJsonProcesser();
}
@ConditionalOnClass(name = "com.google.gson.Gson")
@Bean
public FormatProcessor gsonFormat(){
return new GsonFormatProcesser();
}
}
注意 @Primary,他是在有多个实现时,选择的默认实现
-
获取配置
** * @author 子羽 * @Description ConfigurationProperties 作用和@Value差不多 就是多了通配符 * @Date 2021/8/4 */ @ConfigurationProperties(prefix = FormatProperties.MY_PERFIX) public class FormatProperties { public static final String MY_PERFIX = "qianyu.format"; private String type; public String getType() { return type; } public void setType(String type) { this.type = type; } } -
创建抽象类
/** * @author 子羽 * @Description 格式化的方法 * @Date 2021/8/3 */ public interface FormatProcessor { /** * 定义一个格式化的方法 * * @param obj * @param <T> * @return */ <T> String format(T obj); } -
创建具体实现
/** * @author 子羽 * @Description FastJson * @Date 2021/8/3 */ @Component public class FastJsonProcesser implements FormatProcessor { public <T> String format(T obj) { return "fastJsonFormatProcess:" + JSON.toJSONString(obj); } } ``` /** * @author 子羽 * @Description Gson * @Date 2021/8/3 */ public class GsonFormatProcesser implements FormatProcessor { public <T> String format(T obj) { Gson gson = new Gson(); return "GsonFormatProcesse" + gson.toJson(obj); } } ``` -
封装调用对象
/** * @author 子羽 * @Description 包含具体引用 * @Date 2021/8/4 */ public class ForTemplate { private FormatProcessor formatProcessor; public ForTemplate(FormatProcessor formatProcessor) { this.formatProcessor = formatProcessor; } public <T> String format(T obj){ return formatProcessor.format(obj); } } -
编写spring.factories 放到META-INF目录下
org.springframework.boot.autoconfigure.EnableAutoConfiguration = service.conf.QianYunFormatConfiguration -
mvn install打包 这样就完成了一个springbootstarter的编写
-
调用
1) 引入maven依赖
<dependency> <groupId>star</groupId> <artifactId>boot-star</artifactId> <version>1.0-SNAPSHOT</version> </dependency>2)配置文件增加配置,确定选择哪一个bean
``` qianyu.format.type=gson ```3) 具体调用方法 ``` /** * @author 子羽 * @Description 测试srpingbootstarter * @Date 2021/8/4 */ public class BootStarTest extends BaseTest {
@Autowired public ForTemplate forTemplate; @Test public void formatTest(){ User user = new User(); user.setAge(18); user.setName("子羽"); String format = forTemplate.format(user); System.out.println(format); } } ```输出 GsonFormatProcesse{"name":"子羽","age":18},调用成功