web-dev-qa-db-ja.com

Spring Bootの@ComponentScanと@EnableAutoConfigurationの違いは何ですか?

Spring Bootの@ComponentScanアノテーションと@EnableAutoConfigurationアノテーションの違いは何ですか?これらを追加する必要がありますか?私のアプリケーションは、これらの注釈がなくても非常にうまく機能します。なぜ追加する必要があるのか​​を理解したいだけです。

49
E2rabi

Spring Bootの@ComponentScanアノテーションと@EnableAutoConfigurationアノテーションの違いは何ですか?

@EnableAutoConfiguration 注釈は、追加したjar依存関係に基づいて、Spring Bootに、Springの構成方法を「推測」するよう指示します。たとえば、HSQLDBがクラスパス上にあり、データベース接続Beanを手動で構成していない場合、Springはインメモリデータベースを自動構成します。

@ComponentScan は、指定されたパッケージ内の他のコンポーネント、構成、およびサービスを検索するようSpringに指示します。 Springは、事前に定義されたプロジェクトパッケージからBeanまたはコンポーネントを自動スキャン、検出、および登録できます。パッケージが指定されていない場合、現在のクラスパッケージがルートパッケージとして取得されます。

これらを追加する必要はありますか?

Springブートですべてを自動設定する必要がある場合 @EnableAutoConfiguration が必要です。手動で追加する必要はありません。ユーザーが指定した注釈に基づいて、Springが内部的に追加します。

実際に @SpringBootApplication アノテーションは、デフォルト属性で @Configuration@EnableAutoConfiguration および @ComponentScan を使用するのと同等です。

以下も参照してください:

59
Shaheer

Spring Bootの主な利点の1つは、従来のxmlベースの構成と比較したアノテーション駆動です。@ EnableAutoConfiguration含まれるjarファイルに基づいてSpringアプリケーションを自動的に構成し、デフォルトまたはヘルパーをセットアップしますpom.xmlの依存関係に基づきます。通常、自動構成はクラスパスと定義されたBeanに基づいて適用されます。したがって、DataSource、EntityManagerFactory、TransactionManagerなどを定義する必要はなく、クラスパスに基づいて魔法のように、Spring Bootは適切なBeanを自動的に作成し、登録します。たとえば、クラスパスにTomcat-embedded.jarがある場合、TomcatEmbeddedServletContainerFactoryが必要になる可能性があります(独自のEmbeddedServletContainerFactory Beanを定義していない場合)。 @EnableAutoConfigurationにはexclude属性があり、自動設定を明示的に無効にしますウェブ。

@ ComponentScanはスプリングコンポーネントスキャンのスコープを提供しますが、単純に提供されたベースパッケージに進み、@ Beanや@Autowiredなどに必要な依存関係を取得します。典型的なSpringアプリケーションである@ComponentScanは、@ Configurationアノテーションが付けられた構成クラスで使用されます。構成クラスには、@ Beanアノテーションが付けられたメソッドが含まれます。これらの@Beanアノテーション付きメソッドは、Springコンテナによって管理されるBeanを生成します。これらのBeanは、@ ComponentScanアノテーションによって自動検出されます。 @Repository、@Service、@Controller、@Configuration、@ComponentのようなBeanを自動検出可能にするアノテーションがいくつかあります。以下のコードでは、SpringはBeanAクラスを含むパッケージからスキャンを開始します。

@Configuration
@ComponentScan(basePackageClasses = BeanA.class)
@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class})
public class Config {

  @Bean
  public BeanA beanA(){
    return new BeanA();
  }

  @Bean
  public BeanB beanB{
    return new BeanB();
  }

}
13
ShayneR