我們通過手寫一個starter,實現一個這樣的功能:如果存在FastJson包則將對象以json形式輸出,否則以對象的toString()輸出。另外引入這個starter後我們不希望有任何的配置(自動配置),開箱即用。此文並不探究starter的原理,只希望讀者可以初步瞭解一個starter的開發流程。
步驟1:新建一個空maven工程,並在pom.xml中導入如下依賴
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.62</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>2.1.6.RELEASE</version>
</dependency>
步驟2:通過maven項目,編寫一個starter
2.1編寫接口
public interface FormatProcessor {
<T> String format(T obj);
}
2.2編寫兩個實現類
public class JsonFormatProcessor implements FormatProcessor {
public <T> String format(T obj) {
return "JsonFormatProcess"+ JSON.toJSONString(obj);
}
}
public class StringFormatProcessor implements FormatProcessor {
public <T> String format(T obj) {
return "StringFormatProcessor:"+ Objects.toString(obj);
}
}
2.3編寫一個自動注入bean的類
@Import(FormatAutoConfiguration.class)
@Configuration
public class HelloAutoConfiguration {
public HelloFormatTemplate helloFormatTemplate(FormatProcessor formatProcessor){
return new HelloFormatTemplate(formatProcessor);
};
}
@Configuration
public class FormatAutoConfiguration {
@ConditionalOnMissingClass("com.alibaba.fastjson.JSON")
@Bean
@Primary
public FormatProcessor StringFormat(){
return new StringFormatProcessor();
}
@ConditionalOnClass(name = "com.alibaba.fastjson.JSON")
@Bean
public FormatProcessor jsonFormat(){
return new JsonFormatProcessor();
}
}
2.4,對外提供一個template
public class HelloFormatTemplate {
private FormatProcessor formatProcessor;
public HelloFormatTemplate(FormatProcessor formatProcessor) {
this.formatProcessor = formatProcessor;
}
public <T> String doFormat(T obj){
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("Execute format:").append("\n");
stringBuilder.append("Obj format result:").append(formatProcessor.format(obj)).append("\n");
return stringBuilder.toString();
}
}
2.5配置spring.factories
如果讀者對JDK的SPI機制熟悉的話,對下面的配置應該感到很熟悉。接下來我們需要在resources目錄下創建META-INF文件夾,並在這個文件夾中新建一個名叫spring.factories的文件
spring.factories中我們指定需要自動配置的配置類DemoAutoConfig,Spring在啓動時會自動加載這個配置文件,找到我們的配置類,注意配置的是全類名。細心的同學可能會問,FormaterConfig也需要自動配置呀,怎麼這裏怎麼只需要配置DemoAutoConfig呢,因爲我們在DemoAutoConfig中用到了@Import註解將它導入進來啦。
改starter編寫完成,運行命令mvn clean install將我們的工程發佈到本地倉庫。
下面我們新建一個SpringBoot工程的項目導入我們寫好的這個starter。
3.1Template需要序列化輸出一個類,現在我們就來定義一個類,並重寫它的toString方法
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
3.2引入maven項目以來,即可運行;
@Autowired
HelloFormatTemplate helloFormatTemplate;
@GetMapping("/format")
public String format(){
User user = new User();
user.setAge(18);
user.setName("MIC");
return helloFormatTemplate.doFormat(user);
}
3.3,如果我們再該springboot項目中,未引入fastjson依賴,則就以對象toString形式輸出。
如果項目中引入了JSON依賴,則就以對象json形式輸出