SpringBoot3 自動構成プロセス SPI メカニズム コア アノテーション カスタム スターター

1. 自動構成プロセス

  1. 輸入starter
  2. 依存関係のインポートautoconfigure
  3. クラスパス内のMETA-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.importsファイルを検索する
  4. 開始、すべてロード自动配置类 xxxAutoConfiguration
    1. コンテナ内で関数を設定する组件
    2. 组件参数にバインドされています属性类xxxProperties
    3. 属性类配置文件プレフィックス項目とバインドする
    4. @Contionalコンポーネントが有効かどうかを判断するための派生条件付きアノテーション

すべてのシナリオは自動的に構成され、直接使用できます。構成ファイルを変更すると、基礎となるパラメーターが変更されます。たとえば、構成を変更すると、yamlTomcatserver.portの実行ポートを変更でき、SpringBoot によって構成されたコンポーネントがいつでも使用できるようになります。

2. SPIの仕組み

  • Java の SPI ( Service Provider Interface) は 、アプリケーション内のコンポーネントを動的に検出してロードするためのソフトウェア設計パターンですSPI の考え方は、インターフェイスまたは抽象クラスを定義し、そのインターフェイスを実装するクラスをクラスパスに定義することでコンポーネントの動的な検出と読み込みを実現することです。
    SPI の主な目的は、アプリケーションでプラグイン可能なコンポーネントを使用する際の問題を解決することです。たとえば、アプリケーションでは別のログ フレームワークやデータベース接続プールを使用する必要がある場合がありますが、これらのコンポーネントの選択は実行時の条件に依存する場合があります。SPI を使用すると、アプリケーションは、コード内でこれらのコンポーネントの実装クラスをハードコーディングすることなく、実行時に適切なコンポーネントを検出してロードできます。
    Java では、SPI は、サービス インターフェイスの完全修飾名を持つファイルを META-INF/services ディレクトリに作成することによって実装されます。このファイルには、サービス インターフェイスを実装するクラスの完全修飾名が含まれています。アプリケーションが起動すると、Java の SPI メカニズムがクラスパス内のこれらのファイルを自動的にスキャンし、ファイルで指定されたクラス名に従って実装クラスをロードします。
    SPI を使用すると、アプリケーションはより柔軟でスケーラブルなアーキテクチャを実現できると同時に、ハードコーディングされた依存関係を回避し、コードの保守性を高めることができます。

SpringBoot では、ファイルの場所は次のとおりです。META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports

シーン: チャットボットのシーンを抽出し、挨拶することができます
効果: これにインポートされたプロジェクトにはstarter挨拶の機能があり、挨拶に登場する人の名前を構成ファイルで変更する必要があります

  1. カスタム スターター プロジェクトを作成し、spring-boot-starter の基本的な依存関係を導入する
  2. モジュール関数を作成し、モジュールの必要な依存関係をすべてインポートします。
  3. xxxAutoConfiguration他のプロジェクトがこのモジュールに必要なすべてのコンポーネントをインポートできるようにする自動構成クラスを作成します。
  4. META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports起動時にロードする必要がある自動構成を指定する構成ファイルを作成します。
  5. 他のプロジェクトをインポートして使用することができます

3. @EnableXxxx 機能スイッチ

自動構成。プロジェクトの開始時に、SPI ファイルで指定されたすべてのクラスがロードされます。@EnableXxxxどの機能をオンにするかを手動で制御する; 手動インポートすべては、@Importこの機能に使用されるコンポーネントをインポートするために使用されます。

4. SpringBoot コアのアノテーション

1.@SpringBootApplication

@SpringBootConfiguration

つまり、@Configurationコンテナ内のコンポーネント、構成クラスです。Spring IOC が開始されると、このクラス オブジェクトがロードされて作成されます。

@EnableAutoConfiguration: 自動構成をオンにする

自動構成をオンにする

@AutoConfigurationPackage:メインパッケージをスキャン :独自のコンポーネントをロード

  • @Import(AutoConfigurationPackages.Registrar.class)コンポーネントをコンテナにインポートしたいと考えています。
  • メイン プログラムが配置されているパッケージのすべてのコンポーネントをインポートします。

@Import(AutoConfigurationImportSelector.class): すべての自動構成クラスをロードします: スターターによってインポートされたコンポーネントをロードします

org.springframework.boot.autoconfigure.AutoConfigurationImportSelector:

protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
    
    
		List<String> configurations = ImportCandidates.load(AutoConfiguration.class, getBeanClassLoader())
			.getCandidates();
		Assert.notEmpty(configurations,
				"No auto configuration classes found in "
						+ "META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports. If you "
						+ "are using a custom packaging, make sure that file is correct.");
		return configurations;
	}

SPI ファイルをスキャンします。META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports

@ComponentScan

コンポーネントのスキャン: 一部のコンポーネント (除外されないコンポーネント) は、
以前にスキャンされた構成クラスと自動構成クラスを除外します。

@ComponentScan(excludeFilters = {
    
     @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
      @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })

2. ブートローディングプロセスを完了する

ここに画像の説明を挿入

5.カスタムスターター

1. ロボット ブート スターター モジュールを作成します。

このモジュールはパブリックチャット ロボット モジュールです。つまり、多くのプロジェクト モジュールがこれをインポートする必要があります。

依存関係を導入する

<parent>
    <artifactId>spring-boot-starter-parent</artifactId>
    <groupId>org.springframework.boot</groupId>
    <version>3.0.5</version>
</parent>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.10</version>
        <scope>provided</scope>
    </dependency>
    <!--        导入配置处理器,配置文件自定义的properties配置都会有提示-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-configuration-processor</artifactId>
        <optional>true</optional>
    </dependency>
</dependencies>

カスタム構成のヒントがあります。次の依存関係をインポートしてプロジェクトを再起動し、構成ファイルを書き込むと、プロンプトが表示されます。

@ConfigurationProperties(prefix = "robot", ignoreInvalidFields = true)  //此属性类和配置文件指定前缀绑定
@Component
@Data
public class RobotProperties {
    
    
    private String name;
}
<!--        导入配置处理器,配置文件自定义的properties配置都会有提示-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <optional>true</optional>
</dependency>
@Service
public class RobotService {
    
    

    @Autowired
    private RobotProperties robotProperties;

    public String hello(){
    
    
        return "你好," + robotProperties.getName();
    }
}

2. spring-user モジュールを作成する

チャットボット モジュールをインポートする ( robot-boot-starter)

<dependency>
    <groupId>org.robot</groupId>
    <artifactId>robot-boot-starter</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>
@RequestMapping(value = "/user")
@RestController
public class UserController {
    
    

    //这个组件是在robot-boot-starter模块中定义的
    @Autowired
    private RobotController robotController;

    public String robot(){
    
    
        return robotController.hello();
    }
}

yml設定

robot:
  name: chatgpt

6. ビジネスモジュール内のパブリックモジュールへのコンポーネント登録を実現する方法

方法1(指定荷物スキャン)

デフォルトでは、Spring はスタートアップクラスディレクトリの下のコンポーネントとサブパッケージのみをスキャンするため、ここでスキャンrobot-boot-starterパッケージを指定する必要があります

@ComponentScan(value = {
    
    "org.robot"}) //扫描机器人模块下的组件
@SpringBootApplication
public class UserApplication {
    
    

    public static void main(String[] args) {
    
    
        SpringApplication.run(UserApplication.class, args);
    }
}

方法 2 (XxxAutoConfiguration)

モジュールにrobot-boot-starter1 つ記述しRobotAutoConfiguration、このシーンに必要なすべてのコンポーネントをコンテナにインポートします

@Import({
    
    RobotController.class, RobotProperties.class, RobotService.class})
public class RobotAutoConfiguration {
    
    
}

spring-userモジュール内でインポートしますRobotAutoConfiguration.class

@Import(RobotAutoConfiguration.class)
@SpringBootApplication
public class UserApplication {
    
    

    public static void main(String[] args) {
    
    
        SpringApplication.run(UserApplication.class, args);
    }
}

方法 3 (@EnableXxx)

この仕組みを利用すると@EnableXxx、このアノテーションを使用する限り、この機能が有効になります

モジュール内のrobot-boot-starterカスタム@EnableRobotアノテーション

@Retention(RetentionPolicy.RUNTIME)
@Target({
    
    ElementType.TYPE})
@Documented
//以上元注解直接找个@EnableXxx类 拷贝进来即可
@Import(RobotAutoConfiguration.class)
public @interface EnableRobot {
    
    

}

spring-userモジュールでアノテーションを有効にします。これは、RobotAutoConfiguration.classインポートされたコンポーネントをインポートするのと同じです。

@EnableRobot
@SpringBootApplication
public class UserApplication {
    
    

    public static void main(String[] args) {
    
    
        SpringApplication.run(UserApplication.class, args);
    }
}

その他の導入にはイネーブル機能starterを使用する必要があり、柔軟な構成が可能@EnableRobot

方法 4 (完全自動構成)

  • SpringBoot の SPI メカニズムに依存する
  • META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports自動構成クラスの完全なクラス名をファイルに書き込むだけです。
  • プロジェクトが開始され、自動構成クラスが自動的にロードされます。

robot-boot-starterクラスパスの下に新しいものを作成しMETA-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports、その中にスキャンするように指定された構成クラスを置きます

org.robot.config.RobotAutoConfiguration

このようにして、他のプロジェクトがモジュールをインポートしている限りrobot-boot-starter、内部のコンポーネントは自動的に挿入されます。

おすすめ

転載: blog.csdn.net/weixin_43847283/article/details/131876708