我自己整理了一套java架構資料,還有大廠面試題,需要私信回復“資料”就好了,無償分享,希望對你有幫助。
背景
使用過Spring Boot的小伙伴都應該知道,一個Spring Boot 項目就是由一個一個 starter 組成的,一個 starter 代表該項目的 Spring Boot 啟動依賴,除了官方已有的 starter,我們可以根據自己的需要自定義新的starter。
我們經常會看到或者使用到各種***-starter。比如下面幾種:
在我們的日常開發工作中,經常會有一些獨立于業務之外的配置模塊,我們經常將其放到一個特定的包下,然后如果另一個工程需要復用這塊功能的時候,需要將代碼硬拷貝到另一個工程,重新集成一遍,麻煩至極。如果我們將這些可獨立于業務代碼之外的功配置模塊封裝成一個個starter,復用的時候只需要將其在pom中引用依賴即可,Spring Boot為我們完成自動裝配,簡直不要太爽。
spring全局變量。比如我們之前做MVC時要引入日志組件,那么需要去找到log4j的版本,然后引入,現在有了Starter之后,直接用這個之后,log4j就自動引入了,也不用關心版本這些問題。
比如我們要在Spring Boot中引入Web MVC的支持時,我們通常會引入這個模塊spring-boot-starter-web,而這個模塊如果解壓包出來會發現里面什么都沒有,只定義了一些POM依賴。
Spring Boot中的starter是一種非常重要的機制,能夠拋棄以前繁雜的配置,將其統一集成進starter,應用者只需要在maven中引入starter依賴,Spring Boot就能自動掃描到要加載的信息并啟動相應的默認配置。starter讓我們擺脫了各種依賴庫的處理,需要配置各種信息的困擾。Spring Boot會自動通過classpath路徑下的類發現需要的Bean,并注冊進IOC容器。Spring Boot提供了針對日常企業應用研發各種場景的spring-boot-starter依賴模塊。所有這些依賴模塊都遵循著約定成俗的默認配置,并允許我們調整這些配置,即遵循“約定大于配置”的理念。
如果想自定義Starter,首選需要實現自動化配置,而要實現自動化配置需要滿足以下兩個條件:
pom.xml依賴
? ?org.springframework.boot? ?spring-boot-autoconfigure? ?2.0.0.RELEASE? ?org.springframework.boot? ?spring-boot-configuration-processor? ?2.0.0.RELEASE? ?true?
根據需要自定義Starter的實現過程大致如下(以我定義的Starter為例):
import java.util.*怎么導入。定義XxxProperties類,屬性配置類,完成屬性配置相關的操作,比如設置屬性前綴,用于在application.properties中配置。
TianProperties代碼:
importorg.springframework.boot.context.properties.ConfigurationProperties;@ConfigurationProperties(prefix?=?"spring.tian")public?class?TianProperties?{? ?// 姓名? ?private?String?name;? ?// 年齡? ?private?int?age;? ?// 性別? ?private?String?sex?=?"M";? ?//get and set}
創建XxxService類,完成相關的操作邏輯 。
TianService代碼:
public?class?TianService?{? ?private?TianProperties?properties;? ?public?TianService() {? }? ?public?TianService(TianProperties?userProperties) {? ? ? ?this.properties?=?userProperties;? }? ?public?void?sayHello(){? ? ? ?System.out.println("hi, 我叫: "?+?properties.getName()?+? ? ? ?", 今年"?+?properties.getAge()?+?"歲"? ? ? ??+?", 性別: "?+?properties.getSex());? }}
定義XxxConfigurationProperties類,自動配置類,用于完成Bean創建等工作。
TianServiceAutoConfiguration代碼:
@Configuration@EnableConfigurationProperties(TianProperties.class)@ConditionalOnClass(TianService.class)@ConditionalOnProperty(prefix?=?"spring.tian",?value?=?"enabled",matchIfMissing?=?true)public?class?TianServiceAutoConfiguration?{? ?@Autowired? ?private?TianProperties?properties;? ?@Bean? ?@ConditionalOnMissingBean(TianService.class)? ?public?TianService?tianService() {? ? ? ?return?new?TianService(properties);? }}
source is null for getproperty?在resources下創建目錄META-INF,在 META-INF 目錄下創建 spring.factories,在SpringBoot啟動時會根據此文件來加載項目的自動化配置類。
spring.factories中配置
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.tian .TianServiceAutoConfiguration
把上面這個starter工程打成jar包
創建一個Spring Boot項目test
在項目中把自定義starter添加pom依賴
? ?com.tian? ?spring-boot-tian-starter? ?1.0-SNAPSHOT
TestApplication啟動類
@SpringBootApplication@EnableEurekaServerpublic?class?TestApplication?{? ?public?static?void?main(String[]?args) {? ? ? ?SpringApplication.run(TestApplication.class,?args);? }}
Springboot、application.properties中配置
spring.tian.name=tianspring.tian.age=22spring.tian.sex=M
寫一個TestController.java類
RestController@RequestMapping("/my")public?class?TestController?{? ?@Resource? ?private?TianService?tianService;? ?@PostMapping("/starter")? ?public?Object?starter() {? ? ? ?tianService.sayHello();? ? ? ?return?"ok";? }}
jar以來進來后,可以看到
多了一個json的文件
最后啟動項目,輸入
http://localhost:9091/my/starter
springboot版本、后臺打印
hi, 我叫: tian, 今年22歲, 性別: M
這就成功的現實了自定義的starter。
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态