spring全局變量,spring boot @value取不到值_看看大廠如何自定義starter,還真想不到

 2023-11-18 阅读 30 评论 0

摘要:我自己整理了一套java架構資料,還有大廠面試題,需要私信回復“資料”就好了,無償分享,希望對你有幫助。背景使用過Spring Boot的小伙伴都應該知道,一個Spring Boot 項目就是由一個一個 starter 組成的,一個 starter 代表該項目的 S

我自己整理了一套java架構資料,還有大廠面試題,需要私信回復“資料”就好了,無償分享,希望對你有幫助。

背景

使用過Spring Boot的小伙伴都應該知道,一個Spring Boot 項目就是由一個一個 starter 組成的,一個 starter 代表該項目的 Spring Boot 啟動依賴,除了官方已有的 starter,我們可以根據自己的需要自定義新的starter。

我們經常會看到或者使用到各種***-starter。比如下面幾種:

  1. spring-boot-starter-web:嵌入Tomcat和web開發需要的相關jar包
  2. spring-boot-starter-data-redis:redis數據庫支持
  3. mybatis-spring-boot-starter:第三方的mybatis集成的starter
  4. spring-boot -starter-test:用于測試 Spring 引導應用程序
  5. spring-boot-starter-AOP :這個 starter 用于使用 AspectJ 和 Spring AOP 進行面向方面的編程

starter有何用呢?

在我們的日常開發工作中,經常會有一些獨立于業務之外的配置模塊,我們經常將其放到一個特定的包下,然后如果另一個工程需要復用這塊功能的時候,需要將代碼硬拷貝到另一個工程,重新集成一遍,麻煩至極。如果我們將這些可獨立于業務代碼之外的功配置模塊封裝成一個個starter,復用的時候只需要將其在pom中引用依賴即可,Spring Boot為我們完成自動裝配,簡直不要太爽。

spring全局變量。比如我們之前做MVC時要引入日志組件,那么需要去找到log4j的版本,然后引入,現在有了Starter之后,直接用這個之后,log4j就自動引入了,也不用關心版本這些問題。

比如我們要在Spring Boot中引入Web MVC的支持時,我們通常會引入這個模塊spring-boot-starter-web,而這個模塊如果解壓包出來會發現里面什么都沒有,只定義了一些POM依賴。

Spring Boot starter機制

  Spring Boot中的starter是一種非常重要的機制,能夠拋棄以前繁雜的配置,將其統一集成進starter,應用者只需要在maven中引入starter依賴,Spring Boot就能自動掃描到要加載的信息并啟動相應的默認配置。starter讓我們擺脫了各種依賴庫的處理,需要配置各種信息的困擾。Spring Boot會自動通過classpath路徑下的類發現需要的Bean,并注冊進IOC容器。Spring Boot提供了針對日常企業應用研發各種場景的spring-boot-starter依賴模塊。所有這些依賴模塊都遵循著約定成俗的默認配置,并允許我們調整這些配置,即遵循“約定大于配置”的理念。

自定義starter的條件

如果想自定義Starter,首選需要實現自動化配置,而要實現自動化配置需要滿足以下兩個條件:

  1. 能夠自動配置項目所需要的配置信息,也就是自動加載依賴環境;
  2. 能夠根據項目提供的信息自動生成Bean,并且注冊到Bean管理容器中;

自定義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為例):

430c0da79c1b45788e422b7f1b37b99f

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包

77ed3785529d46ed80bafda14fda116f

項目中使用自定義starter

創建一個Spring Boot項目test

34607b87115b43f896bd4fc5c2ac1c8a

在項目中把自定義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以來進來后,可以看到

76e19c0e01784ffe8598658477ecce4e

多了一個json的文件

fe8be80916d5416b94cdb0af8bc5addd

最后啟動項目,輸入

http://localhost:9091/my/starter

b54b6eeebd45433c9a2b704a3158e7d3

springboot版本、后臺打印

hi, 我叫: tian, 今年22歲, 性別: M

這就成功的現實了自定義的starter。

總結

  1. Spring Boot在啟動時掃描項目所依賴的JAR包,尋找包含spring.factories文件的JAR包,
  2. 然后讀取spring.factories文件獲取配置的自動配置類AutoConfiguration,
  3. 然后將自動配置類下滿足條件(@ConditionalOnXxx)的@Bean放入到Spring容器中(Spring Context)
  4. 這樣使用者就可以直接用來注入,因為該類已經在容器中了

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/2/178779.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息