코드 요약 마무리의 봄 침습적 방법

봄의 이벤트 여기 진행 마무리, 쉬운 컨트롤, 코드 판독, 어려움의 특정 정도의 후속 유지 보수의 남용에 매우 편리하지만, 일부 코드의 값을 변경하는 방법은 여러 가지입니다.

 

함수는 매개 변수를 수정합니다

argumentResolver

 

@Component 
Public 클래스 HandlerMethodArgumentResolverDemo 구현 HandlerMethodArgumentResolver {
@Override
공개 부울를 supportsParameter (MethodParameter methodParameter) {
경우 (methodParameter = NULL && methodParameter.getParameterType () == String.class && methodParameter.getParameterIndex () == 1!) {
참을 리턴;
}
false를 반환;
}

@Override
공공 개체 resolveArgument (MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer, NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory)는 예외 {던졌습니다
에서 System.out.println ( "HandlerMethodArgumentResolverDemo을");
"HandlerMethodArgumentResolverDemo로 설정 인수"를 반환;
}
}

@SpringBootConfiguration 
공용 클래스 ConfigDemo는 WebMvcConfigurerAdapter {확장
@Autowired
IntercepterDemo intercepterDemo을;
@Override
공공 무효 addInterceptors (InterceptorRegistry 레지스트리) {
registry.addInterceptor (intercepterDemo) .addPathPatterns ( "/ **"); //配置拦截的路径,可以传多个参数
/*registry.addInterceptor (authorityInterceptor) .addPathPatterns ( " / ** "); * /
}
@Autowired
handlerMethodArgumentResolverDemo handlerMethodArgumentResolverDemo;
@Override
공개 무효 addArgumentResolvers (목록 <HandlerMethodArgumentResolver> argumentResolvers) {
argumentResolvers.add (handlerMethodArgumentResolverDemo);
}
}

 

二 인터셉터

 

@Component 
공용 클래스 IntercepterDemo 구현의 HandlerInterceptor는 {
공공 부울 preHandle은 (HttpServletRequest의 요청, HttpServletResponse를 응답 개체 처리기) {예외를 throw
response.addHeader ( "interceptaddhader", "preintercepter");
에서 System.out.println ( "IntercepterDemo의 preintecepter");
true를 반환;
}

공공 공극 postHandle는 (HttpServletRequest의 요청, 응답 HttpServletResponse를, 대상물 핸들러, @Nullable의 ModelAndView의 ModelAndView)는 예외 발생 {
( "postintercepter"를 "interceptaddhader") response.addHeader 단계;
경우 {(의 ModelAndView = 널!)
modelAndView.addObject ( "addObject");
}
에서 System.out.println ( "IntercepterDemo의 postintecepter");
}

공공 무효 afterCompletion은 (HttpServletRequest의 요청, HttpServletResponse를 응답 개체 처리기, @Nullable 예외 예) 예외 {던졌습니다
( "IntercepterDemo afterCompletion")에서 System.out.println;
}
}

上一个例子的ConfigDemo注册了这个intercepter

 

세 .aop 방법

 스프링 AOP, AspectJ를, 더 일반적으로 사용되는, 그들은 말을하지 않습니다

 

네 리스너

 일반 웹 프로젝트 플러스 청취자 :

리스너 인터페이스 카테고리

1ServletContextListener 모니터의 ServletContext 객체

> ServletContextAttributeListener는 추가로의 ServletContext 속성의 작업을 모니터링, 삭제, 수정,

> HttpSessionListener 세션 객체를 모니터링

> HttpSessionActivationListener 활성 청취하고 (하드 디스크 등) 세션, 부동화는 비활성 세션 영구 장치에 기록 지칭 HTTP의 경우 패시베이션 활성 대향.

세션에서> HttpSessionAttributeListener에 모니터 속성 작업

 > ServletRequestListener 청취 Request 객체

동작에서 Requset> ServletRequestAttributeListener 모니터 특성

定义类: 공용  클래스 CountListener의  구현 HttpSessionListener 

구성 청취자 :

  1. <수신기 >
  2.     <리스너 - 클래스 > 웹 .CountListener </ 수신기 - 클래스 >
  3. </ 청취자 >

springboot 구성 리스너 두 예

 

@WebListener 
공용 클래스 ServletRequestListener 구현 javax.servlet.ServletRequestListener {
공공 무효 requestDestroyed (ServletRequestEvent SRE) {
에서 System.out.println ( "청취자"+ sre.getServletContext 대해 getAttributeNames ()의 toString () ()..);
}
}

 

일단 서비스를 게시 할 때 //에만 호출하기 
@WebListener
공용 클래스가 구현의 ServletContextListener {ServletContextListenerDemo
공공 무효 contextInitialized (ServletContextEvent의 SCE) {
에서 System.out.println을 ( "리스너 비"+ sce.getServletContext 대해 getAttributeNames ()의 toString () ()..);
}

공공 무효 contextDestroyed (ServletContextEvent SCE) {
}
}


@SpringBootApplication 
@ServletComponentScan (basePackages = "com.learn.filtertest")
공용 클래스 MvntestApplication {
공공 정적 무효 메인 (문자열 [] 문자열) {
SpringApplication.run (MvntestApplication.class 문자열);
}
}


다섯 필터

 각 요청은 필터되면 실행될

@Component 
공용 클래스 OncePerRequestFilterDemo이 OncePerRequestFilter {확장
@Override는
(HttpServletRequest의 HttpServletRequest의, HttpServletResponse를 HttpServletResponse를, FilterChain filterChain)는 ServletException을 void 오류 doFilterInternal 보호, IOException가 {
httpServletResponse.addHeader ( "qzltest", "예");
에서 System.out.println ( "OncePerRequestFilterDemo는 요청 URI는 :"+ httpServletRequest.getRequestURI ());
filterChain.doFilter (HttpServletRequest의, HttpServletResponse를);
}
}
六RequestBodyAdvice ReqponseBodyAdvice

@ControllerAdvice 
공용 클래스 RequestBodyAdviceDemo 구현의 RequestBodyAdvice {
@Override
공공 부울 지원을 {(? MethodParameter methodParameter는, 유형 유형, 클래스 <HttpMessageConverter <>> aClass 확장)
true를 반환;
}

@Override의
공공 HttpInputMessage beforeBodyRead IOException가 {던졌습니다 (HttpInputMessage httpInputMessage, MethodParameter methodParameter, 유형 유형, 클래스 <? HttpMessageConverter <? >> aClass이 확장)
//httpInputMessage.getBody을 ().
에서 System.out.println ( "RequestBodyAdviceDemo 요청 본문 조언 beforebodyread"+ methodParameter.getMethod () getName ().);
httpInputMessage를 반환;
}

@Override
공공 객체 afterBodyRead {(객체 o를, HttpInputMessage는 MethodParameter methodParameter는, 유형 유형, 클래스 <? HttpMessageConverter <? >> aClass 확장 httpInputMessage)
에서 System.out.println ( "RequestBodyAdviceDemo 요청 본문 조언 afterbodyread"+ methodParameter.getMethod (). 대한 getName ( ));
O를 반환;
}

@Override
공공 객체 handleEmptyBody {(객체 O를, HttpInputMessage httpInputMessage, MethodParameter methodParameter, 유형 유형, 클래스 <? HttpMessageConverter <? >> aClass 확장)
에서 System.out.println ( "RequestBodyAdviceDemo 요청 본문 조언 핸들러 빈 몸"+ methodParameter.getMethod () .getName ());
클래스는 clazz에 methodParameter.getParameterType을 () =;
(clazz에 경우.
"자동 생성"를 반환;
}
o를 리턴;
}
}

@ControllerAdvice 
Public 클래스 ResponseBodyAdviceDemo 구현 ResponseBodyAdvice {
@Override
공개 부울을 지원 (MethodParameter methodParameter 클래스 aClass) {
. 리턴 methodParameter.getMethodAnnotations ()의 길이> = 1;
}

@Override
공공 객체 beforeBodyWrite (객체 O를, MethodParameter methodParameter, MediaType에 mediaType 매개 클래스 aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse의 serverHttpResponse) {
경우 (serverHttpResponse.getHeaders (). containsKey ( "qzltest")) {
에서 System.out.println ( "ResponseBodyAdviceDemo 응답 헤더 qzl 포함 URI는 요청 "+ serverHttpRequest.getURI ());
}
O! = NULL && (만약
"문자열 클래스 ResponseFilterDemo에 의해 추가 :"반환 + (문자열) (을)를;
}
o를 리턴;
}
}

추천

출처www.cnblogs.com/thinkqin/p/11812082.html