1。Javaカスタムアノテーションと春
Javaアノテーションは、プログラム要素(クラス、メンバー変数、メンバーメソッドなど)の一種のメタデータ情報として、プログラム自体の実行に影響を与えません。カスタムアノテーションを通じて、プログラム要素に特別な宣言を追加できます。
エンタープライズレベルのアプリケーションを構築するためのプラットフォームとして、Springは豊富な機能を提供します。 JavaのカスタムアノテーションをSpringと組み合わせて、特定のシナリオで注釈の解析と処理を実装すると、アプリケーションの結合度が低下し、プログラムのスケーラビリティが向上します。
2。アプリケーションシナリオ
以下はいくつかのアプリケーションシナリオを要約し、一般的なアイデアのみを説明します(PS:すべてのシナリオがプロジェクトで実践されているわけではありません)
2.1ログイン、許可ブロッキング
Webプロジェクトでは、ログイン傍受と許可インターセプトは決まり文句機能です。カスタムログインアノテーションまたは許可注釈を介して、ログインと許可インターセプト機能を実現するために、カスタムインターセプターの注釈を解析します。
この使用方法には、シンプルな構成、柔軟性が高く、コードのカップリングが低くなっています。
2.2タイミングタスク管理
システムの構築プロセス中に、さまざまなタイミングのタスク要件があり、タイミングされたタスクの集中管理により、システムの動作をより効率的に維持できます。
公式Java Annotationドキュメントの繰り返し発表の章にあるカスタムタイミングタスク注釈は、ビジネス方法のタイミングタスク宣言を実現できます。 SpringのコンテナポストプロセッサBeanPostProcessor(PS:Spring Container PostProcessorについて次の記事で説明します)と組み合わせて、カスタムアノテーションを解析します。解析された注釈情報は、Quartzapiを使用してランタイムタイミングタスクを構築するために使用され、ランタイムの作成とタイミングタスクの集中管理を完了できます。
この方法は、Quartzタイミングタスクの構成を定義し、システムのスケーラビリティを改善することを避けることができます。
2.3マルチデータソースルーティングのデータソース仕様
Springが提供するAbstractroutingDataSourceは、複数のデータソースの動的ルーティングを実装し、マスタースレーブ分離アーキテクチャの下で適用できます。さまざまなメソッドのさまざまなデータソースを指定することにより、データソースの動的ルーティングが実現されます(たとえば:メソッドの読み取りは、スレーブデータベースデータソースから得られ、メソッドの書き込みメソッドはメインデータベースデータソースから得られます)。異なるメソッドに対応するデータソースタイプを識別する方法カスタムアノテーションを使用して実装できます。データソースのルーティング関数は、メソッドで宣言された対応するデータソースタイプを分析することにより実現されます。
この方法では、メソッドのパターンの一致したパターン(例:選択から始まる、更新など)の一致を回避し、宣言はより柔軟になります。
カスタムアノテーション
最も簡単な例を見てみましょう。 SpringWebアプリケーションを使用する過程で、@Controller、@Service、@Repository、その他の注釈を使用してJavabeansを定義します。では、どのようにして自分で注釈を定義できますか?スプリングは自動的にロードできます。したがって、最初の例があります。
@target({elementType.type})@retention(retentionPolicy.runtime)@documented@componentPublic @interface mycomponent {string value()default "";} @configurationPublic ComponentAnnotationTest {public static void main(string [] args){annotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(); annotationConfigApplicationContext.register(ComponentAntateTETT.Class); annotationConfigApplicationContext.Refresh(); InjectClass InjectClass = annotationConfigApplicationContext.getBean(InjectClass.Class); Injectclass.print(); } @mycomponent public static class injectclass {public void print(){system.out.println( "hello world"); }}}この例を実行すると、@mycomponentによって注釈が付けられたクラスも春までにロードされ、通常は通常のJavabeanとして使用できることがわかります。 Springのソースコードを確認すると、SpringはClassPathSningCandingCandidateComponentProviderを使用してパッケージをスキャンすることがわかります。このクラスにはそのような注釈があります。
ベースパッケージからClassPathをスキャンするコンポーネントプロバイダー。その後、除外を適用し、結果のクラスにフィルターを含めて候補者を見つけます。
このクラスのRegisterDefaultFiltersメソッドにはいくつかのコードがあります
protected void RegisterDefaultFilters(){this.includefilters.add(new AnnotationTypefilter(component.class)); classloader cl = classpathscanningcandidatecomponentprovider.class.getClassLoader(); try {this.includefilters.add(new AnnotationTypefilter((((class <?extends annotation>)classutils.forname( "javax.annotation.managedbean"、cl))、false)); logger.debug( "jsr-250 'javax.annotation.managebean'コンポーネントスキャンのために見つけてサポートされている"); } catch(classNotFoundException ex){// JSR -250 1.1 API(Java EE 6に含まれる)利用できない - 単にスキップします。 } try {this.includefilters.add(new annotationTypefilter((((class <?extends annotation>)classutils.forname( "javax.inject.named"、cl))、false)); logger.debug( "jsr-330 'javax.inject.named'アノテーションが見つかった、サポートされているコンポーネントスキャンにサポートされています"); } catch(classNotFoundException ex){// JSR -330 APIは使用できません - 単にスキップします。 }}ここでは、スプリングのスキャンクラス情報の使用は、@Componentが注釈したクラスのみを判断するため、カスタム注釈はスプリングでスキャンし、@Componentが装備されている限りコンテナに注入することができます(もちろん、String value()default "; Methodが必要です。
要約します
上記は、春のカスタムアノテーションの適用に関するこの記事の簡単な議論についてのすべてです。私はそれがすべての人に役立つことを願っています。興味のある友人は、このサイトの他の関連トピックを引き続き参照できます。欠点がある場合は、それを指摘するためにメッセージを残してください。このサイトへのご支援をありがとうございました!