Java注記の使用


Java         ,             ,                   。                 。


注記(Annotation)は、Java SE 5.0バージョンで導入され始めた概念であり、classやinterfaceと同様に一種のタイプに属する.多くの開発者は、注記の地位は高くないと考えているが、実はそうではない.@Transactional、@Service、@RestControl ler、@RequestMapping、@CrossOriginなどの注釈の使用頻度はますます高くなっている.
01、なぜ注釈を使うのですか.
なぜ注釈を使うのですか?別の問題から話しましょう.
「ドメインをまたぐ」という2つの字は、犬の皮の膏薬のように先端開発者一人一人にくっついている.私も例外ではありませんが、純粋なフロントエンド開発者ではありません.
ドメイン間の問題の発生は、ブラウザの同源ポリシーに由来します.1つのソースにロードされたスクリプトが別のソースのリソースにアクセスすることを制限し、潜在的な悪意のあるファイルを効果的に隔離する重要なセキュリティメカニズムです.
ドメイン間問題ドメイン間問題ドメイン間問題の解決策もたくさんあります.たとえば、次のようになります.
1)JSONP
2)Nginxエージェント
3)「クロスドメインリソース共有」(Cross-origin resource sharing)は、CORSと略称され、クロスドメイン問題を処理する標準的な方法と言える.
初めてドメインを越えた問題に出会ったとき、私はわざわざ同級生に解決策を教えてもらいました.彼が教えてくれた答えは以下の通りです.
最初のステップはwebです.xml filterを追加します.
<filter>
  <filter-name>contextfilter</filter-name>
  <filter-class>com.cmower.filter.WebContextFilter</filter-class>
</filter>
<filter-mapping>
  <filter-name>contextfilter</filter-name>
  <url-pattern>/*


ステップ2では、WebContextFilterクラスを実装します.
public class WebContextFilter implements Filter {
     

    @Override
    public void destroy() {
     
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
     
        HttpServletResponse  httpServletResponse = (HttpServletResponse) response;
        httpServletResponse.setHeader("Access-Control-Allow-Origin", "*");
        httpServletResponse.setHeader("Access-Control-Allow-Headers", "accept,content-type"); 
        httpServletResponse.setHeader("Access-Control-Allow-Methods", "OPTIONS,GET,POST,DELETE,PUT"); 
        chain.doFilter(request, httpServletResponse);

    }

    @Override
    public void init(FilterConfig arg0) throws ServletException {
     
    }

}

このような解決策を見て、私は本当に崩壊しました.ドメイン間の問題ではないでしょうか.こんなに多くのコードが使えますか.
私はこのような解決策に非常に不満を持っています.そこで、しっかり研究しようと決心して、半日ぐらいかかったでしょう.私はやっと「ドメインを越えた」問題と、その標準的な解決策CORSを明らかにしました.さらに,@CrossOriginという極めて簡潔な解決策が見出され,Controllerクラスにこの注釈を加えるだけで,ドメイン間問題を簡単に解決できる.
コードは次のとおりです.
@RestController
@RequestMapping("course")
@CrossOrigin
public class CourseController {
     
}

02、注釈はどのように定義すればいいですか.
注記@interfaceキーワード(形式とインタフェースは非常に似ていますが、前に@が1つ増えただけです)で定義する必要があります.@CrossOriginのソースコードを開いて見ることができます.
@Target({
      ElementType.METHOD, ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface CrossOrigin {
     
    /**
     * List of allowed origins, e.g. {@code "http://domain1.com"}.
     * 

These values are placed in the {@code Access-Control-Allow-Origin} * header of both the pre-flight response and the actual response. * {@code "*"} means that all origins are allowed. *

If undefined, all origins are allowed. * @see #value */

@AliasFor("value") String[] origins() default { }; /** * List of request headers that can be used during the actual request. *

This property controls the value of the pre-flight response's * {@code Access-Control-Allow-Headers} header. * {@code "*"} means that all headers requested by the client are allowed. *

If undefined, all requested headers are allowed. */

String[] allowedHeaders() default { }; /** * List of supported HTTP request methods, e.g. * {@code "{RequestMethod.GET, RequestMethod.POST}"}. *

Methods specified here override those specified via {@code RequestMapping}. *

If undefined, methods defined by {@link RequestMapping} annotation * are used. */

RequestMethod[] methods() default { }; }

上のコードから分かるように、「注釈」は本当に「注釈」で、注釈が多いことと「メタ注釈」が多いこと以外に、本当にありません.
「メタ注記」?「メタ注釈」とは何ですか.
「元注解」は、注解(動詞)注解(名詞)のための注解(名詞)です.中国語の奥深さを感じてください.@Target、@Retention、@Documentedは、いわゆる元注解です.
1)@Target
ターゲットという意味で、@Targetは注釈運用のシーンを指定しています.どのようなシーン値がありますか?
名前
さぎょう
ElementType.ANNOTATION_TYPE
注記を注記できます
ElementType.CONSTRUCTOR
構造方法に注釈を付けることができます
ElementType.FIELD
フィールドに注釈を付けることができます
ElementType.LOCAL_VARIABLE
ローカル変数に注釈を付けることができます
ElementType.METHOD
メソッドに注釈を付けることができます
ElementType.PACKAGE
パッケージに注釈を付けることができます
ElementType.PARAMETER
メソッド内のパラメータに注釈を付けることができます
ElementType.TYPE
クラス、インタフェース、列挙などのタイプに注釈を付けることができます.
2)@Retention
Retentionという単語の意味は保留期間です.すなわち,@Retentionが1つの注釈に適用されると,この注釈の生存時間を説明する.その値の範囲を見てみましょう.
RetentionPolicy.SOURCE
注記はソース・フェーズでのみ保持され、コンパイラがコンパイルされると無視されます.
RetentionPolicy.CLASS
注記はコンパイル時にのみ保持され、JVMにロードされません.
RetentionPolicy.RUNTIME
注記は、プログラムの実行時に保持され、JVMにロードされるため、プログラムの実行時に取得できます.
3)@Documented
Documentedは、ドキュメントに関連していることがわかりやすいです.注釈の要素をJavadocに含める役割です.
メタ注釈の概念を理解した後、@CrossOriginのソースコードを振り返ってみると、ずっとはっきりしているのではないでしょうか.
ソースコードのコメントを細かく読むと、Access-Clontrol-Allow-Origin、Access-Clontrol-Allow-Hellow-Headers、Access-Clontrol-Allow-Hellow-HellosなどのWebContextFilterクラスに表示されるキーワードが表示されます.すなわち,@CrossOriginによりControllerクラスに注釈を付けると,SpringMVCは実行時にこのクラスにドメイン間問題を解決するフィルタを自動的に加えることができる.
03、注釈は反射できますか?
注記は反射によって取得できます.
1)クラスに指定された注釈が適用されているかどうかをClassオブジェクトのisAnnotationPresent()メソッドで判断できます.
2)getAnnotation()メソッドで注記オブジェクトを取得する.
3)注記オブジェクトを取得すると、注記を使用して定義した属性値を取得できます.
例は次のとおりです.
@CrossOrigin(origins = "http://qingmiaokeji.com", allowedHeaders = "accept,content-type", methods = {
      RequestMethod.GET, RequestMethod.POST })
public class TestController {
     
    public static void main(String[] args) {
     
        Class c = TestController.class;

        if (c.isAnnotationPresent(CrossOrigin.class)) {
     
            CrossOrigin crossOrigin = (CrossOrigin) c.getAnnotation(CrossOrigin.class);

            System.out.println(Arrays.asList(crossOrigin.allowedHeaders()));
            System.out.println(Arrays.asList(crossOrigin.methods()));
            System.out.println(Arrays.asList(crossOrigin.origins()));
        }

    }
}

//   :[accept,content-type]
// [GET, POST]
// [http://qingmiaokeji.com]

04、注釈はよくどこに使いますか.
1)@Transactional:Springトランザクション管理の機能サポート.
2)@Services:Springこのクラスは、パッケージスキャン時に自動的にSpringコンテナに登録されます.
3)@RestController:は@ResponseBodyと@Controllerの組合せ注記です.
すなわち,次のコードは次のコードと同等である.
@RestController
public class HelloController {
     

    @RequestMapping(value="hello")
    public String sayHello(){
     
        return "hello";
    }
}
@Controller
@ResponseBody
public class HelloController {
     

    @RequestMapping(value="hello")
    public String sayHello(){
     
        return "hello";
    }
}

4)@RequestMapping:Spring Webアプリケーションで最もよく使用される注釈の1つで、HTTPリクエストをMVCとRESTコントローラの処理方法にマッピングします.
5)@Select:MyBatisが提供するクエリ文注記.例は次のとおりです.
@Select("select * from city")
List<City> getCitys();

最後に
私が言いたいのは、注釈には多くの役に立つことがあります.主に:
コンパイラに情報を提供:コンパイラは注釈を使用してエラーと警告情報を検出できます.
コンパイルフェーズ時の処理:ソフトウェアツールは注釈情報を利用してコード、HTMLドキュメントを生成することができる.
実行時の処理:プログラムの実行時にコードの抽出を受け入れる注釈があります.