SpringBoot自動組立原理

5888 ワード

従来のSpringプロジェクトには、Redisを使用するなど、多くのプロファイルがあります.一般的には、対応する依存jarパッケージのほかにアプリケーションが必要です.xmlにはJedisConnectionFactory、JedisPoolConfig、RedisTemplateが配置されています.しかしSpringBootを使うとpomによるxmlのjarパッケージは、これらのクラスを自動的に生成し、IOCコンテナに注入します.
  • 従来のSpringプロジェクトでは
  • を構成する必要があります.
    
    
    
    
  • SpringBootを使用するとpomを除く.xmlは対応するjarパッケージを導入する以外、applicationだけでよい.properties構成に対応する属性値は
  • である.
    Redisの例
  • spring-boot-autoconfigure.jar/META-INF/spring.factoriesでは、redisの機能構成クラスRedisAutoConfigurationのフルネームを含む120以上のデフォルト機能構成クラスを取得します.一般的に、1つの機能構成クラスはこの機能をめぐって、RedisAutoConfigurationのような複数の関連機能クラスの作成を管理します.たとえば、RedisConnectionFactory、RedisTemplate、StringRedisTemplateの3つの機能クラスの作成
  • org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration,\
    
  • RedisAutoConfigurationコンフィギュレーションクラスが有効になる条件の1つは@ConditionalOnClass:JedisConnectionです.class, RedisOperations.class, Jedis.class、だからclasspathに行って対応するclassファイル
  • を探します
    @Configuration
    @ConditionalOnClass({ JedisConnection.class, RedisOperations.class, Jedis.class })
    @EnableConfigurationProperties(RedisProperties.class)
    public class RedisAutoConfiguration {}
    
  • pom.xmlには対応するjarパッケージがあり、対応する依存class:JedisConnectionにマッチします.class, RedisOperations.class, Jedis.class
  •         
                org.springframework.boot
                spring-boot-starter-data-redis
            
    
  • 照合に成功すると、この機能構成クラスは有効になり、デフォルトの属性構成クラス@E n a b l e C o n f i gurationProperties(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 redisTemplate(
                    RedisConnectionFactory redisConnectionFactory)
                            throws UnknownHostException {
                RedisTemplate template = new RedisTemplate();
                template.setConnectionFactory(redisConnectionFactory);
                return template;
            }
    }
    
  • 最終的に作成されたデフォルトのアセンブリクラスは、機能構成クラスの@Bean注釈を通じてIOCに
  • 注入されます.
    原理と結果分析
    様々な注釈でSpringApplication.run(Application.class,args)は、実行時にspring-boot-autoconfigureを読み出す.义齿factoriesプロファイルでは、プロファイルにすべての自動アセンブリクラスの構成クラスがあるclassNameを生成し、対応する機能のコンフィギュレーションクラスを生成します.これらの機能構成クラスが有効になるには、classpathでそのクラスがあるかどうかの依存クラス(つまりpom.xmlには対応するjarパッケージが必要)を探し、コンフィギュレーションクラスで最後の機能クラスを生成するかどうかを判断します.また、構成クラスにはデフォルト属性値クラスが注入され、機能クラスはデフォルト値を参照して付与することができます.機能クラスを生成するには、カスタムが優先され、カスタムがない場合に自動アセンブリクラスが使用されます.
    以上のように、1つのクラスを自動的に組み立てるには2つの条件を満たす必要があります.
  • spring.factoriesには、このクラスの構成クラス(1つの構成クラスがその機能をめぐる複数の依存クラスを作成できる)
  • があります.
  • pom.xmlには対応するjarパッケージ
  • が必要です
    プロセス全体の結果は2つです.
  • は各種の判断と依存により最終的に業務に必要なクラスを生成しIOC容器に注入した
  • .
  • 自動アセンブリによって生成されたクラスは、いくつかのデフォルトの属性値
  • を与える.
    依存注記
  • @SpringBootApplication:sbプロジェクトアプリケーション起動クラスの注釈は、実は3つの注釈の組み合わせです:@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan、自動アセンブリで2番目の
  • が機能します.
  • @EnableAutoConfiguration:SBアプリケーションが自動アセンブリを開始する機能(対応するBeanをIOCコンテナにロードし、デフォルトの構成に従って属性に値を付与することを含む)
  • を示す.
  • @Import(E n a b l e AutoConfigurationImportSelector.class):この注釈は比較的強く、IOCに登録されていないBeanをIOCに強制登録することができ、自動構成機能を起動するにはE n a b l e AutoConfigurationImportSelectorを導入する必要があることを示している.classは
  • です
  • @Configuration
  • @ConditionalOnClass({JedisConnection.class,RedisOperations.class,Jedis.class}):RedisAutoコンフィギュレーションクラスを機能させるには、これらのクラスを含むjarパッケージが必要であることを示す
  • @E n a b l e ConfigurationProperties(RedisProperties.class):RedisPropertiesがデフォルトで参照されていることを示します.class内の構成
  • @C o n d i tionalOnMissingBean(RedisConnectionFactory.class):これはすごい注釈で、自動アセンブリ時のカスタム優先を実現します.ユーザーが注入をカスタマイズしていない場合を示します.クラスは、デフォルトのJedisConnectionFactoryを使用します.

  • 自動アセンブリプロセス
  • は種々の注釈によりクラスとクラスの依存関係を実現する、コンテナは起動時にApplication.run、E n a b l e A u t o C o n f i g u r ationImportSelectorが呼び出されます.classのselectImportsメソッド(実はその親のメソッド)
  • selectImportsメソッドは最終的にSpringFactoriesLoaderを呼び出す.loadFactoryNameメソッドを使用して、一般的なBeanConfigurationの包括的なリスト
  • を取得します.
  • loadFactoryNameメソッドFACTORIES_を読み込みます.RESOURCE_LOCATION(つまりspring-boot-autoconfigure.jarの下のspring.factories)は、すべてのSpring関連BeanのフルネームClassNameを取得し、約120個の
  • selectImportsメソッドはfilter(configurations,autoConfigurationMetadata)を呼び出し続ける.この時、これらのBeanConfigurationの中の条件に基づいて、一つ一つフィルタリングします.最も重要なのは@ConditionalOnClassです.この条件注釈はclasspathの下で探します.jarパッケージの中にこの条件依存クラスがあるかどうかです.だから、対応するjarパッケージが必要です.これらの依存クラスがあれば、IOC環境に必要なデフォルトの構成Bean
  • が生成されます.
  • 最後に条件を満たすBeanConfigurationをデフォルトのE n a b l e ConfigurationPropertieクラスの属性値に注入し、IOC環境に
  • を注入する.
    参考資料
    主にこの大物の内容から取ったのですが、このブログは容量が大きすぎて、功力が深すぎます.https://www.jianshu.com/p/83693d3d0a65