コードの概要仕上げのスプリング侵襲的な方法

春の申し出ここに進んで仕上げ、容易な制御、コードの読み取り、難易度のある程度のフォローアップメンテナンスの乱用に、非常に便利であるが、コードの一部の値を変更するには多くの方法を。

 

パラメータを変更する機能

argumentResolver

 

@Component 
パブリッククラスHandlerMethodArgumentResolverDemo実装HandlerMethodArgumentResolver {
@Override
パブリックブールsupportsParameter(MethodParameter methodParameter){
IF(methodParameter = NULL && methodParameter.getParameterType()== String.class && methodParameter.getParameterIndex()== 1!){
trueを返します。
}
falseを返します。
}

@Override
パブリックオブジェクトresolveArgumentは(MethodParameter methodParameter、ModelAndViewContainer modelAndViewContainer、NativeWebRequest nativeWebRequest、WebDataBinderFactory webDataBinderFactory)例外{スロー
するSystem.out.println( "HandlerMethodArgumentResolverDemo")。
「HandlerMethodArgumentResolverDemoによってセット引数」を返します。
}
}

@SpringBootConfiguration 
パブリッククラスConfigDemoはWebMvcConfigurerAdapter {延び
@Autowired
IntercepterDemo intercepterDemoと、
@Override
ます。public void 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の応答、オブジェクト・ハンドラ)が例外{スロー
response.addHeader( "interceptaddhader"、 "preintercepterを");
System.out.println( "IntercepterDemoのpreintecepter");
trueを返します。
}

公共ボイドpostHandle(HttpServletRequestのリクエスト、HttpServletResponseの応答、オブジェクトハンドラ、@NullableのModelAndViewのModelAndView)は例外{スロー
response.addHeader( "interceptaddhader"、 "postintercepterを");
(!のModelAndView = NULL){もし
modelAndView.addObject( "のaddObject");
}
System.out.println( "IntercepterDemoのpostintecepter");
}

公共ボイドafterCompletion(HttpServletRequestのリクエスト、HttpServletResponseの応答、オブジェクトハンドラ、@Nullable例外EX)は例外{スロー
するSystem.out.println( "IntercepterDemo afterCompletionを");
}
}

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

 

三.aop方法

 春-AOP、AspectJの、より一般的に使用される、彼らは話さないだろう

 

四リスナー

 通常のWebプロジェクトプラスリスナー:

リスナーインタフェースカテゴリ

1ServletContextListenerモニタServletContextオブジェクト

> ServletContextAttributeListenerは、このような追加などのServletContext属性の動作を監視、削除、変更、

> HttpSessionListenerのSessionオブジェクトを監視

> 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( "LISTNER" + sre.getServletContext()getAttributeNames()のtoString());
}
}

 

//場合にのみ、一度サービスを公開すると呼ばれるように
@WebListener
パブリッククラスServletContextListenerDemo実装のServletContextListener {
ます。public void contextInitialized(ServletContextEvent SCE){
System.out.printlnは( "LISTNER" + 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)はServletExceptionがをスローボイドdoFilterInternal保護は、IOException {
httpServletResponse.addHeader( "qzltest"、 "YES")。
System.out.println( "OncePerRequestFilterDemoは、リクエストURIは次のとおりです。" + httpServletRequest.getRequestURI());
filterChain.doFilter(HttpServletRequestを、HttpServletResponseの)。
}
}
六RequestBodyAdvice ReqponseBodyAdvice

@ControllerAdvice 
パブリッククラスRequestBodyAdviceDemo実装RequestBodyAdvice {
@Override
公共ブールサポート(MethodParameter methodParameter、タイプtype、クラス<拡張HttpMessageConverter <>> AClassは?){
trueを返します。
}

@Override
公共HttpInputMessage beforeBodyRead(HttpInputMessage httpInputMessage、MethodParameter methodParameter、タイプタイプ、クラス<?延びHttpMessageConverter <?>> AClassは)は、IOExceptionが{スロー
//httpInputMessage.getBodyを()。
System.out.println( "RequestBodyAdviceDemo要求ボディアドバイスbeforebodyread" + methodParameter.getMethod()のgetName());
httpInputMessageを返します。
}

@Override
パブリックオブジェクトafterBodyRead(オブジェクトHttpInputMessage httpInputMessage、MethodParameter methodParameter、タイプtype、O、クラス<?拡張HttpMessageConverter <?>> AClassは){
System.out.printlnは(+ methodParameter.getMethodを( "RequestBodyAdviceDemoリクエストボディのアドバイスはafterbodyread")。のgetName( ));
oを返します。
}

@Override
パブリックオブジェクトhandleEmptyBody {(オブジェクトO、HttpInputMessage httpInputMessage、MethodParameter methodParameter、タイプタイプは、クラス<?HttpMessageConverter <?>> AClassは延びている)
のSystem.out.println( "RequestBodyAdviceDemoリクエストボディアドバイスハンドラ空体" + methodParameter.getMethod ().getName())。
クラスclazz = methodParameter.getParameterType()。
(clazz場合。
「自動生成」を返します。
}
oを返します。
}
}

@ControllerAdvice 
パブリッククラスResponseBodyAdviceDemo実装ResponseBodyAdvice {
@Override
パブリックブール支持体(MethodParameter methodParameter、クラスAClassは){
戻りmethodParameter.getMethodAnnotations()長さ> = 1。
}

@Override
パブリックオブジェクトbeforeBodyWrite(オブジェクトO、MethodParameter methodParameter、のMediaType MEDIATYPE、クラスAClassは、ServerHttpRequest serverHttpRequest、ServerHttpResponse serverHttpResponse){
IF(serverHttpResponse.getHeaders()のcontainsKey)( "qzltest"){
するSystem.out.println( "ResponseBodyAdviceDemo応答は、ヘッダqzlを含有するURIが要求:「+ serverHttpRequest.getURI())。
}
(O!= nullの場合は&&
O +(文字列);: "クラスResponseFilterDemoにより追加、文字列"を返します
}
oを返します。
}
}

おすすめ

転載: www.cnblogs.com/thinkqin/p/11812082.html