1. 自動構成プロセス
- 輸入
starter
- 依存関係のインポート
autoconfigure
- クラスパス内の
META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
ファイルを検索する - 開始、すべてロード
自动配置类
xxxAutoConfiguration
- コンテナ内で関数を設定する
组件
组件参数
にバインドされています属性类
。xxxProperties
属性类
配置文件
プレフィックス項目とバインドする@Contional
コンポーネントが有効かどうかを判断するための派生条件付きアノテーション
- コンテナ内で関数を設定する
すべてのシナリオは自動的に構成され、直接使用できます。構成ファイルを変更すると、基礎となるパラメーターが変更されます。たとえば、構成を変更すると、yaml
Tomcatserver.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
挨拶の機能があり、挨拶に登場する人の名前を構成ファイルで変更する必要があります
- カスタム スターター プロジェクトを作成し、spring-boot-starter の基本的な依存関係を導入する
- モジュール関数を作成し、モジュールの必要な依存関係をすべてインポートします。
xxxAutoConfiguration
他のプロジェクトがこのモジュールに必要なすべてのコンポーネントをインポートできるようにする自動構成クラスを作成します。META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
起動時にロードする必要がある自動構成を指定する構成ファイルを作成します。- 他のプロジェクトをインポートして使用することができます
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-starter
1 つ記述し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
、内部のコンポーネントは自動的に挿入されます。