Spring Beanのアノテーション

1概要

この記事では、さまざまなタイプのBeanを定義するために使用される最も一般的な Spring Beanの注釈 について説明します。

SpringコンテナでBeanを設定する方法はいくつかあります。 XML設定を使用してそれらを宣言できます。構成クラスで @ Bean アノテーションを使用してBeanを宣言できます。

あるいは、 org.springframework.stereotype パッケージのアノテーションの1つでクラスをマークして、残りをコンポーネントスキャンに任せることもできます。

2コンポーネントスキャン

コンポーネントスキャンが有効になっている場合、Springは自動的にパッケージのBeanをスキャンできます。

@ ComponentScan は、アノテーション設定を使用してクラスをスキャンするパッケージを設定します。 basePackages または value 引数( value basePackages の別名です)のいずれかで直接ベースパッケージ名を指定できます。

@Configuration
@ComponentScan(basePackages = "com.baeldung.annotations")
class VehicleFactoryConfig {}

また、 basePackageClasses 引数を使用して基本パッケージ内のクラスを指すこともできます。

@Configuration
@ComponentScan(basePackageClasses = VehicleFactoryConfig.class)
class VehicleFactoryConfig {}

どちらの引数も配列なので、それぞれに複数のパッケージを指定できます。

引数が指定されていない場合、スキャンは @ ComponentScan アノテーション付きクラスが存在するのと同じパッケージから行われます。

@ ComponentScan は、Java 8の繰り返しアノテーション機能を利用します。つまり、クラスにマークを付けることができます。

@Configuration
@ComponentScan(basePackages = "com.baeldung.annotations")
@ComponentScan(basePackageClasses = VehicleFactoryConfig.class)
class VehicleFactoryConfig {}

あるいは、 @ ComponentScans を使用して、複数の @ ComponentScan 構成を指定できます。

@Configuration
@ComponentScans({
  @ComponentScan(basePackages = "com.baeldung.annotations"),
  @ComponentScan(basePackageClasses = VehicleFactoryConfig.class)
})
class VehicleFactoryConfig {}
  • XML設定** を使用する場合、設定コンポーネントのスキャンは同じくらい簡単です。

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

3 @成分

@ Component はクラスレベルの注釈です。コンポーネントのスキャン中、 Spring Frameworkは @ Component のアノテーションが付けられたクラスを自動的に検出します。

例えば:

@Component
class CarUtility {
   //...
}

デフォルトでは、このクラスのBeanインスタンスは、クラス名と同じ名前で頭文字が小文字になります。それに加えて、このアノテーションのオプションの value 引数を使って異なる名前を指定することができます。

@ Repository @ Service @ Configuration 、および @ Controller はすべて @ Component のメタアノテーションであるため、同じBean命名動作を共有します。また、Springはコンポーネントのスキャン処理中にそれらを自動的に検出します。

4 @リポジトリ

DAOまたはリポジトリクラスは通常、アプリケーション内のデータベースアクセスレイヤを表し、__ @ Repository:というアノテーションを付ける必要があります。

@Repository
class VehicleRepository {
   //...
}

この注釈を使用する利点の1つは、** 自動永続性例外変換が有効になっていることです。 Hibernateなどの永続フレームワークを使用する場合、 @ Repository のアノテーションが付けられたクラス内でスローされたネイティブ例外は自動的にSpringの DataAccessExeption のサブクラスに変換されます。

  • 例外変換** を有効にするためには、私たち自身の PersistenceExceptionTranslationPostProcessor beanを宣言する必要があります。

@Bean
public PersistenceExceptionTranslationPostProcessor exceptionTranslation() {
    return new PersistenceExceptionTranslationPostProcessor();
}

ほとんどの場合、Springは上記のステップを自動的に行います。

または、XML設定を介して:

<bean class=
  "org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>

5 @サービス

アプリケーションの ビジネスロジック は通常サービスレイヤ内にあります。したがって、クラスがそのレイヤに属することを示すために @ Service アノテーションを使用します。

@Service
public class VehicleService {
   //...
}

6. @コントローラ

@ Controller は、このクラスがSpring MVC コントローラーとして機能することをSpring Frameworkに伝えるクラスレベルのアノテーションです。

@Controller
public class VehicleController {
   //...
}

7. @設定

Configuration クラスは @ @でアノテーション付けされた Bean定義メソッドを含むことができます。

@Configuration
class VehicleFactoryConfig {

    @Bean
    Engine engine() {
        return new Engine();
    }

}

8ステレオタイプアノテーションとAOP

Springステレオタイプアノテーションを使用すると、特定のステレオタイプを持つすべてのクラスを対象とするポイントカットを簡単に作成できます。

たとえば、DAO層からのメソッドの実行時間を測定したいとします。 @ Repository ステレオタイプを利用して、AspectJアノテーションを使用して次のアスペクトを作成します。

@Aspect
@Component
public class PerformanceAspect {
    @Pointcut("within(@org.springframework.stereotype.Repository ** )")
    public void repositoryClassMethods() {};

    @Around("repositoryClassMethods()")
    public Object measureMethodExecutionTime(ProceedingJoinPoint joinPoint)
      throws Throwable {
        long start = System.nanoTime();
        Object returnValue = joinPoint.proceed();
        long end = System.nanoTime();
        String methodName = joinPoint.getSignature().getName();
        System.out.println(
          "Execution of " + methodName + " took " +
          TimeUnit.NANOSECONDS.toMillis(end - start) + " ms");
        return returnValue;
    }
}

この例では、 @ Repository というアノテーションが付けられたクラス内のすべてのメソッドに一致するポイントカットを作成しました。それから @ Around アドバイスを使用してそのポイントカットをターゲットにし、インターセプトされたメソッド呼び出しの実行時間を決定しました。

このアプローチを使用して、ログ記録、パフォーマンス管理、監査、またはその他の動作を各アプリケーション層に追加できます。

9結論

この記事では、Springステレオタイプのアノテーションを調べ、それぞれがどのような意味を表すのかを学びました。

また、コンポーネントスキャンを使用して、注釈付きクラスを見つける場所をコンテナに指示する方法も学びました。

最後に - 私たちはこれらのアノテーションがどのようにしてクリーンで階層化されたデザインになるか、そしてアプリケーションの関心事間の分離をもたらすことを見ました。手動で明示的にBeanを定義する必要がなくなったので、それらは設定を小さくします。

いつものように、例はhttps://github.com/eugenp/tutorials/tree/master/spring-mvc-java[over on GitHub]から入手可能です。

  • «** 前へ