1. 概要

このチュートリアルでは、Springの2つの主要なXML構成要素の違いについて学習します。

2. Beanの定義

ご存知のとおり、Springには、Beansと依存関係を定義する2つの方法があります。XML構成とJavaアノテーションです。 Springのアノテーションは、依存性注入アノテーションbeanアノテーションの2つのグループに分類することもできます。

アノテーションを付ける前に、XML構成ファイルですべてのBeanと依存関係を手動で定義する必要がありました。 Springのアノテーションのおかげで、すべてのBeanと依存関係を自動的に検出してワイヤリングできます。 したがって、少なくともBeanと依存関係に必要なXMLを排除できます。

ただし、アノテーションは、をアクティブにしない限り、役に立たないことを覚えておく必要があります。 それらをアクティブにするために、次のいずれかを追加できますまた XMLファイルの上に。

このセクションでは、その方法を説明します注釈をアクティブ化する方法が互いに異なります。

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

The アノテーションは主に、依存性注入アノテーションをアクティブ化するために使用されます。  @Autowired @Qualifier @PostConstruct @PreDestroy 、 と @リソースいくつかのものです解決できます。

簡単な例を見て、その方法を見てみましょう。 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を宣言する必要があることを指摘しましょう。 それはアプリケーションコンテキストにすでに登録されているBeanの注釈のみをアクティブ化します

ここに表示されているように、[X78X]@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>

と同様に 依存性注入アノテーションも認識して処理できます。 さらに、 Beanアノテーションを認識します検出しない

基本的、 パッケージスキャンによって注釈を検出します 。 別の言い方をすれば、注釈付きのBeanまたはコンポーネントを探すためにスキャンする必要があるパッケージをSpringに通知します。

@成分 @リポジトリ @サービス @コントローラ @RestController 、 と @構成いくつかのものです検出できます

次に、前の例を単純化する方法を見てみましょう。

@Component
public class UserService {
    @Autowired
    private AccountService accountService;
}

@Component
public class AccountService {}

ここで、 @Componentアノテーションは、クラスをbeansとしてマークします。 これで、XMLファイルからすべてのBean定義をクリーンアップできます。 そしてもちろん、私たちは維持する必要がありますその上:

<context:component-scan
  base-package="com.baeldung.annotationconfigvscomponentscan.components" />

最後に、Springはbase-package属性で示されるパッケージの下で注釈付きのBeanと依存関係を探すことに注意してください。

5. 結論

このチュートリアルでは、

コードサンプルは、いつものように、GitHubオーバーです。