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]から入手可能です。
-
«** 前へ