Spring-bootにおけるauto-configurationとconfigurationの違い

2603 ワード

Spring-bootはannotationによるbeanの構成を提唱しており、現在spring-bootでよく使われている2つのbeanの作成方法にはauto-configurationとconfigurationの2つの方法がある.
まずconfiguration方式として,@configuration注釈と@bean注釈を用いて所望のbeanオブジェクトを初期化する.
@Configuration
@Slf4j
public class SecondBeanConfiguration {  
  @Bean  
  @ConditionalOnMissingBean  
  public SecondBean secondBean() { 
    log.info("log second bean");    
    return new SecondBean("secondBean", 2);  
  }
}

その後、起動時に@ComponentScan注記がパケットをスキャンし(パスは指定可能で、デフォルトではこのディレクトリがあるパケットがスキャンを開始します)、この注記が@configuration注記にスキャンされると、このクラスの下に@beanが追加されたすべてのメソッドが初期化され、このbeanが初期化されます.
さらにauto-configuration、spring-bootには@EnableAutoConfigurationの注記があります.彼はspring.factoriesファイルの中のEnableAutoConfigurationの下に指定されたクラスを読み取ることで、指定されたクラスの下にある@beanを加えたすべての方法を初期化し、このbeanを初期化します.
spring.factoriesファイル:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.dragon.study.spring.boot.configuration.auto.config.AutoFirstBeanConfiguration,\
com.dragon.study.spring.boot.configuration.auto.config.AutoSecondBeanConfiguration

具体的なコード
@Slf4j
@Configuration
public class AutoFirstBeanConfiguration {  
  @Bean  
  @ConditionalOnMissingBean  
  public AutoFirstBean autoFirstBean() {
     log.info("log auto first bean");   
     return new AutoFirstBean("autoFirstBean", 1);  
  }
}

では、この2つの方法にはどんな違いがありますか?
  • は初期化のタイミングconfiguration初期化の方式であり、常にauto-configuration初期化方式の前に
  • である.
  • configuration初期化の順序はスキャンのプロセスに関連しており、有効に指定することはできず、ファイルロードの順序
  • を特定するのに不便である.
  • auto-configurationは、@AutoConfigureAfter @AutoConfigureBeforeおよび@AutoConfigureOrderによってクラスのロード順序
  • を指定することができる.
  • configuration初期化@Configurationファイルにスキャンされた@PostConstruct注記をすべて初期化してからこれらのファイルの@Bean注記を初期化しますが、auto-configurationはファイルに基づいて初期化されるので、1つのファイルの@PostConstruct注記を初期化してからこのファイルの@Bean注記を初期化します.その後、別のファイルを処理します.

  • したがって、beanを他のjarパッケージに提供して使用する必要がある場合は、auto-configuration方式(spring-boot-startersの中のものはすべてこのような方式で提供され、彼のすべての初期化プロセスはspring-boot-autoconfigureプロジェクトにある)を使用することが望ましい.クラスファイルのロード順序をよりよく制御することができるからである.より複雑なプロジェクトのメンテナンスに役立つ.
    また、auto-configurationが提供するクラス名がスキャンのパスの中にある場合、spring-bootはこれらのクラスをconfigurationとして先に初期化し、@AutoConfigureAfter @AutoConfigureBefore@AutoConfigureOrderのような指定された順序の注釈は失効することに注意してください.