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发现机制
!
ソースコードによく登場するアノテーションもいくつかあるので、覚えてから自分でスターターを書くこともできます。