Javaアノテーション4を理解する

前回の読み物を通して、誰もが注釈を簡単に理解し、簡単なアプリケーションを実行できる必要があります。アノテーションの使い方についてお話ししましょう。

実際、刻々と変化するアノテーションはそのようなものです。つまり、アノテーションはリフレクションによって取得され、次にアノテーションが分析されて、論理処理が実現されます。

遭遇したことがあるかどうかはわかりません。コントローラークラスにアノテーションが追加されると、すべてのメソッドがアクセス許可のフィルタリングまたは認証を実行します。これに初めて遭遇したときは、1つの感覚しかありませんでした------ - - -驚くばかり!

私の心の中で思うことは、偉大な神になるに値するものです。あなたがやりたいことをすべてやってください!

実際、今振り返ると、リクエストのフィルタリングやインターセプトを実現するのはインターセプトとアノテーションの分析であり、特に高度な知識はありません。それでも、会う人にとっては難しいことではなく、難しい人にとっては難しいことではありません。本当に深く入り込んでください。、おお、こんな感じでした!

次に、Springのインターセプター処理を使用して、メソッドのアノテーションのフィルタリングを実現します。

新しいインターセプターを作成します。

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE,ElementType.METHOD})
public @interface TestAnno {

    //多个或者多种过滤,也可以直接使用下面的单种
    String[] values() default {TestConstant.BOSS,TestConstant.STAFF};

//    String value();

}

このアノテーションは理解しやすく、配列コレクションであり、権限をBOSSまたはSTAFFとして定義します。便宜上、定数を格納するためのインターフェイスを作成しました。

package com.example.demoproject.constant;

public interface TestConstant {

    String BOSS = "boss";

    String STAFF = "staff";

}

以下はインターセプターを作成するためのものです。もちろん、インターセプターBeanを作成する必要があります。ロードインターセプターはApplicationContextがロードされる前にあるため、@ Serviceまたは@Componentを直接追加することは正常に挿入できません。したがって、インターセプターをSpringコンテナーにロードする構成を作成します。

package com.example.demoproject.filter;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;

@Configuration
public class InterceptorConfig extends WebMvcConfigurationSupport  {

    @Bean
    public TestInterceptor testInterceptor(){
        return new TestInterceptor();
    }


    @Override
    public void addInterceptors(InterceptorRegistry registry){
        // 拦截所以请求
        registry.addInterceptor(this.testInterceptor()).addPathPatterns("/**");
    }
}

この構成クラスは、Bean of TestInterceptorをロードしてから、このインターセプターをインターセプター・コレクションに追加するためのものです。

次のステップは、このインターセプターを実装することです。最初にコントローラーを見てみましょう

package com.example.demoproject.controller;

import com.example.demoproject.annotion.TestAnno;
import com.example.demoproject.constant.TestConstant;
import com.example.demoproject.emun.TestEnum;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.Map;

@RestController
@TestAnno(values = TestConstant.BOSS)
public class TestController {

    @PostMapping("/test")
    @TestAnno(values = TestConstant.STAFF)
    public Map<String,String> get(){
       Map<String,String> map = new HashMap();
       map.put("response","success");

        return map;
    }
}

このアノテーションはメソッドとクラスに追加できるため、デモンストレーションを追加しました(@Target({ElementType.TYPE、ElementType.METHOD}))

さて、インターセプターの実装を見てみましょう:

package com.example.demoproject.filter;

import com.alibaba.fastjson.JSON;
import com.example.demoproject.annotion.TestAnno;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletMapping;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.lang.invoke.MethodHandle;
import java.lang.reflect.Method;


public class TestInterceptor implements HandlerInterceptor {

    // 在业务处理器处理请求之前被调用
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception{

        if(handler instanceof HandlerMethod){
            HandlerMethod handlerMethod = (HandlerMethod)handler;

            Method method = handlerMethod.getMethod();
            System.out.println(method);
            Class<?> aClass = method.getDeclaringClass();

            TestAnno anno = aClass.getAnnotation(TestAnno.class);
            System.out.println("anno:"+ JSON.toJSONString(anno.values()));
            TestAnno anno1 = method.getAnnotation(TestAnno.class);
            System.out.println("anno1:"+ JSON.toJSONString(anno1.values()));
            System.out.println("--------------");
            String name = request.getParameter("name");
            System.out.println("name:"+name);
        }
//        System.out.println("输出request"+JSON.toJSON(request));
        return true;
    }
    // 在业务处理器处理请求完成之后,生成视图之前执行
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
            throws Exception{
    }
    // 在DispatcherServlet完全处理完请求之后被调用,可用于清理资源
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
            throws Exception{
    }

}

インターセプターはすべての人に知られている必要があるため、あまり紹介しません。ここでの主な処理は、メソッドの前に処理されるpreHandleです。このメソッドには、戻り値、ブール型があり、trueを返し、下降を続け、falseを返し、直接インターセプトされます。

コードからわかるように、要求されたメソッドとクラスを取得し、次にそれらのアノテーションを取得し、アノテーションが期待と一致しているかどうかを判断し、次に判断ロジックを取得できます(この部分は記述していませんが、実際の状況に応じて処理する必要があります)、チェックに失敗した場合はfalseを返し、チェックに合格した場合はtrueを返します。

この場合、注釈傍受要求またはフィルタリング権限構造は完了していますね。

大丈夫だと感じたら、親指を立ててください〜

おすすめ

転載: blog.csdn.net/zsah2011/article/details/105668489