ホームページ  >  記事  >  Java  >  Java SpringBoot自動アセンブリの原理は何ですか?

Java SpringBoot自動アセンブリの原理は何ですか?

王林
王林転載
2023-04-25 08:16:061081ブラウズ

summary

detail

従来の Spring プロジェクトには多くの構成ファイルが含まれます。たとえば、Redis を使用したい場合は、通常、対応する依存関係のある jar パッケージに加えて、次のものも必要になります。これらを application.xml に追加して、JedisConnectionFactory、JedisPoolConfig、および RedisTemplate を構成します。ただし、SpringBoot を使用する場合、システムは pom.xml 内の jar パッケージに基づいてこれらのクラスを自動的に生成し、IOC コンテナーに挿入します。

従来の Spring プロジェクトでは構成が必要です

<bean id="jedisConnectionFactory" class="...JedisConnectionFactory"></bean>
<bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig"></bean>
<bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate"></bean>

SpringBoot を使用する場合、対応する jar パッケージを pom.xml に導入することに加えて、対応するプロパティ値を構成するだけで済みます。 application.properties 内

Redis を例に挙げます

  • spring-boot-autoconfigure.jar/META-INF/spring から 120 を超えるデフォルトの関数構成クラスを取得します。ファクトリ (redis の機能を含む) 構成クラス RedisAutoConfiguration の完全修飾名。一般に、機能構成クラスはこの関数を中心に展開し、複数の関連する機能クラスの管理と作成を担当します。たとえば、RedisAutoConfiguration は以下を担当します。

JedisConnectionFactory、RedisTemplate、および StringRedisTemplate 機能クラスの作成

org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration,\

  • RedisAutoConfiguration 構成クラスが有効になるための 1 つの条件は、@ConditionalOnClass: JedisConnection です。 class、RedisOperations.class、Jedis.class なので、対応するクラス File

  • @Configuration
    @ConditionalOnClass({ JedisConnection.class, RedisOperations.class, Jedis.class })
    @EnableConfigurationProperties(RedisProperties.class)
    public class RedisAutoConfiguration {}
  • pom.xml に対応する jar がある場合は、クラスパスに移動して対応するクラスを見つけます。パッケージの場合、対応する依存関係クラスと一致します: JedisConnection.class、RedisOperations.class、Jedis.class

    #
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-redis</artifactId>
            </dependency>
#一致が成功した場合、この関数構成クラスが有効になり、デフォルトのプロパティ構成クラス @EnableConfigurationProperties(RedisProperties.class)
  • が挿入されます。

    @ConfigurationProperties(prefix = "spring.redis")
    public class RedisProperties {
        private int database = 0;
        private String url;
        private String host = "localhost";
        private String password;
        private int port = 6379;

Redis 関数の構成により、最終的な JedisConnectionFactory が生成され、条件に応じた RedisTemplate 条件は、IOC 環境にユーザー定義のものが存在しないことです。
  • @ConditionalOnMissingBean(RedisConnectionFactory.class), RedisTemplate
  • @Configuration
    @ConditionalOnClass({ JedisConnection.class, RedisOperations.class, Jedis.class })
    @EnableConfigurationProperties(RedisProperties.class)
    public class RedisAutoConfiguration {
            @Bean
            @ConditionalOnMissingBean(RedisConnectionFactory.class)
            public JedisConnectionFactory redisConnectionFactory()
                    throws UnknownHostException {
                return applyProperties(createJedisConnectionFactory());
            }
    
            @Bean
            @ConditionalOnMissingBean(name = "redisTemplate")
            public RedisTemplate<Object, Object> redisTemplate(
                    RedisConnectionFactory redisConnectionFactory)
                            throws UnknownHostException {
                RedisTemplate<Object, Object> template = new RedisTemplate<Object, Object>();
                template.setConnectionFactory(redisConnectionFactory);
                return template;
            }
    }

##最終的に作成されたデフォルトのアセンブリ クラスは、機能構成クラスの @Bean アノテーションを通じて IOC に挿入されます

  • #原理と結果の分析

    # SpringApplication.run(Application.class, args) は、さまざまなアノテーションを通じて、実行時に spring-boot-autoconfigure.jar 内のスプリングを読み取ります。ファクトリ構成ファイル、構成ファイルには、すべての自動アセンブリ クラスの構成クラスの className が含まれます。次に、関数に対応する Configuration クラスを生成します。これらの関数構成クラスが有効になると、クラスパスに移動して、このクラスの依存クラスがあるかどうかを確認します (つまり、pom .xml には、対応する jar パッケージが必要です)そして、構成クラス内での判断により最終的な機能クラスが生成され、構成クラスにデフォルトの属性値クラスが注入され、機能クラスの参照やデフォルト値の代入が可能となります。機能クラスの生成はカスタマイズを優先することが原則であり、自動アセンブリクラスはカスタマイズがない場合にのみ使用されます。
要約すると、クラスを自動的にアセンブルするには、2 つの条件を満たす必要があります。

spring.factories には、このクラスの構成クラスが含まれています。 (a 構成クラスは、この関数を囲む複数の依存クラスを作成できます)

  • #pom.xml には、対応する jar パッケージが必要です

  • ##プロセス全体の結果は次の 2 つです。

    さまざまな判断と依存関係に基づいて、ビジネスに必要なクラスが最終的に生成され、IOC に挿入されます。コンテナ

自動アセンブリによって生成されたクラスには、いくつかのデフォルトの属性値が与えられます
  • ##依存アノテーション

  • #@ SpringBootApplication: sb プロジェクト アプリケーションのスタートアップ クラスのアノテーションは、実際には 3 つのアノテーションの組み合わせです: @SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan のうち、2 番目のアノテーション

  • ## が役割を果たします。 #@EnableAutoConfiguration: 自動アセンブリを開始する SB アプリケーションの機能を示します (対応する Bean を IOC コンテナにロードし、デフォルト設定に従ってプロパティに値を割り当てることを含みます)

    @Import(EnableAutoConfigurationImportSelector.class) : このアノテーションは非常に強力で、IOC に登録されていない Bean を強制的に IOC に登録することができ、自動構成機能を開始するには EnableAutoConfigurationImportSelector.class を導入する必要があることを示します
  • @Configuration
  • @ConditionalOnClass({ JedisConnection.class, RedisOperations.class, Jedis.class }): RedisAutoConfiguration 構成クラスが次のことを行うことを示します。動作するには、これらのクラスを含む jar パッケージが必要です。
  • @EnableConfigurationProperties(RedisProperties.class): RedisProperties.class の構成がデフォルトで参照されることを示します
  • ##@ConditionalOnMissingBean(RedisConnectionFactory.class): これは非常に強力です。自動アセンブリを実装する場合、カスタマイズが優先されることに注意してください。ユーザーがカスタム RedisConnectionFactory.class クラスを挿入しない場合にのみ、デフォルトの JedisConnectionFactory が使用されることを示します。

自動アセンブリのプロセス

  • クラス間の依存関係は、さまざまなアノテーションを通じて実現されており、コンテナーが起動すると、Application.run によって selectImports メソッドが呼び出されます。 EnableAutoConfigurationImportSelector.class (実際にはその親クラスのメソッド)

  • selectImports メソッドは最終的に SpringFactoriesLoader.loadFactoryNames メソッドを呼び出して、一般的に使用される BeanConfigurations の包括的なリストを取得します

  • loadFactoryNames メソッドは、FACTORIES_RESOURCE_LOCATION (つまり、spring-boot-autoconfigure.jar の下の spring.factories) を読み取り、すべての Spring 関連 Bean の完全修飾 ClassName (約 120+

  • ) を取得します。
  • selectImports メソッドは引き続き filter(configurations, autoConfigurationMetadata) を呼び出します。このとき、これらの BeanConfigurations の条件に従って 1 つずつフィルターされます。最も重要なのは @ConditionalOnClass です。この条件付きアノテーションは、 jar パッケージにこの条件付き依存関係クラスがあるかどうかを確認するため、これらの依存関係クラスを持ち、IOC 環境に必要ないくつかのデフォルト構成 Bean を生成するには、対応する jar パッケージが必要です

  • # 最後に、修飾された BeanConfiguration をデフォルトの EnableConfigurationPropertie クラスの属性値に挿入し、IOC 環境に注入します。

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

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