1. 程式人生 > >Spring Boot之自動配置原理以及自定義starter

Spring Boot之自動配置原理以及自定義starter

前言:spring boot之所以強大,其核心自動配置起到了關鍵的作用,通過自動配置,摒棄了傳統開發中的一大堆配置檔案xml。如果說spring boot是一把手槍,那starter就是他的子彈。starter簡單來說,就是一堆jar組成的一個功能,而且是可以自動配置jar。

1、自動配置原理

在spring boot應用的主入口

進入到@SpringBootApplication註解中

@SpringBootConfiguration註解說明主程式類也是一個配置類

@EnableAutoConfiguration註解中

匯入了 AutoConfigurationImportSelector類

 進入getCandidateConfigurations方法(獲得所有的候選配置資訊)

通過SpringFactoriesLoader工廠載入資訊

 

 

原來載入的是META-INF檔案下的spring.factories檔案配置的資訊

來到自動配置包下的META-INF

進入spring.factories檔案

 

進入其中的一個自動配置類 ThymeleafAutoConfiguration

 
 

 @Configuration:配置類

@EnableConfigurationProperties():開啟某屬性類,裡面封裝的是屬性資訊,相當於@ConfigurationProperties載入application.properties裡面的資訊,並用@Component將類交由spring管理

@ConditionalOnClass():當這個類存在時,再進行下面的步驟,否則就不進行下面的步驟了

@AutoConfigureAfter():當自動配置完成後,再執行裡面的類

@ConfigurationOnMissBean():當這個bean不存在時,再新增bean類

@Bean:新增bean類

2、自定義starter

建立專案

Group:本地倉庫的各級目錄

Artifact:{自定義名}-spring-boot-starter

在專案中最好只留spring-boot-starter依賴,這是最基本的starter依賴,其他依賴都可以刪掉,保持專案的簡潔性

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>

	<groupId>cn.zdxh.starter</groupId>
	<artifactId>hello-spring-boot-starter</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>jar</packaging>

	<name>hello-spring-boot-starter</name>
	<description>Demo project for Spring Boot</description>

	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.0.6.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
		<java.version>1.8</java.version>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter</artifactId>
		</dependency>

	</dependencies>
	
</project>

目錄結構:

不要主程式入口!不要主程式入口!不要主程式入口!

bean:讀取properties裡面的資訊

config:實現自動配置的類

service:需要被自動配置的類

static/META-INF/spring.factories:建立該檔案作為存放config類

Hello類

該類交由spring管理,並且繫結application.properties檔案中的init.hello屬性

@Component
@ConfigurationProperties(prefix = "init.hello")
public class Hello {
    private String message="我是初始的message";

    public String getMessage() {
        return message;
    }

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

HelloService的目標配置類

注入從檔案中讀出資訊的Hello類

public class HelloService {

    @Autowired
    private Hello hello;

    public void sayHello(){
        System.out.println(hello.getMessage());//僅僅作輸出的操作
    }
}

 HelloAutoConfig自動配置類

核心是@ConditionalOnMissBean(),當容器中沒有這個類時,才進行自動配置操作

@Configuration
public class HelloAutoConfig {
    @ConditionalOnMissingBean(HelloService.class)
    @Bean
    public HelloService helloService(){
        return new HelloService();
    }
}

spring.factories檔案新增自動配置類

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
cn.zdxh.starter.hellospringbootstarter.config.HelloAutoConfig,

 

點選右上角的Maven Projects調出以下視窗,並install創庫

在本地專案中就可以看到建立的starter

驗證自定義starter

在別的專案引入自定義starter

<dependency>
	<groupId>cn.zdxh.starter</groupId>
	<artifactId>hello-spring-boot-starter</artifactId>
	<version>0.0.1-SNAPSHOT</version>
</dependency>

在application.properties新增需要顯示的資訊

init.hello.message=我是配置的message資訊

在測試類中注入HelloService類

        @Autowired
	HelloService helloService;
	
	@Test
	public void testHelloService(){
		helloService.sayHello();
	}

在控制檯看到如下資訊,則自動配置資訊成功

 當別人引用這個自定義starter時,HelloService類就會被自動配置,就不需要手動添加了,這就是spring boot的魅力所在!