Springboot自動配置原理

首先,上代碼,自己寫一個基本的自動配置

業務如下:如果沒有配置xty-message.message這個字段,給用戶顯示"hello world",如果配置了,給用戶顯示"hello "+配置的字符串。

下面是基本步驟

第一步:創建一個配置屬性類

這個類就是用於自己配置字符串的。

import org.springframework.boot.context.properties.ConfigurationProperties;

/**
 * @Description:    第一步:創建一個配置屬性類
 * 需求:自定義配置一個字符串,如果配置了,瀏覽器打印配置的字符串,否則打印默認字符串。hello world!
 * @Author: Tianyu Xiao
 * @CreateDate: 2019/5/26  20:38
 */
@ConfigurationProperties(prefix = "xty-message")
public class MessageProperties {

    private String message = "world!";

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}

第二步:創建一個接收自動配置的字符串的bean

這個bean先不要自己注入到spring容器中,交由下面說的config類管理,config類將它注入spring中

/**
 * @Description:第二步:創建一個功能的Bean
 * @Author: Tianyu Xiao
 * @CreateDate: 2019/5/26  21:07
 */
public class MessageAutoComponent {
    private String message = null;

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public String getAutoMessage() {
        String msg = "hello " +message;
        return msg;
    }
}

第三步:創建一個Config類,用於自定義配置

/**
 * @Description:第三步:創建自動配置類,自動配置代碼
 * @Author: Tianyu Xiao
 * @CreateDate: 2019/5/26  20:44
 */
@Configuration
@EnableConfigurationProperties(MessageProperties.class)//這個註解讀入我們的配置對象類
@ConditionalOnClass(MessageAutoComponent.class)//當類路徑存在這個類時纔會加載這個配置類,否則跳過,這個很有用比如不同jar包間類依賴,依賴的類不存在直接跳過,不會報錯
public class MessageAutoConfig {

    @Autowired
    private MessageProperties messageProperties;

     @Bean
     @ConditionalOnMissingBean(MessageAutoComponent.class)
     public MessageAutoComponent getMessageProperties() {
         MessageAutoComponent component = new MessageAutoComponent();
         component.setMessage(messageProperties.getMessage());
         return component;
     }
}

第四步:創建一個controller來測試

/**
 * @Description:第四步:根據自動配置創建一個測試類
 * @Author: Tianyu Xiao
 * @CreateDate: 2019/5/26  20:46
 */
@RestController
public class MessageAutoController {

    @Autowired
    private MessageAutoComponent component;

    @GetMapping(value = "/auto/config/message")
    public String getAutoMessage() {
        return component.getAutoMessage();
    }


}

(1)在application.xml不配置xty-message.message=xtyxty的話:輸出hello world

(2)在application.xml不配置xty-message.message=xtyxty的話:輸出hello xtyxty

 

代碼寫完了,根據代碼流程,下面解釋一下自動配置的原理:

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