春の注釈は、ほぼ2つのカテゴリに分割できます。
1)スプリングビーンコンテナ、または豆工場に関連する注釈。
2)SpringMVCに関連する注釈。
SpringのBean Containerに関連するアノテーションには、@Required、@Autowired、@PostConstruct、@Predestory、JSR-330 Standard Javax.Injectの注釈が含まれます。
springmvc関連の注釈は次のとおりです。
春の注釈を理解するには、最初にJavaの注釈を理解する必要があります。
1。Javaの注釈
Java 1.5で注釈が導入され始めました。私たちが最もよく知っているのは、次のようなものです。これは次のように定義されています。
/** *メソッド宣言が、スーパータイプのメソッド宣言をオーバーライドすることを目的としていることを示します。メソッドに注釈が付けられている場合 *この注釈型コンパイラは、次の条件の少なくとも1つが保持されない限り、エラー *メッセージを生成する必要があります。 *このメソッドには、オブジェクトで宣言されたパブリックメソッドのオーバーライドと同等の署名があります。 * * @author peter von derahé * @author joshua bloch * @jls 9.6.1.4 @override * @since 1.5 */ @target(elementtype.method)@retention(retentionpolicy.source)public @interface override {}アノテーションから、@Overrideの機能は、@Override Annotationで使用されている方法が、java.lang.objectで親クラスまたは同じ名前のメソッドをオーバーライドする必要があることをコンパイラに促すことであることがわかります。 @targetと@retentionが@Overrideの定義で使用されていることがわかります。それらはいわゆる「メタアノテーション」です。注釈を定義する注釈、または注釈(めまい...)を定義する注釈です。 @retentionを見てみましょう
/** *注釈付きタイプの注釈が保持される時間を示します。アノテーションタイプの宣言 *に保持注釈が存在しない場合、保持ポリシーは * retentionPolicy.classにデフォルトです。 * /@documented@retention(retentionPolicy.runtime)@target(elementType.annotation_type)public @interface retention { /***保持ポリシーを返します。 * @return保持ポリシー */ retentionPolicy value();}@retentionは、注釈が保持される期間を促すために使用されます。 3つの値があります。
public Enum retentionPolicy { /***アノテーションは、コンパイラによって開示されます。 * / source、 / ** *アノテーションは、コンパイラ *によってクラスファイルに記録されますが、実行時にVMが保持する必要はありません。これがデフォルト *動作です。 * / class、 / ** *アノテーションは、コンパイラによってクラスファイルに記録され、実行時にVMによって保持されるため、反射的に読み取ることができます。 * * @see java.lang.reflect.annotatedElement */ runtime} RetentionPolicy.Sourceはソースコードレベルで保持され、コンパイラによって放棄されます(@Overrideはこの種です)。 RetentionPolicy.classは、コンパイラによってコンパイルされたクラスファイルレベルで保持されますが、仮想マシンによって破棄されます。
retentionPolicy.runtimeは実行時まで予約され、反射によって読むことができます。
@targetを見てください:
パッケージjava.lang.Annotation;/***アノテーションタイプが適用されるコンテキストを示します。アノテーションタイプが該当する可能性がある *宣言コンテキストとタイプコンテキストは、JLS 9.6.4.1で指定されており、java.lang.annotation.ElementTypeの定数でソースコードで示されています。 */@documented@retention(retentionPolicy.runtime)@target(elementType.annotation_type)public @interfaceターゲット{/** *注釈型 *を適用できる種類の要素の配列を返します。 * @returnアノテーションタイプの種類の要素の配列 *は */elementType [] value();}に適用できます。@targetは、この注釈の使用を促すために使用されます。値は次のとおりです。
public enum elementType { /**クラス、インターフェイス(注釈タイプを含む)、または列挙宣言* /タイプ、 /**フィールド宣言(enum定数を含む)* /**メソッド宣言* /メソッド、 /**正式なパラメーター宣言* /パラメーター、 /**建設業者宣言* / */ annotation_type、/ **パッケージ宣言 */パッケージ、/ ** *タイプパラメーター宣言 * @since 1.8 */ type_parameter、/ ** * type * @since 1.8 */ type_use}の使用}この注釈を個別に使用できる場所を示します。1)クラス、インターフェイス、注釈、列挙。 2)属性ドメイン。 3)メソッド; 4)パラメーター。 5)コンストラクター; 6)ローカル変数。 7)注釈タイプ。 8)パッケージ
それで:
@target(elementType.Method)@retention(RetentionPolicy.Source)public @interface Override {}つまり、@Overrideはメソッドでのみ使用でき、ソースコードレベルで保持され、コンパイラによって処理され、廃棄されます。
頻繁に使用されるメタアノテーション@documented:
/** *タイプの注釈は、デフォルトでjavadoc *および同様のツールによって文書化されることを示します。このタイプは、注釈がクライアントによる注釈付き *要素の使用に影響するタイプの *宣言を注釈にするために使用する必要があります。タイプ宣言が *文書化された *で注釈が付けられている場合、その注釈は注釈付き要素の公開api *の一部になります。 */@documented@retention(retentionPolicy.runtime)@target(elementType.annotation_type)public @interface document {}注釈はJavadocによって処理され、ドキュメントに保持されるかどうかを示します。
2。メタアノテーションでカスタムアノテーションをカスタマイズおよび処理します
メタアノテーションを使用すると、必要な注釈をカスタマイズするために使用できます。カスタムアノテーションとAOPまたはフィルターを組み合わせることは、非常に強力な武器です。たとえば、注釈を使用して、アクセス許可の細かい制御を実現できます - クラスまたはメソッドでの許可注釈を使用してから、AOPまたはフィルターでそれらを傍受します。これは、ログイン許可に関する注釈の実装です。
/***ログインアノテーションは必要ありません*/@ターゲット({elementType.Method、elementType.type})@retention(retentionpolicy.runtime)@documentedpublic @interface nologin {}メソッドとクラスで使用できるAnnotation @nologinをカスタマイズしました。注釈は実行時間まで保持され、反射によって読むことができます。この注釈の意味は次のとおりです。@Nologinによって注釈されたクラスまたはメソッドには、ユーザーがログインしていなくてもアクセスできます。以下は、注釈のプロセスです。
/***ログインインターセプターをチェック*ログインを確認する必要がない場合は、@Nologinをメソッドまたはコントローラーに追加できます*/パブリッククラスCheckLoginInterceptor HandlerInterceptor {private static final logger logger = logger.getLogger(checkloginInterceptor.class);オブジェクトハンドラー)スロー{if(!(!(!(!(!)handlermethod)){logger.warn( "現在の操作ハンドラーはhandlermethod =" + handler.getclass()。 handlermethod.getMethod()。getName(); // login nologin = handlermethod.getmethod()。getAnnotation(nologin.class)を確認する必要があるかどうかを判断します。 if(null!= nologin){if(logger.isdebugenabled()){oggger.debug( "current操作methodname =" + methodname + "logn no check login");} nologin = handlermethod.getmethod()。 if(null!= nologin){if(logger.isdebugenabled()){logger.debug( "current operation methodname =" + methodname + "login" no check login ");} if(null == request.getSession()。 "ユーザーはログインしていません、ip =" + request.getRemoteaddr(); respons.getWriter()。write(jsonconvertor.convertfailResult(errorcodeenum.not_login).toString());オブジェクトハンドラー、ModelAndView ModelandView)スロー例外{} @Override public void aftercompletion(httpservletrequest request、httpservletResponse応答、オブジェクトハンドラー、例外EX)スロー例外{}}}}上記のログインインターセプターを定義し、最初に反射を使用して、@nologinによってメソッドに注釈が付けられているかどうかを判断します。
nologin nologin = handlermethod.getMethod()。getAnnotation(nologin.class);
次に、クラスに@nologinによって注釈が付けられているかどうかを判断します。
nologin = handlermethod.getMethod()。getDeclaringClass()。getAnnotation(nologin.class);
注釈が付けられている場合、それは真実に戻ります。注釈が付けられていない場合、ログインしているかどうかが判断されます。ログインしていない場合、エラーメッセージをフォアグラウンドに返します。これは、許可処理のために注釈とフィルターを使用する簡単な例です。拡張すると、注釈を使用して、特定の役割または許可を持つユーザーのみが特定のメソッドまたはクラスにアクセスできることを示し、フィルターで判断できます。
3。スプリングビーンコンテナに関連する注釈
1)@Autowiredは、私たちが最も使用する注釈です。実際、Autowire = bytypeは、ドメイン、メソッド、およびコンストラクターで使用できるタイプ(注釈ベースの依存噴射)に基づく自動噴射依存関係です。
2) @qualifierはautowire = bynameです。 @Autowiredアノテーションが複数のBeanタイプが同じであると判断した場合、 @qualifier( "xxbean")を使用して、従属豆のIDを指定する必要があります。
@Controller @requestMapping( "/user")パブリッククラスHellocontroller {@autowired @qualifier( "userservice")private userservice userservice;3)@ResourceはJSR250標準に属し、ドメインとメソッドで使用されています。また、BYNAMEタイプの依存噴射でもあります。使用方法:@Resource(name = "xxbean")。 @Resourceパラメーターなしデフォルト値クラス名には小文字があります。
4)JSR-330 Standard Javax.Injectの注釈。 @Injectは@Autowiredに相当し、@Namedは @Qualifierと同等であり、@Namedはクラスでも@Componentとして使用されます。
5)@Component、@Controller、@Service、@Repository、これらの注釈は上記の注釈とは異なります。上記の注釈は依存している豆に注入され、これらの注釈の機能は豆を生産することです。これらの注釈はクラスで注釈が付けられ、クラスを春の豆工場で1つずつ豆に注釈します。 @Controller、@Service、@Repositoryは、基本的に@Componentで、より洗練されたセマンティクスがあります。
6)@PostConstructおよび@Predestroyは、依存関係の注入にはなく、豆のライフサイクルに使用されます。 init-method(initializeingbean)destory-method(dasuseablebean)と同様
4。春の注釈の処理
春の注釈の処理は、基本的にインターフェイスBeanPostProcessorを実装することによって行われます。
パブリックインターフェイスbeanpostprocessor {オブジェクトポストプロセスベアイニタイアル化(オブジェクトビーン、ストリングbeanName)はBeanSexceptionをスローします。オブジェクトPostProcessafterInitialization(Object Bean、String BeanName)はBeanSexceptionを投げます;}関連する処理クラスは、AutowiredAnnotationBeanPostProcessor、CommonAnnotationBeanPostProcessor、PersistenceanNotationBeanPostProcessor、AnnotationBeanPostProcessorを必要とします
これらの処理クラスは、<コンテキスト:annotation-config/>を介してスプリングコンテナに暗黙的に構成できます。これらはすべて、依存関係の注入の処理と、生産Beanアノテーションの処理です(@Component、@Controller、@Service、@Repository):
<コンテキスト:Component-Scanベースパッケージ= "net.aazj.service、net.aazj.aop" />
これらは、スキャンされたベースパケットパスを指定し、スプリングビーンコンテナにスキャンすることによって行われます。コンテキスト:Component-Scanは、デフォルトでAutowiredAnnotationBeanPostProcessorとCommonAnnotationBeanPostProcessorも設定します。したがって、<コンテキスト:annotation-config/>は省略できます。さらに、コンテキスト:Component-Scanは@Aspect Style AOP Annotationをスキャンすることもできますが、<aop:saspj-autoproxy/>を協力のために構成ファイルに追加する必要があります。
5。SpringAnnotationsとJSR-330標準注釈の違い:
要約します
上記は、春のさまざまな注釈をすばやく理解することです。私はそれが誰にでも役立つことを願っています。興味のある友人は、このサイトの他の関連トピックを引き続き参照できます。欠点がある場合は、それを指摘するためにメッセージを残してください。このサイトへのご支援をありがとうございました!