成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

手寫自定義Springboot-Starter,感受框架的魅力和原理

開發(fā) 架構(gòu)
Springboot的自動配置原理,面試中經(jīng)常問到,一直看也記不住,不如手寫一個starter,加深一下記憶。

一、前言

Springboot的自動配置原理,面試中經(jīng)常問到,一直看也記不住,不如手寫一個starter,加深一下記憶。
看了之后發(fā)現(xiàn)大部分的starter都是這個原理,實踐才會記憶深刻。核心思想:約定大于配置。

二、初探starter啟動原理

我們直接看看官網(wǎng)的starter是怎么設(shè)計的,仿照這寫一個就行了!

我們Ctrl點擊<artifactId>spring-boot-starter-web</artifactId>,進入內(nèi)部pom,我們發(fā)現(xiàn)里面有個。

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>2.5.3</version>
<scope>compile</scope>
</dependency>

在此Ctrl點擊<artifactId>spring-boot-starter</artifactId>進入starter內(nèi)部pom:

我們發(fā)現(xiàn)之后干活的就是這個包依賴:

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
<version>2.5.3</version>
<scope>compile</scope>
</dependency>

圖片

我們現(xiàn)在創(chuàng)建兩個項目即可:

  • spring-boot-starter(啟動器)。
  • spring-boot-starter-autoconfigure(自動配置包)。

小編看到官方這么寫的提醒,大家可以按照官網(wǎng)的進行起名稱,不要學(xué)小編哈!!

您應(yīng)該確保為您的啟動器提供適當(dāng)?shù)拿臻g。不要以 . 開頭的模塊名稱spring-boot,即使您使用不同的 Maven groupId。我們將來可能會為您自動配置的內(nèi)容提供官方支持。
根據(jù)經(jīng)驗,您應(yīng)該在啟動器之后命名組合模塊。例如,假設(shè)您正在為“acme”創(chuàng)建一個啟動器,并且您命名自動配置模塊acme-spring-boot和啟動器acme-spring-boot-starter。如果您只有一個模塊將兩者結(jié)合起來,請將其命名為acme-spring-boot-starter。

三、項目搭建

1、新建空白項目

圖片

輸入總的項目名稱:

圖片

在空白項目里新建兩個,這里可以分開單獨建立,這里小編跟著雷神一樣了,就不單獨建立項目了?。?/span>

圖片

2、新建maven項目

圖片

包名和名稱:

圖片

3、新建springboot項目

圖片

4、項目架構(gòu)

這里把沒有用的都刪除了!!可以不刪

圖片

四、配置

1、在starter項目中引入自己的autoconfigure依賴

就是上面建立項目的設(shè)置的。

<dependencies>
<dependency>
<groupId>com.wang</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>

圖片

2、spring-boot-autoconfigure pom配置

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

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>${spring-boot.version}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
</dependency>
</dependencies>

還是把沒用的東西刪除了,剩余如下圖:

圖片

五、編寫autoconfigure項目

1、配置一個bean

首先刪除了自動啟動類,咱們用不到,在spring-boot-autoconfigure項目中新建一個bean,此時不需要讓這個bean在容器中,我們寫一個自己配置,讓他自動加入到容器中。
這就是自動配置的思想。

/**
* 這里不需要讓在容器中,我們寫一個自己配置,讓他自動加入到容器中
* @author wangzhenjun
* @date 2022/10/14 16:26
*/
public class HelloService {

@Autowired
private MyProperties myProperties;

public String HelloWord (String username){
return myProperties.getPrefix() + username + myProperties.getSuffix();
}
}

2、編寫一個配置文件

這里為了獲取配置文件中的屬性值,springboot自動配置源碼里大部分都是,這樣實現(xiàn)在一個配置文件中書寫,其他的可以按照開頭獲取到屬性和值??!

/**
* @author wangzhenjun
* @date 2022/10/14 16:28
*/
@Data
@ConfigurationProperties("wang.name")
public class MyProperties {

private String prefix;
private String suffix;
}

3、編寫自動配置

import com.wang.springbootautoconfigure.properties.MyProperties;
import com.wang.springbootautoconfigure.service.HelloService;
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;

/**
* @author wangzhenjun
* @date 2022/10/14 16:33
*/
@Configuration
//沒有這個bean的時候才會生效
@ConditionalOnMissingBean(HelloService.class)
// 加載配置文件,讓它成為容器中的bean
@EnableConfigurationProperties(MyProperties.class)
public class ServiceAutoConfiguration {


/**
* 把剛剛寫的服務(wù),加入到容器中
*/
@Bean
public HelloService helloService (){

return new HelloService();
}
}

主要就是condition下的幾個注解,來完成bean是否加入到容器中:
常用的:

  • @ConditionalOnClass
  • @ConditionalOnMissingClass
  • @ConditionalOnBean
  • @ConditionalOnMissingBean
  • @ConditionalOnProperty

圖片

4、新建spring.factories

我們看到源碼里自動配置,就是從這個文件獲取加載,所以我們模仿這新建一個,這樣就可以掃描加入容器中??!

圖片

如果是springboot2.7以上就是:

文件夾名稱:META-INF.spring文件名稱:org.springframework.boot.autoconfigure.AutoConfiguration.imports。

圖片

里面直接寫全類名即可!

5、打包

先把spring-boot-autoconfigure打包到本地庫,在打包spring-boot-starter,順序一定要有,不然找不到前者的包??!

圖片

六、測試

我們那一個新項目進行測試,新項目小編就不帶大家建了!

1、導(dǎo)入咱們的starter依賴

<dependency>
<groupId>com.wang</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>

2、添加配置文件

wang:
name:
prefix: hello
suffix: 886

圖片

3、新建controller測試類

@RestController
@RequestMapping("/test")
public class TestController {

@Autowired
private HelloService helloService;

@GetMapping("/starter")
public String starter(){

return helloService.HelloWord("tom");
}
}

4、測試訪問

成功訪問,不過中文是有亂碼的,小編找不到解決方法,有懂的還請留言告知??!
主流程通了就行,慢慢理解了自動配置的魅力!
總流程應(yīng)該就是這樣的:

引入starter --- xxxAutoConfiguration --- 容器中放入組件 ---- 綁定xxxProperties ---- 配置項。

圖片

中文是亂碼,可能是servlet沒有吧,有懂的可以留言告訴小編方案,謝謝大家??!

圖片

七、總結(jié)

一看會就,一動手就廢!大家還是要做自己實操,不要眼高手低,這樣才會有收獲,根本就是約定大于配置+SPI發(fā)現(xiàn)機制!
還有就是一些經(jīng)常出現(xiàn)在源碼里的注解,大家記住就可以自己寫starter了!

責(zé)任編輯:姜華 來源: 小王博客基地
相關(guān)推薦

2023-01-03 09:35:34

SpringbootStarter

2021-01-14 19:04:36

框架數(shù)據(jù)庫mybatis

2019-08-08 16:30:23

技術(shù)編程SpringBoot

2022-09-13 09:02:19

SpringBootStarter機制

2009-06-25 14:53:35

自定義UI組件JSF框架

2009-12-17 17:00:32

無線路由linksys

2023-06-06 08:01:18

自定義接口響應(yīng)

2023-10-11 07:57:23

springboot微服務(wù)

2024-11-18 09:18:21

Gin框架驗證器

2009-07-07 14:32:47

JDK日志Formatter

2023-07-03 08:29:11

BannerSpringBoot

2020-05-21 18:52:06

PHP框架CodeigniterWeb開發(fā)

2022-09-23 07:33:04

Springzookeeper配置

2015-02-12 15:33:43

微信SDK

2023-11-01 08:01:04

SpringWeb容器

2015-01-14 15:06:48

定義相機

2021-12-30 12:30:01

Java注解編譯器

2009-07-07 14:00:25

JDK日志Handler

2018-03-16 08:41:16

Oracle存儲函數(shù)

2015-02-12 15:38:26

微信SDK
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 国产精品一区2区 | 亚洲综合99 | 日韩电影中文字幕 | 不用播放器看的av | 国产日韩精品一区 | 国产一级片一区二区三区 | 国产在线区 | 亚洲欧美一区在线 | 国产精品久久久久一区二区三区 | 国产精品高潮呻吟久久 | 国产情侣啪啪 | 在线国产一区 | 欧美 日韩 国产 一区 | 亚洲成人一二三 | 欧美日韩18 | 天天干狠狠操 | 欧美性久久 | 成人黄色在线视频 | 日韩一区和二区 | 亚洲一级二级三级 | 国产综合精品 | 精品亚洲一区二区 | 欧美日本一区 | 欧美精品在线看 | 视频一区二区三区四区五区 | 欧美二区乱c黑人 | 亚洲精品91| 搞黄网站在线观看 | 亚洲精品免费在线 | 久久久www成人免费无遮挡大片 | 中文字幕二区 | 亚洲精品www久久久久久广东 | 亚洲精品在线看 | 亚洲精品www久久久久久广东 | 欧美日韩成人 | 午夜影院在线 | 亚洲国产成人在线视频 | 日日骚视频| 精品国产乱码久久久久久88av | 久久机热| 中文字幕不卡视频在线观看 |