手書きのカスタム スプリングブート スターター、フレームワークの魅力と原理を感じる

I.はじめに

Springbootの自動構成原理は面接でよく聞かれるのですが、読んでも覚えられないので、手書きでスターターを書いたほうが記憶が深まります。
読んでみると、スターターのほとんどがこの原則に基づいており、思い出に残る練習になることがわかりました。
核となるアイデア: 约定大于配置

2. スタータ起動原理の予備検討

公式ウェブサイトがどのようにデザインされているかを見てみましょうstarter。次のようなものを書くだけです。

Ctrlクリックして内部<artifactId>spring-boot-starter-web</artifactId>pom に入ると、

<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>スターターの内部 POM を入力します。
このパッケージの依存関係が後で行うことであることがわかりました。

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

ここに画像の説明を挿入

これで 2 つのプロジェクトを作成できるようになりました。

  • スプリングブートスターター (スターター)
  • spring-boot-starter-autoconfigure (自動構成パッケージ)

編集者は公式が書いたリマインダーを見ました、公式ウェブサイトに従って名前を付けることができます、編集者に学ぶ必要はありません!

ランチャーに適切な名前空間を必ず指定する必要があります。別の Maven groupId を使用する場合でも、モジュール名 spring-boot を . で始めないでください。将来的には、自動構成コンテンツに対する正式なサポートを提供する可能性があります。
経験則として、複合モジュールにはイネーブラーにちなんで名前を付ける必要があります。たとえば、「acme」のスターターを作成し、自動構成モジュールに acme-spring-boot 、スターターに acme-spring-boot-starter という名前を付けたとします。2 つを組み合わせたモジュールが 1 つだけの場合は、acme-spring-boot-starter という名前を付けます。

3. プロジェクトの構築

1. 新しい空のプロジェクトを作成します

ここに画像の説明を挿入
プロジェクト全体の名前を入力し
ここに画像の説明を挿入
、空のプロジェクトに 2 つの新しいプロジェクトを作成します (ここで個別に作成できます)。ここでのエディターは Raytheon と同じなので、個別のプロジェクトは作成しません。

ここに画像の説明を挿入

2. 新しい Maven プロジェクトを作成する

ここに画像の説明を挿入
パッケージ名と名前:

ここに画像の説明を挿入

3. 新しい Springboot プロジェクトを作成する

ここに画像の説明を挿入

4. プロジェクトの構造

ここで不要なものはすべて削除してください。削除できません
ここに画像の説明を挿入

4. 構成

1. スターター プロジェクトに独自の自動構成の依存関係を導入します。

上記のプロジェクトをビルドする設定です

<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>

不要なものを削除するか、残りは次のようになります。

ここに画像の説明を挿入

5、自動構成プロジェクトを作成します

1.Beanを設定する

まず自動起動クラスを削除します。これは必要ありません。次に、プロジェクト
内に新しい Beanspring-boot-autoconfigureを作成します。現時点では、この 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 自動設定のソースコードの大部分は設定ファイルに記述されており、その他は冒頭に従って取得できます属性和值


/**
 * @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 {
	
	
	/**
	 * 把刚刚写的服务,加入到容器中
	 */
    @Bean
    public HelloService helloService (){
    	
        return new HelloService();
    }
}

主なことは、コンテナに追加するかどうかをcondition完了するためにいくつかの注釈を追加することです。 一般的に使用されるのは次のとおりです。bean

  • @ConditionalOnClass
  • @ConditionalOnMissingClass
  • @ConditionalOnBean
  • @ConditionalOnMissingBean
  • @ConditionalOnProperty
    ここに画像の説明を挿入

4. 新しい春の工場

ソース コードの自動構成はこのファイルを取得してロードすることになっていることがわかります。そのため、これを模倣して新しいファイルを作成し、スキャンしてコンテナーに追加できるようにします。

ここに画像の説明を挿入

springboot2.7以降の場合:
フォルダ名:META-INF.spring
ファイル名:org.springframework.boot.autoconfigure.AutoConfiguration.imports

ここに画像の説明を挿入
完全なクラス名を書き込むだけです。

5.パック

最初にspring-boot-autoconfigureそれをローカル ライブラリにパッケージ化し、次にパッケージ化しますspring-boot-starter。順序はそこにある必要があります。そうしないと、前のパッケージが見つかりません。

ここに画像の説明を挿入

6. テスト

私たちは新しいプロジェクトをテストしていますが、新しいプロジェクトのエディターはそれをビルドするように指示しません。

1. スターターの依存関係をインポートします

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

2. 設定ファイルの追加

wang:
 name:
  prefix: hello
  suffix: 886

ここに画像の説明を挿入

3. 新しいコントローラー テスト クラスを作成する

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

    @Autowired
    private HelloService helloService;

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

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

4. テストアクセス

訪問には成功しましたが、中国語が文字化けしてしまい解決策が見つかりません。分かる方はメッセージを残してお知らせください。
メインの工程をクリアすれば、自動設定の魅力がゆっくりと理解できます!
全体的なプロセスは次のようになります。

スターターの導入 --- xxxAutoConfiguration --- コンテナにコンポーネントを配置 ---- xxxProperties ---- 構成アイテムをバインドします

ここに画像の説明を挿入
中国語が文字化けしています。おそらくサーブレットがありません。理解できましたら、メッセージを残して解決策を教えてください。ありがとうございます。

ここに画像の説明を挿入

7. まとめ

一度見たら一度やったら損する!誰もが自分自身の練習をしなければなりません、高望みしすぎないでください、そうすれば何かを得ることができます、それはただそれだけです约定大于配置+SPI发现机制
ソースコードによく登場するアノテーションもいくつかあるので、覚えてから自分でスターターを書くこともできます。

おすすめ

転載: blog.csdn.net/weixin_47367099/article/details/127458597