ホームページ >Java >&#&チュートリアル >SpringBoot自動構成の実装原理は何ですか?

SpringBoot自動構成の実装原理は何ですか?

WBOY
WBOY転載
2023-05-15 15:58:065287ブラウズ

1. springboot 自動構成とは

SpringBoot は、@EnableAutoConfiguration アノテーションを通じて自動構成をオンにし、jar パッケージの下の spring.factories ファイルをスキャンします。このファイルには、自動的に構成できるクラスが含まれています。 @Condition アノテーションで指定された条件が満たされると、依存関係のサポートを使用してインスタンス化され、Spring コンテナーに登録されます。

一般的に、以前に ssm プロジェクトを作成した際には、多数の座標や設定内容を設定する必要があり、プロジェクトの開発では環境を整える作業に多くの時間がかかりました。 SpringBoot はさまざまな XML 構成コンテンツを簡素化するため、SpringBoot の自動構成ではアノテーションを使用して一部の従来の構成のデフォルト構成を作成し、プロジェクトを迅速に実行できるように XML 構成コンテンツを簡素化します。

Springboot コア構成原則:

  • 自動構成クラスは、spring-boot-autoconfigure-versionnumber.jar の下の org.springframework.boot.autoconfigure に保存されます

  • application.properties で debug=true を設定するとコンテナが起動します。サーバーの初期化の初期構成を確認できます。

  • DispatcherServletAutoConfigratioRegister フロントエンド コントローラー

  • EmbeddedServletContainerAutoConfigurationRegister コンテナ タイプ

  • HttpMessageConvertersAutoConfiguration は json または xml プロセッサを登録します

  • JacksonAutoConfiguration は json オブジェクト パーサーを登録します

  • 他の関数への依存関係を追加すると、springBoot も実装しますこれらの関数の自動構成

SpringBoot自動構成の実装原理は何ですか?

#2. スターター コンポーネント

スターター コンポーネントは、アプリケーション アイテムにロードできる Maven の依存関係です。 。対応する依存関係構成を Maven 構成に追加することによってのみ、対応するスターター コンポーネントを使用できます。たとえば、spring-boot-starter-web 依存関係を追加すると、Spring MVC および Tomcat 埋め込みコンテナを含む REST API サービスを構築することができます。

完全なスターター コンポーネントには、次の 2 つの点が含まれます。
  • 自動構成機能を提供する自動構成モジュール
  • 提供するもの依存関係 関係管理ポスト機能のコンポーネント モジュールは、コンポーネントのすべての機能をカプセル化しており、そのまま使用できます。

spring-boot-starter-web はソース コードに依存します

package org.springframework.boot.autoconfigure.web.servlet;
@Configuration
@ConditionalOnClass({ServletRequest.class})
@ConditionalOnWebApplication(
    type = Type.SERVLET
)
@EnableConfigurationProperties({ServerProperties.class})
@Import({ServletWebServerFactoryAutoConfiguration.BeanPostProcessorsRegistrar.class})
public class ServletWebServerFactoryAutoConfiguration {
    ......
}
@

3. 3 つの主要な注釈

@SpringBootConfiguration: Configuration から継承、サポート構成する JavaConfig メソッド。

@EnableAutoConfiguration: この記事では、主に自動構成を有効にするために使用される説明に重点を置いています。

@ComponentScan: コンポーネントを自動的にスキャンします。デフォルトでは、パッケージおよびクラスのサブパッケージの下にある指定されたアノテーションを持つすべてのクラスがスキャンされ、Bean コンテナに自動的にアセンブルされます。アセンブルされるものには、 @Controller 、 @Service 、 @Component 、 @Repository などが含まれます。スキャンパスも指定できます。

4. @EnableAutoConfiguration

このアノテーションは、デフォルト設定を自動的にロードするのに役立ちます。これには、@AutoConfigurationPackage と @Import という 2 つの重要なアノテーションがあります。@Import アノテーションについて詳しく見てみましょう。

@Override
	public String[] selectImports(AnnotationMetadata annotationMetadata) {
		//检查自动配置功能是否开启,默认开启
		if (!isEnabled(annotationMetadata)) {
			return NO_IMPORTS;
		}
		//加载自动配置的元信息
		AutoConfigurationMetadata autoConfigurationMetadata = AutoConfigurationMetadataLoader
				.loadMetadata(this.beanClassLoader);
		AnnotationAttributes attributes = getAttributes(annotationMetadata);
		//获取候选配置类
		List<String> configurations = getCandidateConfigurations(annotationMetadata,
				attributes);
		//去掉重复的配置类
		configurations = removeDuplicates(configurations);
		//获得注解中被exclude和excludeName排除的类的集合
		Set<String> exclusions = getExclusions(annotationMetadata, attributes);
		//检查被排除类是否可实例化、是否被自动注册配置所使用,不符合条件则抛出异常
		checkExcludedClasses(configurations, exclusions);
		//从候选配置类中去除掉被排除的类
		configurations.removeAll(exclusions);
		//过滤
		configurations = filter(configurations, autoConfigurationMetadata);
		//将配置类和排除类通过事件传入到监听器中
		fireAutoConfigurationImportEvents(configurations, exclusions);
		//最终返回符合条件的自动配置类的全限定名数组
		return StringUtils.toStringArray(configurations);

@Import(AutoConfigurationImportSelector.class) アノテーション。ここに AutoConfigurationImportSelector クラスをインポートします。このクラスには非常に重要なメソッド selectImports() があり、候補構成クラスの取得、構成クラスの重複排除、不要な構成クラスの除外、フィルタリングなど、コンポーネントの自動アセンブリのほぼすべての処理ロジックをカバーします。修飾された自動構成クラスの修飾名が返されます。

5. SpringFactoriesLoader

SpringFactoriesLoader クラスは spring-core パッケージで定義されており、META-INF/spring.factories ファイルを取得し、指定された構成を取得する機能を実装します。インターフェース。このクラスには 2 つの外部メソッドが定義されています:
  • loadFactories はインターフェイス クラスに基づいてその実装クラスのインスタンスを取得します。このメソッドはオブジェクトのリストを返します。
  • loadFactoryNames は、インターフェイスに基づいてインターフェイス クラスの名前を取得します。このメソッドはクラス名のリストを返します。

上記 2 つのメソッドの重要な点は、指定された ClassLoader から spring.factories ファイルを取得し、それを解析してクラス名のリストを取得することです。具体的なコードは次のとおりです:

public static List<String> loadFactoryNames(Class<?> factoryClass, ClassLoader classLoader) {
    String factoryClassName = factoryClass.getName();
    try {
        Enumeration<URL> urls = (classLoader != null ? classLoader.getResources(FACTORIES_RESOURCE_LOCATION) :
                ClassLoader.getSystemResources(FACTORIES_RESOURCE_LOCATION));
        List<String> result = new ArrayList<String>();
        while (urls.hasMoreElements()) {
            URL url = urls.nextElement();
            Properties properties = PropertiesLoaderUtils.loadProperties(new UrlResource(url));
            String factoryClassNames = properties.getProperty(factoryClassName);
            result.addAll(Arrays.asList(StringUtils.commaDelimitedListToStringArray(factoryClassNames)));
        }
        return result;
    }
    catch (IOException ex) {
        throw new IllegalArgumentException("Unable to load [" + factoryClass.getName() +
                "] factories from location [" + FACTORIES_RESOURCE_LOCATION + "]", ex);
    }
}

コードから、このメソッドでは、ClassLoader 全体のすべての jar パッケージにある spring.factories ファイルが走査されることがわかります。言い換えれば、他の場所の設定に影響を与えたり、他の人の設定によって上書きされたりすることなく、独自の jar で spring.factories ファイルを設定できます。

spring.factories はプロパティ分析を通じて取得されるため、作成するファイルの内容は次のように構成されます:

com.xxx.interface= com.xxx.classname
###

以上がSpringBoot自動構成の実装原理は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。