SpringMVCAOP通过注解方式拦截Controller等实现日志管理分解_第1页
SpringMVCAOP通过注解方式拦截Controller等实现日志管理分解_第2页
SpringMVCAOP通过注解方式拦截Controller等实现日志管理分解_第3页
SpringMVCAOP通过注解方式拦截Controller等实现日志管理分解_第4页
SpringMVCAOP通过注解方式拦截Controller等实现日志管理分解_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Spring MVC AOP 通过注解方式拦截 Controller 等实现日志管理 开始上代码: 注解定义 package mon; import java.lang.annotation.*; /* * author jiankunking * Date: 2016/8/15 * Time: 11:09 * annotation OperationLogger */ Retention(RetentionPolicy.RUNTIME)/ 注解会在 class 中存在,运行时可通过反射获取 Target(ElementType.METHOD)/ 目标是方法 Documented/ 文档生成时

2、,该注解将被包含在 javadoc 中,可去掉 public interface OperationLogger /* * 模块名字 */ String modelName() default ; /* * 操作类型 */ String option(); interface 是用来自定义注释类型的。 括号中列出这个注释 注释的声明用 符号后面跟上这个注释类型的名字, 再后面跟上括号, 中元 素/方法的 key value 对。值必须是常量。 AOP 拦截部分 package mon; import org.apache.log4j.Logger; import org.aspectj.lan

3、g.JoinPoint; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.Signature; import org.aspectj.lang.annotation.*; import org.aspectj.lang.reflect.MethodSignature; import org.springframework.stereotype.Component; import java.lang.reflect.Method; /* * author jiankunking * Date: 2016/8

4、/15 * Time: 11:11 * annotation SysLogAspect */ Aspect Component public class SysLogAspect private static final Logger logger = Logger.getLogger(SysLogAspect.class); * 定义 Pointcut , Pointcut 的名称,此方法不能有返回值,该方法只是一个标示 */ Pointcut(annotation(mon.OperationLogger) public void controllerAspect() System.out.

5、println( 我是一个切入点 ); * 前置通知( Before advice ) :在某连接点( JoinPoint )之前执行的通知,但这个通 知不能阻止连接点前的执行。 * param joinPoint */ Before(controllerAspect() public void doBefore(JoinPoint joinPoint) System.out.println(=SysLogAspect 前置通知开始 =); /handleLog(joinPoint, null); /* 当某连接点退出的时候执行的通知(不论是正常返回还是 * 后通知( After advice

6、 ) 异常退出)。 * param joinPoint */ AfterReturning(pointcut = controllerAspect() public void doAfter(JoinPoint joinPoint) System.out.println(=SysLogAspect 后置通知开始 =); /handleLog(joinPoint, null); 抛出异常后通知( After throwing advice ) : 在方法抛出异常退出时执行的通知。 * param joinPoint * param e */ AfterThrowing(value = contr

7、ollerAspect(), throwing = e) public void doAfter(JoinPoint joinPoint, Exception e) System.out.println(=SysLogAspect 异常通知开始 =); /handleLog(joinPoint, e); * 环绕通知( Around advice ) :包围一个连接点的通知,类似 Web 中 Servlet 规范中 的 Filter 的 doFilter 方法。可以在方法的调用前后完成自定义的行为,也可以选择不执行。 * param joinPoint */ Around(controller

8、Aspect() public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable System.out.println(=SysLogAspect 环绕通知开始 =); /handleLog(joinPoint, null); Object obj= joinPceed(); System.out.println(=SysLogAspect 环绕通知结束 =); return obj; * 日志处理 * * param joinPoint * param e */ private void handl

9、eLog(JoinPoint joinPoint, Exception e) try /获得注解 OperationLogger logger = giveController(joinPoint); if (logger = null) return; String signature = joinPoint.getSignature().toString(); / 获取目标方法签名 String methodName = signature.substring(signature.lastIndexOf(.) + 1, signature.indexOf(); String longTem

10、p = joinPoint.getStaticPart().toLongString(); String classType = joinPoint.getTarget().getClass().getName(); Class clazz = Class.forName(classType); Method methods = clazz.getDeclaredMethods(); System.out.println(methodName: + methodName); for (Method method : methods) if (method.isAnnotationPresent

11、(OperationLogger.class) String clazzName = clazz.getName(); System.out.println(clazzName: + clazzName + , methodName: + methodName); catch (Exception exp) logger.error( 异常信息 :, exp); exp.printStackTrace(); * 获得注解 * param joinPoint * return * throws Exception */ private static OperationLogger giveCon

12、troller(JoinPoint joinPoint) throws Exception Signature signature = joinPoint.getSignature(); MethodSignature methodSignature = (MethodSignature) signature; Method method = methodSignature.getMethod(); if (method != null) return method.getAnnotation(OperationLogger.class); return null; Aspect 通常用于将必

13、要的但和业务无关的逻辑和业务逻辑分离。 Spring 使用的 AOP 注解分为三个层次: 前提条件是在 xml 中放开了 Aspect 放在类头上,把这个类作为一个切面。 Pointcut 放在方法头上,定义一个可被别的方法引用的切入点表达式。 5 种通知。 Before,前置通知,放在方法头上。 After ,后置【 finally 】通知,放在方法头上。 AfterReturning ,后置【 try 】通知,放在方法头上,使用returning 来引用方法返回值。 AfterThrowing,后置【catch】通知,放在方法头上,使用throwing来引用抛出的异常。 Around ,环

14、绕通知,放在方法头上,这个方法要决定真实的方法是否执行,而且必须有返 回值。 在 Maven 中加入以下以依赖 4.0.0 mon spring-mvc-log4j war 1.0-SNAPSHOT SpringMVC + Log4j 1.7 4.3.2.RELEASE 2.6.2 1.2 3.1.0 1.7.4 3.1 org.springframework spring-webmvc $spring.version org.springframework spring-aop $spring.version org.springframework spring-aspects $sprin

15、g.version org.apache.logging.log4j log4j-api $log4j.version org.apache.logging.log4j log4j-core $log4j.version jstl jstl $jstl.version javax.servlet javax.servlet-api $servletapi.version provided log4j log4j 1.2.17 org.aspectj aspectjrt $org.aspectj-version javax.inject javax.inject 1 cglib cglib $c

16、glib.version org.apache.maven.plugins maven-compiler-plugin 3.3 $jdk.version $jdk.version 在 spring-*.xml 中加入 spring 支持,打开 aop 功能 View /WEB-INF/pages/ .jsp 注解也写好了, spring 也配置好了,在 controller 里面怎么用呢? Controller 应用 package com.jiankunking.controller; import mon.OperationLogger; import org.springframewor

17、k.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; Controller RequestMapping(value = /Welcome, produces = text/html;charset=UTF-8) public class WelcomeController OperationLogger(modelName = WelcomeController, option = getWelcome) RequestMapping(value = /getWelcome, method = RequestMethod.POST) public void getWelcome() /异常拦截测试 /int i = 9 / 0; System.out.println(controller 方法

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论