在SpringBoot學(xué)習(xí)的過程中,,每當(dāng)我們需要某個現(xiàn)有框架的功能時,,都是通過引入對應(yīng)的Starter,,然后由SpringBoot幫我們完成自動裝配,。說白了,,Starter就是個外部項目,,就像項目A需要調(diào)用項目B,,除了通過外部調(diào)用方式(比如遠(yuǎn)程調(diào)用),,還可以直接內(nèi)部集成B,直接本地調(diào)用,。只是在SpringBoot項目中,,需要遵循SpringBoot的規(guī)范而已。 Starter命名規(guī)范Spring官方定義的Starter格式: spring-boot-starter-{name} 非官方(自定義)定義的Starter格式: {name}-spring-boot-starter 實(shí)現(xiàn)自定義Starter需求 創(chuàng)建一個Starter,,根據(jù)配置文件配置的name值,,返回"Hello"+name。 創(chuàng)建Starter項目創(chuàng)建一個名為javafamily-spring-boot-starter的SpringBoot項目 1.引入依賴 注意:spring-boot-configuration-processor并非加載xml或者properties配置啥的,,該依賴是為了給自定義的配置類生成元數(shù)據(jù)信息的,,在yml等配置文件中,比如server.port是可以直接點(diǎn)進(jìn)去到配置類中的,如果沒有該依賴,,在配置文件直接書寫是沒有提示的,,但是不影響項目運(yùn)行。 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency>// 為簡化開發(fā)引入 非必須<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency>123456789101112復(fù)制代碼類型:[java] 2.編寫一個JavaFamilyService類 import lombok.AllArgsConstructor;@AllArgsConstructorpublic class JavaFamilyService { private String name; public String family() { return "Hello " + name; } }123456789101112復(fù)制代碼類型:[java] 該類用于處理核心業(yè)務(wù),,這里的name由外部傳入,,family方法返回拼接后的字符串。 3.定義配置屬性封裝類 import lombok.Data;import org.springframework.boot.context.properties.ConfigurationProperties;@Data// 讀取配置文件中以java.family為前綴的配置@ConfigurationProperties(prefix = "java.family")public class JavaFamilyServiceProperties { private String name; }12345678910復(fù)制代碼類型:[java] 4.定義自動配置類 import com.javafamily.service.JavaFamilyService;import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;import org.springframework.boot.context.properties.EnableConfigurationProperties;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import javax.annotation.Resource;@Configuration// 當(dāng)給定的類名在類路徑上存在,,則實(shí)例化當(dāng)前Bean@ConditionalOnClass(JavaFamilyService.class)// 讓使用@ConfigurationProperties注解的類生效,,并且將該類注入到 IOC 容器中@EnableConfigurationProperties(JavaFamilyServiceProperties.class)public class JavaFamilyServiceAutoConfiguration { @Resource private JavaFamilyServiceProperties javaFamilyServiceProperties; @Bean // 被@ConditionalOnMissingBean注解修飾的同類型的Bean只能注冊一個 注冊多個時會報錯 @ConditionalOnMissingBean public JavaFamilyService javaFamilyService() { // 傳入從配置文件加載到的name屬性 return new JavaFamilyService(javaFamilyServiceProperties.getName()); } }123456789101112131415161718192021222324252627復(fù)制代碼類型:[java] 5.創(chuàng)建spring.factories文件 在resources文件夾下創(chuàng)建META-INF文件夾,在META-INF文件夾下創(chuàng)建spring.factories文件,。 org.springframework.boot.autoconfigure.EnableAutoConfiguration= com.javafamily.config.JavaFamilyServiceAutoConfiguration12復(fù)制代碼類型:[java] 這塊內(nèi)容在前面的源碼中講過,,就是通過SPI技術(shù)實(shí)現(xiàn)我們的自動裝配。 整體效果圖如下: 6.引入自定義Starter 創(chuàng)建一個任意的SpringBoot工程,,引入javafamily-spring-boot-starter依賴,。 <dependency> <groupId>com.javafamily</groupId> <artifactId>javafamily-spring-boot-starter</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency>12345復(fù)制代碼類型:[java] 在application.yml添加java.family.name配置,將值設(shè)置為JavaFamily,。 創(chuàng)建HelloController,,注入JavaFamilyService測試效果。 import com.javafamily.service.JavaFamilyService;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RestController;import javax.annotation.Resource;@RestControllerpublic class HelloController { @Resource private JavaFamilyService javaFamilyService; @GetMapping("/test") public String test() { return javaFamilyService.family(); } }12345678910111213141516復(fù)制代碼類型:[java] 訪問localhost:8080/test查看效果,。 至此,,自定義Starter入門就完成了,相信大家看完本篇文章,,對Starter會有更深入的理解,,我們下期再見。 |
|