<context:annotation-config>と<context:component-scan>の違い

1. 概要

このチュートリアルでは、Springの2つの主要なXML構成要素である_ <context:annotation-config> _と_ <context:component-scan> _の違いについて学習します。

2. Bean定義

ご存じのとおり、Springはlink:/spring-bean[beans]と依存関係を定義する2つの方法を提供します:link:/spring-xml-injection[XML設定]およびJavaアノテーション。 Springの注釈は、https://www.baeldung.com/spring-core-annotations [dependency injection annotations]とlink:/spring-core-annotations[bean annotations]の2つのグループに分類することもできます。 。
注釈を付ける前に、XML構成ファイルですべてのBeanと依存関係を手動で定義する必要がありました。 Springの注釈のおかげで、*すべてのBeanと依存関係を自動的に検出して接続できます*。 したがって、少なくともBeanと依存関係に必要なXMLを排除できます。
ただし、*注釈は、アクティブ化しない限り役に立ちません*。 *それらを有効にするには、XMLファイルの先頭に_ <context:annotation-config> _または__ <context:component-scan> __を追加します。*
このセクションでは、_ <context:annotation-config> _と_ <context:component-scan> _が、アノテーションをアクティブにする方法の点でどのように異なるかを見ていきます。

3. < context:annotation-config> による注釈のアクティブ化

_ <context:annotation-config> _注釈は、主に依存性注入注釈をアクティブにするために使用されます。 link:/spring-autowire[[email protected]_]、link:/spring-core-annotations[[email protected]_]、link:/ spring-postconstruct-predestroy [_ @ PostConstruct_]、https://www.baeldung.com/spring-postconstruct-predestroy [_ @ PreDestroy_]、およびlink:/spring-annotations-resource-inject -autowire [_ @ Resource_]は、_ <context:annotation-config> _が解決できるものの一部です。
簡単な例を作成して、_ <context:annotation-config> _がどのようにXML構成を単純化できるかを見てみましょう。
まず、依存関係フィールドを持つクラスを作成しましょう。
public class UserService {
    @Autowired
    private AccountService accountService;
}
public class AccountService {}
それでは、Beanを定義しましょう。
<bean id="accountService" class="AccountService"></bean>

<bean id="userService" class="UserService"></bean>
さらに先に進む前に、XMLでBeanを宣言する必要があることを指摘しましょう。 これは、* __ <context:annotation-config> __が、アプリケーションコンテキストにすでに登録されているBeanの注釈のみをアクティブにするためです*。
ここでわかるように、_ @ Autowired_を使用して_accountService_フィールドに注釈を付けました。 * _ @ Autowired_は、このフィールドが一致するBeanによって自動的に配線される必要がある依存関係であることをSpringに伝えます。*
_ @ Autowired_を使用しなかった場合、_accountService_依存関係を手動で設定する必要があります。
<bean id="userService" class="UserService">
    <property name="accountService" ref="accountService"></property>
</bean>
これで、ユニットテストでBeanと依存関係を参照できます。
@Test
public void givenContextAnnotationConfig_whenDependenciesAnnotated_thenNoXMLNeeded() {
    ApplicationContext context
      = new ClassPathXmlApplicationContext("classpath:annotationconfigvscomponentscan-beans.xml");

    UserService userService = context.getBean(UserService.class);
    AccountService accountService = context.getBean(AccountService.class);

    Assert.assertNotNull(userService);
    Assert.assertNotNull(accountService);
    Assert.assertNotNull(userService.getAccountService());
}
*うーん、ここで何かが間違っています。* _ @ Autowired_で注釈を付けたにもかかわらず、Springは_accountService_を配線していないようです。 __ @ Autowired __はアクティブではないようです。 この問題を解決するには、XMLファイルの上に次の行を追加するだけです。
<context:annotation-config/>

4. < context:component-scan> による注釈のアクティブ化

_ <context:annotation-config> _と同様に、_ <context:component-scan> _も依存性注入アノテーションを認識して処理できます。 さらに、** _ <context:component-scan> _は、_ <context:annotation-config> _が検出しないBeanアノテーションを認識します** __.__
基本的に、* _ <context:component-scan> _はパッケージスキャンによって注釈を検出します*。 別の言い方をすれば、注釈付きBeanまたはコンポーネントを探すためにどのパッケージをスキャンする必要があるかをSpringに伝えます。
link:/spring-component-repository-service[[email protected]_]、link:/spring-component-repository-service[[email protected]_]、https:// www.baeldung.com/spring-component-repository-service[[email protected]_]、link:/spring-controller-vs-restcontroller[[email protected]_]、https://www.baeldung。 com / spring-controller-vs-restcontroller [_ @ RestController_]、およびlink:/spring-mvc-tutorial[[email protected]_]は、_ <context:component-scan> _ can detect __.__
ここで、前の例を単純化する方法を見てみましょう。
@Component
public class UserService {
    @Autowired
    private AccountService accountService;
}
@Component
public class AccountService {}
ここで、* _ @ Component_アノテーションは、クラスをBean *としてマークします。 これで、XMLファイルからすべてのBean定義を消去できます。 そしてもちろん、その上に_ <context:component-scan> _を保持する必要があります。
<context:component-scan
  base-package="com.baeldung.annotationconfigvscomponentscan.components" />
最後に、Springは注釈付きBeanと依存関係を、indicated_base-package_属性で示されるパッケージの下で検索することに注意してください。

5. 結論

このチュートリアルでは、_ <context:annotation-config> _と_ <context:component-scan> _の違いを調べました。
コードサンプルは、いつものように、https://github.com/eugenp/tutorials/tree/master/spring-5 [GitHub上]です。