springboot:手寫starter
技術標籤:積累總結spring bootjavaspring
springboot的每一個starter可以看作是一組依賴的集合,能夠作為單獨的模組提供特定功能,其實現的思路就是自定義一個工程,根據需求新增相關依賴,然後編寫自動配置類,最後打包供其它專案使用。
一、新建maven工程,在pom檔案新增依賴
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.4.1</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.example.test.starter</groupId> <artifactId>demo</artifactId> <version>0.0.1-SNAPSHOT</version> <name>starter</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-source-plugin</artifactId> </plugin> </plugins> </build> </project>
其中spring-boot-starter是必須新增的,其它根據實際情況
二、編寫配置類
@ConfigurationProperties(prefix = "start.demo")
@Data
public class StartDemoProperties {
private String url = "www.baidu.com";
}
這個類專門儲存yml配置檔案裡的配置,@ConfigurationProperties註解作用是根據prefix的值獲取配置檔案裡的配置並對映到屬性上,然後交給spring容器管理
@Configuration @EnableConfigurationProperties(StartDemoProperties.class) public class StartDemoConfig { @Resource private StartDemoProperties startDemoProperties; @Bean @ConditionalOnMissingBean public HttpClientDemo httpClient() { HttpClientDemo httpClientDemo = new HttpClientDemo(); httpClientDemo.setUrl(startDemoProperties.getUrl()); return httpClientDemo; } }
這個類是實現自動配置的功能,@Configuration註解代表該類是配置類,交給spring容器管理;@EnableConfigurationProperties(StartDemoProperties.class)註解是讓括號裡的配置類生效;@Bean註解代表該方法返回的bean交給spring容器管理;@ConditionalOnMissingBean註解代表返回的bean不存在時才生效
貼一下demo功能類HttpClientDemo的程式碼
@Data public class HttpClientDemo { private String url; public String getHtml() { try { URL url = new URL(this.url); URLConnection urlConnection = url.openConnection(); BufferedReader br = new BufferedReader(new InputStreamReader(urlConnection.getInputStream(), "utf-8")); String line = null; StringBuilder sb = new StringBuilder(); while ((line = br.readLine()) != null) { sb.append(line).append("\n"); } return sb.toString(); } catch (Exception e) { e.printStackTrace(); } return "錯誤"; } }
三、資原始檔配置
在resources目錄下新建資料夾META-INF,在該資料夾下新建名字為spring.factories的檔案,這個檔案的值是以鍵值形式儲存的
EnableAutoConfiguration就是springboot特有的自動配置類,值為自定義編寫的配置類
四、打包使用
使用maven的import命令將該專案打包並安裝到本地倉庫,或者提交到遠端私服,在其它專案使用時只需要新增依賴即可
五、擴充套件
springboot是如何實現這些自動配置呢?
springboot的啟動類有一個註解:
@SpringBootApplication(exclude = DruidDataSourceAutoConfigure.class)
它是@SpringBootConfiguration @EnableAutoConfiguration @ComponentScan的組合註解,exclude屬性代表排除某個自動配置類
@SpringBootConfiguration代表該類是springboot的配置類
@ComponentScan是spring的自動掃描
@EnableAutoConfiguration是核心註解,表示自動配置
@EnableAutoConfiguration分析
該註解內部使用了@Import({AutoConfigurationImportSelector.class}),這個註解會匯入AutoConfigurationImportSelector.class類,正是這個類實現了自動配的的功能,該類的selectImports()方法是執行入口,呼叫getAutoConfigurationEntry()方法獲取自動配置,其中的getCandidateConfigurations()方法呼叫了spring的SpringFactoriesLoader.loadFactoryNames()方法來獲取專案下所有Jar包的spring.factories檔案裡的配置類,然後排除掉exclude屬性設定的類