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. 어떤 방법이 부모 클래스를 덮어쓰는지 확인하는 방법입니다.
주해의 밑바닥도 반사로 실현된 것이다
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
java 사용자 정의 주석 및 원리
springmvcconfig에서 다음과 같은 선행 알림을 정의합니다.
BeforeControllerInterceptor 코드는 다음과 같습니다.
Annotation 정의는 다음과 같습니다.
1 사용자 정의 주석, @...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.
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;
}
}
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());
}
}
}
}
}
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;
}
@RequiredInterceptor(required = true)
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());
}
}
}
}
}
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. 어떤 방법이 부모 클래스를 덮어쓰는지 확인하는 방법입니다.
주해의 밑바닥도 반사로 실현된 것이다
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
java 사용자 정의 주석 및 원리springmvcconfig에서 다음과 같은 선행 알림을 정의합니다. BeforeControllerInterceptor 코드는 다음과 같습니다. Annotation 정의는 다음과 같습니다. 1 사용자 정의 주석, @...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.