java 사용자 정의 주석 및 원리

10270 단어 java 기술

사용자 정의 메모 적용 예


springmvcconfig에서 다음과 같은 선행 알림을 정의합니다.
import java.util.Arrays;
import java.util.List;

import com.puhui.flowplatform.manage.filter.RightFilter;
import org.springframework.aop.BeforeAdvice;
import org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.util.ResourceUtils;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver;

import com.alibaba.fastjson.serializer.SerializerFeature;
import com.alibaba.fastjson.support.config.FastJsonConfig;
import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
import com.puhui.flowplatform.manage.interceptor.BeforeControllerInterceptor;

@Configuration
public class SpringMvcConfig extends WebMvcConfigurerAdapter {

    @Override
    public void configureMessageConverters(List> converters) {
        super.configureMessageConverters(converters);
        //       
        FastJsonHttpMessageConverter fastConvert = new FastJsonHttpMessageConverter();
        //           
        FastJsonConfig fastJsonConfig = new FastJsonConfig();
        fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat);
        //              HttpMessageConverter      
        fastConvert.setFastJsonConfig(fastJsonConfig);
        converters.add(fastConvert);
    }

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/swagger-ui.html").addResourceLocations(
                ResourceUtils.CLASSPATH_URL_PREFIX + "/META-INF/resources/");
        registry.addResourceHandler("/static/**").addResourceLocations(ResourceUtils.CLASSPATH_URL_PREFIX + "/static/",
                ResourceUtils.CLASSPATH_URL_PREFIX + "/dist/static/");
        registry.addResourceHandler("/page/**").addResourceLocations(ResourceUtils.CLASSPATH_URL_PREFIX + "/dist/");
        super.addResourceHandlers(registry);
    }

    @Bean
    public ViewResolver viewResolver() {
        FreeMarkerViewResolver resolver = new FreeMarkerViewResolver();
        resolver.setCache(true);
        resolver.setPrefix(ResourceUtils.CLASSPATH_URL_PREFIX + "templates/");
        resolver.setSuffix(".ftl");
        resolver.setContentType("text/html; charset=UTF-8");
        return resolver;
    }

    //   Advice Advisor
    @Bean
    public BeforeAdvice beforeControllerInterceptor() {
        return new BeforeControllerInterceptor();
    }

    @Bean
    public BeanNameAutoProxyCreator beanBeforeAutoProxyCreator() {
        BeanNameAutoProxyCreator beanNameAutoProxyCreator = new BeanNameAutoProxyCreator();
        beanNameAutoProxyCreator.setProxyTargetClass(true);
        //           Bean   
        beanNameAutoProxyCreator.setBeanNames("*Controller");
        //        (            )
        beanNameAutoProxyCreator.setInterceptorNames("beforeControllerInterceptor");
        return beanNameAutoProxyCreator;
    }

    @Bean(name = "rightFilter")
    public FilterRegistrationBean  addRightFilter(){
        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
        filterRegistrationBean.setFilter(new RightFilter());
        filterRegistrationBean.setUrlPatterns(Arrays.asList("/api/*"));

        return filterRegistrationBean;
    }
}

BeforeControllerInterceptor 코드는 다음과 같습니다.
import java.lang.reflect.Method;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.aop.MethodBeforeAdvice;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.annotation.AnnotationUtils;

import com.puhui.flowplatform.common.constants.MegCodeEnums.ResponseCodeEnum;
import com.puhui.flowplatform.common.exception.ServiceException;
import com.puhui.flowplatform.common.model.platform.User;
import com.puhui.flowplatform.common.model.platform.app.AppRequestParam;
import com.puhui.flowplatform.common.utils.CommonUtils;
import com.puhui.flowplatform.manage.annotation.RequiredInterceptor;
import com.puhui.flowplatform.manage.utils.RedisTemplateOperate;


public class BeforeControllerInterceptor implements MethodBeforeAdvice {

    private static final Logger log = LoggerFactory.getLogger(BeforeControllerInterceptor.class);

    @Autowired
    private RedisTemplateOperate redisTmp;

    @SuppressWarnings("rawtypes")
    @Override
    public void before(Method arg0, Object[] arg1, Object arg2) throws Throwable {
        RequiredInterceptor requiredInterceptor = AnnotationUtils.findAnnotation(arg0, RequiredInterceptor.class);
        if (requiredInterceptor != null) {
            //   token
            AppRequestParam appRequestParam = (AppRequestParam) arg1[0];
            String token = appRequestParam.getComm().getToken();
            if (!redisTmp.hasKey(token)) {
                log.info("token:{}    ", token);
                throw new ServiceException(ResponseCodeEnum.C808.getCode());
            } else {
                User user = CommonUtils.getCurUser(token);
                if (null == user) {
                    redisTmp.delete(token);
                    log.error("token:{}    ", appRequestParam.toString());
                    throw new ServiceException(ResponseCodeEnum.C808.getCode());
                }
            }
        }
    }
}

Annotation 정의는 다음과 같습니다.
package com.puhui.flowplatform.manage.annotation;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public abstract @interface RequiredInterceptor {
    boolean required() default true;
}

1 사용자 정의 주석, @interface를 사용하여 필요에 따라 방법체를 정의할 수 있습니다
2 차단할 방법에 주석 적용
@RequiredInterceptor(required = true)

3. 차단기를 차단하고 @requiredInterceptor 주석을 정의한 후 특정한 업무 논리적 판단을 실시한다.
사실 주해는 flag의 작용일 뿐, 주로 논리를 차단하거나 차단기가 효력을 발생시킨다.
우리도 주석을 정하고 권한을 검사할 수 있습니다. @requiredPermission. 그리고 미리 알림을 설정해서 차단기에서 이 주석이 도착했음을 판단하고 권한 검사를 할 수 있습니다.
public class BeforeControllerInterceptor implements MethodBeforeAdvice {

    private static final Logger log = LoggerFactory.getLogger(BeforeControllerInterceptor.class);

    @Autowired
    private RedisTemplateOperate redisTmp;

    @SuppressWarnings("rawtypes")
    @Override
    public void before(Method arg0, Object[] arg1, Object arg2) throws Throwable {
        RequiredInterceptor requiredInterceptor = AnnotationUtils.findAnnotation(arg0, RequiredInterceptor.class);
        if (requiredInterceptor != null) {
            //   token
            AppRequestParam appRequestParam = (AppRequestParam) arg1[0];
            String token = appRequestParam.getComm().getToken();
            if (!redisTmp.hasKey(token)) {
                log.info("token:{}    ", token);
                throw new ServiceException(ResponseCodeEnum.C808.getCode());
            } else {
                User user = CommonUtils.getCurUser(token);
                if (null == user) {
                    redisTmp.delete(token);
                    log.error("token:{}    ", appRequestParam.toString());
                    throw new ServiceException(ResponseCodeEnum.C808.getCode());
                }
            }
        }
    }
}

Method: 메소드 객체 차단
public com.puhui.flowplatform.common.model.Response com.puhui.flowplatform.manage.controller.RoleController.getRolesList(java.lang.String,java.lang.String,javax.servlet.http.HttpServletRequest)
arg1: 방법부터 매개 변수, 하나의 수조로 모든 매개 변수에 방법이 있습니다
arg2:방법이 있는 대상
위의 예는spring에서 제공하는 도구막대 annotation Util을 통해 annotations가 있는지 확인하는 것입니다.다음과 같은 방법을 사용할 수도 있습니다.
public static void main(String[] args) {
    try {
    for (Method method : AnnotationParsing.class
        .getClassLoader()
        .loadClass(('com.journaldev.annotations.AnnotationExample'))
        .getMethods()) {
        // checks if MethodInfo annotation is present for the method
        if (method.isAnnotationPresent(com.journaldev.annotations.MethodInfo.class)) {
            try {
        // iterates all the annotations available in the method
                for (Annotation anno : method.getDeclaredAnnotations()) {
                    System.out.println('Annotation in Method ''+ method + '' : ' + anno);
                    }
                MethodInfo methodAnno = method.getAnnotation(MethodInfo.class);
                if (methodAnno.revision() == 1) {
                    System.out.println('Method with revision no 1 = '+ method);
                    }
 
            } catch (Throwable ex) {
                    ex.printStackTrace();
                    }
        }
    }
    } catch (SecurityException | ClassNotFoundException e) {
            e.printStackTrace();
         }
    }
 
}

주해 해석 및 원리


주해는 표기이고 클래스, 방법, 매개 변수, 속성, 구조기에 응용되는 특수한 수식자로 이해할 수 있다.메모 역할에는 다음 세 가지가 있습니다.
첫 번째: 문서 생성, 자주 사용하는 것은@param@return기다린다
두 번째: 프로필을 대체하는 역할, 특히spring 등 일부 프레임워크에서 주석을 사용하면 프로필의 수량을 대량으로 줄일 수 있다.
세 번째: 코드의 형식을 검사합니다. 예를 들어 @Override. 어떤 방법이 부모 클래스를 덮어쓰는지 확인하는 방법입니다.
주해의 밑바닥도 반사로 실현된 것이다

좋은 웹페이지 즐겨찾기