【深入淺出SpringBoot的核心原理】手寫Starter

我們通過手寫一個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形式輸出
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章