そのSpringbootスターターを調製する方法Springbootシリーズ(XV)

1.はじめに

Springboot自動設定は、便利である私たちに、開発の複雑さを軽減し、自動的にそれが何であるかを原則として設定しますか?私はまた、分析記事を書いた前に。
Springbootシリーズ(3)春ブーツが自動的に設定しますあなたは一般的な設定ファイルを使用することを知っていない場合は、バインディングの構成ファイルで使用される自動設定するので、あなたはこの記事を参照することができます。Springbootシリーズ(2)春のブートコンフィギュレーションファイル


このとき、学習することによってSpringboot、独自のを書いて、自動コンフィギュレーションモードをstarter、自動構成の理解を深めます。

おなじみのパターンの製造の改善に役立つstarter、あなた自身の書き込み、規範をstarter学習する前に最初のSpringboot公式のstarter、共通の統合フレームワークstarterのように書かれたと、あなたは謎を理解することができます。

2. Springboot公式モード

ここでは一般的な構成のポート番号の設定の選択に、公式の自動設定の分析を選択します。

2.1依存性の導入

ポート番号を使用する前に、我々はウェブ依存を導入する必要があります。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

あなたが見ればstarter多くのものは、おそらくあなたは髪を発見したモデルをSpringboot正式なstarter名前がされているspring-boot-starter-xxxx命名します。

ビューがspring-boot-starter-webあります、実際には、他に頼るだけでなく、ちょうど空のボックスに依存しているpomコードの単一の行がないよりも。

春・ブート・スターター・ウェブ

この時点で、我々は他の見つかったパターンをstarterのみ他に依存しているpom、いないコード。

だから、spring-boot-starter-web最後にそれがどのような内容に依存しますか?

春・ブート・スタータウェブ依存

依存情報を観察し、そして、他の公式の参照starter、いくつかの固定された導入を見つけることができ、参照することができるパターン導入依存性。

  1. 依存性spring-boot-starter
  2. 依存性spring-boot-autoconfigure

2.2自動設定

これだけのように、ポート番号を設定頼る紹介。

server.port=8090

クリックして中IDEA server.portクラスが結合したコンフィギュレーション・ファイルを見つけること。あなたは、コンフィギュレーションは、最終的にクラスに注入されます見ることができますServerPropertiesクラスportプロパティに。

サーバー構成プロパティ

まあ、これはServerProperties最終的にそれを使用するためにどこにあるのでしょうか?検索を続行し、見つかったServlet通話関連します。

getPortコール

それは、あることが判明したServletWebServerFactoryCustomizerクラスを定義すると呼ばれていたクラス、

private final ServerProperties serverProperties;

プロパティを使用するように設定。
このクラスの唯一の1つのクラスを見つけ、コールのこのタイプを見続ける、このクラスがありますServletWebServerFactoryAutoConfiguration

ServletWebServerFactoryAutoConfiguration类

注釈の我々の理解によると、このクラスは、自動設定のメインクラスです。クラスが自動的に設定されていますがAutoConfiguration、エンド。

このクラス手段のいくつかのノートを見てください。

  1. より高い優先度レベル。
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE)
  1. 中にのみServletRequest存在してたときに、Webアプリケーションのクラスに有効です。
@ConditionalOnClass(ServletRequest.class)
@ConditionalOnWebApplication(type = Type.SERVLET)
  1. それが開きServerProperties、構成バインディングを。
@EnableConfigurationProperties(ServerProperties.class)
  1. いくつかのクラスをご紹介します。
@Import({ ServletWebServerFactoryAutoConfiguration.BeanPostProcessorsRegistrar.class,
        ServletWebServerFactoryConfiguration.EmbeddedTomcat.class,
        ServletWebServerFactoryConfiguration.EmbeddedJetty.class,
        ServletWebServerFactoryConfiguration.EmbeddedUndertow.class })

通話の残りのための工場への注入構成ながら、豆。

@Bean
public ServletWebServerFactoryCustomizer servletWebServerFactoryCustomizer(ServerProperties serverProperties) {
    return new ServletWebServerFactoryCustomizer(serverProperties);
}

自動コンフィギュレーションは、ちょうどこれらの事を行いますか?分析の前回の記事によると、私たちはコードよりも多くを知っている、少なくとも指定された自動コンフィギュレーションクラスコンフィギュレーションファイルが読み取られます。つまりspring.factories、ファイル。

spring.factories

あなたがわからない場合、あなたはこの記事を見ることができます。Springbootシリーズ(3)春ブーツが自動的に設定します
実際の場合は、次のことができspring.factories、クラスの先頭にトラックを見つけます。
それはありますServletWebServerFactoryAutoConfiguration

上記の分析によると、我々は見つけることができるSpringboot公式のstarterいくつかのモードを

  1. 使用するXXXProperties自動バインディングXXXなど、最初に設定情報を:ServerProperties
  2. XXXProperties:として、使用するクラス定義ServletWebServerFactoryCustomizer
  3. 調製はXXXAutoConfiguration、開いてXXXProperties、自動設定を有効にするためにシーンを定義するに必要なクラスを作成Bean植物を。このようなServletWebServerFactoryAutoConfigurationとして:

3.サードパーティの統合モード

Springboot公式のフレームワークの全てが書き込まれている場合starter、それは非現実的です。だから、多くのサードパーティ製のフレームワークは、イニシアチブに統合する必要があるspringbootので、我々はその分析のための共通のフレームワークを選んだstarterの実装。見てきたようにspringboot、公式starter設定されているか、サードパーティ製のフレームワークは似ているので、プロセスが明示的に同じポイント、詳細な比較を比較していないと述べた後に観察されます。

ここで選択したmybatis-spring-boot-starter分析を学ぶために。

3.1は、依存を紹介します

<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>1.3.2</version>
</dependency>

ここでmybatisフレームstarter依存性は、特定のに適合したルール、即ち、XXX-春ブートスターター

この観察はstarter、それが達成するためにコードのいずれかを実行していないことが判明し、これはspringboot正式合意。

MyBatisのスプリング・ブートスターター

ビューmybatis-spring-boot-starterの依存性は、多くがある、と自動構成はイエス主に関連します。

<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-autoconfigure</artifactId>
</dependency>

3.2自動設定

表示mybatis-spring-boot-autoconfigureコンテンツの発見とspringbootの正式なautoconfigure構造は同じです。

MyBatisのスプリング・ブート自動構成

mybatisまた、自動構成を介してspring.factories自動設定を指示し、その後によってXxxAutoConfiguration結合XxxProperties自動設定します。

MybatisAutoConfiguration

原則として、トップspringboot公式はstarter同じなので、あまり導入いたしません。

4.独自のスターターを書きます

上記した説明では、我々は大体自分自身の書き込みを描くことができ、そんなに、そして最後にリンクの実際の運用に言っstarter手順を。

  1. 名前を作成xxx-spring-boot-starterスタータープロジェクトを。
  2. 名前を作成xxx-spring-boot-autoconfigureプロジェクトを。
    • バインディング・クラス属性書きますxxxProperties
    • サービスクラスを書き、紹介xxxProperties
    • 自動コンフィギュレーションクラス書くXXXAutoConfiguration注入の設定を。
    • 作成しspring.factories、自動的に設定するクラスを指定したファイルを。
  3. スタータープロジェクトは、導入するための空のプロジェクトであるxxx-spring-boot-autoconfigure他の依存関係を。
  4. プロジェクト導入starter、設定情報を設定する必要があります。

4.1スタータープロジェクトの作成

スタートコードを実装する必要はありませんので、あなただけの他のプロジェクトに依存する必要があるので、直接空のMavenプロジェクトを作成します。しかし、名前が標準化されなければなりません。
ここで作成したstartermyapp-spring-boot-starter

myappのスプリング・ブートスターター

POMファイルには、私たちが作成する次を導入する必要があり、非常に簡単ですmyapp-spring-boot-autoconfigure

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>net.codingme.starter</groupId>
    <artifactId>myapp-spring-boot-starter</artifactId>
    <version>1.0-SNAPSHOT</version>
    <!-- 启动器 -->
    <dependencies>
        <!--  引入自动配置项目 -->
        <dependency>
            <groupId>net.codingme.starter</groupId>
            <artifactId>myapp-spring-boot-autoconfigure</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
    </dependencies>
</project>

4.2自動設定項目を作成します

顔と合わせてstarter分析、即時の名前作成するmyapp-spring-boot-autoconfigureプロジェクトです。プロジェクトにのみ導入されたspringboot親プロジェクトをとspring-boot-starter

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.0.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>net.codingme.starter</groupId>
    <artifactId>myapp-spring-boot-autoconfigure</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>myapp-spring-boot-autoconfigure</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
    </dependencies>
</project>

プロジェクトの図の全体的な構造。

myappのスプリング・ブート・スタータ自動構成

HelloPropertiesすることにより、注釈@ConfigurationProperties(prefix = "myapp.hello")メイククラス属性とmyapp.helloバインドの先頭に設定。

/**
 * <p>
 *
 * @Author niujinpeng
 * @Date 2019/10/29 23:51
 */
@ConfigurationProperties(prefix = "myapp.hello")
public class HelloProperties {

    private String suffix;

    public String getSuffix() {
        return suffix;
    }

    public void setSuffix(String suffix) {
        this.suffix = suffix;
    }
}

次いで、使用方法自動バインディング値。HelloServicesayHelloHelloProperties

public class HelloService {
    HelloProperties helloProperties;
    
    public String sayHello(String name) {
        return "Hello " + name + "," + helloProperties.getSuffix();
    }
    
    public HelloProperties getHelloProperties() {
        return helloProperties;
    }

    public void setHelloProperties(HelloProperties helloProperties) {
        this.helloProperties = helloProperties;
    }
}

ためにするためにHelloService自動的に注入されると、正常に使用することができますHelloPropertiesので、我々は
HelloServiceAutoConfiguration、クラスを入れてHelloProperties.class導入し、その後HelloServiceに注入Bean

/**
 * web应用才生效
 */
@ConditionalOnWebApplication
/**
 * 让属性文件生效
 */
@EnableConfigurationProperties(HelloProperties.class)
/***
 * 声明是一个配置类
 */
@Configuration
public class HelloServiceAutoConfiguration {

    @Autowired
    private HelloProperties helloProperties;

    @Bean
    public HelloService helloService() {
        HelloService helloService = new HelloService();
        helloService.setHelloProperties(helloProperties);
        return helloService;
    }
}

最後に、spring.factoriesあなただけが、クラスを自動的に設定することができますを指定する必要があります。

# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
net.codingme.starter.HelloServiceAutoConfiguration

ここでは、自動的に設定するプロジェクトは完了です。あなたはできるmyapp-spring-boot-autoconfigure実行を投影しmvn install、自動的にローカルの倉庫にプロジェクトパッケージを設定するには、その後、同じコマンドを使用してmyapp-spring-boot-starter倉庫にインストールします。後者が前者のプロジェクトに依存しているため、ので、ここで前者は高度が必要ですmvn install

4.3カスタムランチャーを使用して

作成しspringbootたプロジェクトをmyapp-spring-boot-starter-test

myappのスプリング・ブート・スターターテスト

導入web依存性は、彼らが導入を書かれていますmyapp-spring-boot-starter

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

<!-- 引入自己的 starter -->
<dependency>
    <groupId>net.codingme.starter</groupId>
    <artifactId>myapp-spring-boot-starter</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>

ライトHelloController自動設定で注入HelloServiceテストのために。

@RestController
public class HelloController {

    @Autowired
    HelloService helloService;

    @GetMapping("/hello")
    public String sayHello(String name) {
        return helloService.sayHello(name);
    }
}

以来autoConfigureプロジェクトで定義されたsayHelloメソッドが出力に「Hello」+名+、着信設定hello.suffix、私たちは、springboot設定ファイルにこのプロパティを設定します。

myapp.hello.suffix=早上好

自動設定は効果がありません参照するには、名前を渡すために、テストプロジェクト、訪問/ハローパスを実行します。

アクセスのテスト

テスト結果は自動的におはよう参照するように設定することができますから、効果をとっています。私がここに書かれているstarterにも完成されています。

プロジェクトがに広がっているのGithub
Https://github.com/niumoo/springboot/tree/master/springboot-starter

<終了>

著者: のための未読コード
の私のマイクロ手紙:wn8398
プロフィール: www.codingme.net
この記事は、転載することを歓迎ブロガーのオリジナルの記事、である、見かけ上の位置復刻の元のリンクを示しています。
世間の注目リソースへの返事は、コアJavaのインタビュー&仕上げ材料の知識を習得することはできません。

おすすめ

転載: www.cnblogs.com/niumoo/p/11775009.html