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
、いくつかの固定された導入を見つけることができ、参照することができるパターン導入依存性。
- 依存性
spring-boot-starter
。 - 依存性
spring-boot-autoconfigure
。
2.2自動設定
これだけのように、ポート番号を設定頼る紹介。
server.port=8090
クリックして中IDEA server.port
クラスが結合したコンフィギュレーション・ファイルを見つけること。あなたは、コンフィギュレーションは、最終的にクラスに注入されます見ることができますServerProperties
クラスport
プロパティに。
まあ、これはServerProperties
最終的にそれを使用するためにどこにあるのでしょうか?検索を続行し、見つかったServlet
通話関連します。
それは、あることが判明したServletWebServerFactoryCustomizer
クラスを定義すると呼ばれていたクラス、
private final ServerProperties serverProperties;
プロパティを使用するように設定。
このクラスの唯一の1つのクラスを見つけ、コールのこのタイプを見続ける、このクラスがありますServletWebServerFactoryAutoConfiguration
。
注釈の我々の理解によると、このクラスは、自動設定のメインクラスです。クラスが自動的に設定されていますがAutoConfiguration
、エンド。
このクラス手段のいくつかのノートを見てください。
- より高い優先度レベル。
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE)
- 中にのみ
ServletRequest
存在してたときに、Webアプリケーションのクラスに有効です。
@ConditionalOnClass(ServletRequest.class)
@ConditionalOnWebApplication(type = Type.SERVLET)
- それが開き
ServerProperties
、構成バインディングを。
@EnableConfigurationProperties(ServerProperties.class)
- いくつかのクラスをご紹介します。
@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
、ファイル。
あなたがわからない場合、あなたはこの記事を見ることができます。Springbootシリーズ(3)春ブーツが自動的に設定します。
実際の場合は、次のことができspring.factories
、クラスの先頭にトラックを見つけます。
それはありますServletWebServerFactoryAutoConfiguration
。
上記の分析によると、我々は見つけることができるSpringboot
公式のstarter
いくつかのモードを。
- 使用する
XXXProperties
自動バインディングXXX
など、最初に設定情報を:ServerProperties
。 XXXProperties
:として、使用するクラス定義ServletWebServerFactoryCustomizer
。- 調製は
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-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
また、自動構成を介してspring.factories
自動設定を指示し、その後によってXxxAutoConfiguration
結合XxxProperties
自動設定します。
原則として、トップspringboot
公式はstarter
同じなので、あまり導入いたしません。
4.独自のスターターを書きます
上記した説明では、我々は大体自分自身の書き込みを描くことができ、そんなに、そして最後にリンクの実際の運用に言っstarter
手順を。
- 名前を作成
xxx-spring-boot-starter
スタータープロジェクトを。 - 名前を作成
xxx-spring-boot-autoconfigure
プロジェクトを。- バインディング・クラス属性書きます
xxxProperties
。 - サービスクラスを書き、紹介
xxxProperties
。 - 自動コンフィギュレーションクラス書く
XXXAutoConfiguration
注入の設定を。 - 作成し
spring.factories
、自動的に設定するクラスを指定したファイルを。
- バインディング・クラス属性書きます
- スタータープロジェクトは、導入するための空のプロジェクトである
xxx-spring-boot-autoconfigure
他の依存関係を。 - プロジェクト導入
starter
、設定情報を設定する必要があります。
4.1スタータープロジェクトの作成
スタートコードを実装する必要はありませんので、あなただけの他のプロジェクトに依存する必要があるので、直接空のMavenプロジェクトを作成します。しかし、名前が標準化されなければなりません。
ここで作成したstarter
市myapp-spring-boot-starter
。
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>
プロジェクトの図の全体的な構造。
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;
}
}
次いで、使用方法自動バインディング値。HelloService
sayHello
HelloProperties
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
。
導入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のインタビュー&仕上げ材料の知識を習得することはできません。