![SpringMVCAOP通过注解方式拦截Controller等实现日志管理分解.doc_第1页](http://file.renrendoc.com/FileRoot1/2020-1/9/9d057b6b-4779-420b-9ef5-44375812541e/9d057b6b-4779-420b-9ef5-44375812541e1.gif)
![SpringMVCAOP通过注解方式拦截Controller等实现日志管理分解.doc_第2页](http://file.renrendoc.com/FileRoot1/2020-1/9/9d057b6b-4779-420b-9ef5-44375812541e/9d057b6b-4779-420b-9ef5-44375812541e2.gif)
![SpringMVCAOP通过注解方式拦截Controller等实现日志管理分解.doc_第3页](http://file.renrendoc.com/FileRoot1/2020-1/9/9d057b6b-4779-420b-9ef5-44375812541e/9d057b6b-4779-420b-9ef5-44375812541e3.gif)
![SpringMVCAOP通过注解方式拦截Controller等实现日志管理分解.doc_第4页](http://file.renrendoc.com/FileRoot1/2020-1/9/9d057b6b-4779-420b-9ef5-44375812541e/9d057b6b-4779-420b-9ef5-44375812541e4.gif)
![SpringMVCAOP通过注解方式拦截Controller等实现日志管理分解.doc_第5页](http://file.renrendoc.com/FileRoot1/2020-1/9/9d057b6b-4779-420b-9ef5-44375812541e/9d057b6b-4779-420b-9ef5-44375812541e5.gif)
已阅读5页,还剩5页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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/文档生成时,该注解将被包含在javadoc中,可去掉public interface OperationLogger /* * 模块名字 */ String modelName() default ; /* * 操作类型 */ String option();interface是用来自定义注释类型的。 注释的声明用符号后面跟上这个注释类型的名字,再后面跟上括号,括号中列出这个注释中元 素/方法的keyvalue对。值必须是常量。AOP拦截部分package mon;import org.apache.log4j.Logger;import org.aspectj.lang.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/15 * Time: 11:11 * annotation SysLogAspect */AspectComponentpublic class SysLogAspect private static final Logger logger = Logger.getLogger(SysLogAspect.class); /* * 定义Pointcut,Pointcut的名称,此方法不能有返回值,该方法只是一个标示 */ Pointcut(annotation(mon.OperationLogger) public void controllerAspect() System.out.println(我是一个切入点); /* * 前置通知(Before advice) :在某连接点(JoinPoint)之前执行的通知,但这个通知不能阻止连接点前的执行。 * param joinPoint */ Before(controllerAspect() public void doBefore(JoinPoint joinPoint) System.out.println(=SysLogAspect前置通知开始=); /handleLog(joinPoint, null); /* * 后通知(After advice) :当某连接点退出的时候执行的通知(不论是正常返回还是异常退出)。 * 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 = controllerAspect(), 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(controllerAspect() 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 handleLog(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 longTemp = 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(OperationLogger.class) & method.getName().equals(methodName) /OpLogger logger = method.getAnnotation(OpLogger.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 giveController(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通常用于将必要的但和业务无关的逻辑和业务逻辑分离。Spring使用的AOP注解分为三个层次: 前提条件是在xml中放开了Aspect放在类头上,把这个类作为一个切面。Pointcut放在方法头上,定义一个可被别的方法引用的切入点表达式。5种通知。 Before,前置通知,放在方法头上。After,后置【finally】通知,放在方法头上。AfterReturning,后置【try】通知,放在方法头上,使用returning来引用方法返回值。AfterThrowing,后置【catch】通知,放在方法头上,使用throwing来引用抛出的异常。Around,环绕通知,放在方法头上,这个方法要决定真实的方法是否执行,而且必须有返回值。在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 $spring.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 $cglib.version org.apache.maven.plugins maven-compiler-plugin 3.3 $jdk.version $jdk.version 在spring-*.xml中加入spring支持,打开aop功能 /WEB-INF/pages/ .jsp 注解也写好了,spring也配置好了,在controller里面怎么用呢?Controller应用package com.jiankunking.controller;import mon.OperationLogger;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;ControllerRequestMapping(value = /Welcome, produces = text/html;charset=UTF-8)public class WelcomeController OperationLogger(modelName = WelcomeController, option = getWelcome) RequestMapping(value = /getWelcome, method = RequestMethod.POST) public
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年全球及中国饲料中间体化学品行业头部企业市场占有率及排名调研报告
- 2025-2030全球高速标签打印机行业调研及趋势分析报告
- 2025年全球及中国汽车座椅加热通风线束行业头部企业市场占有率及排名调研报告
- 2025-2030全球条形码库存管理系统行业调研及趋势分析报告
- 2025-2030全球生物基电池行业调研及趋势分析报告
- 2025年全球及中国农场畜牧管理软件行业头部企业市场占有率及排名调研报告
- 2025-2030全球印刷级热敏纸行业调研及趋势分析报告
- 担保函保证合同
- 2025监控售后维修合同
- 房屋买卖合同范文
- 2025年长沙穗城轨道交通有限公司招聘笔试参考题库含答案解析
- 2024年湖南有色金属职业技术学院高职单招职业技能测验历年参考题库(频考版)含答案解析
- 2025年山东华鲁海运有限公司招聘笔试参考题库含答案解析
- 银川经济技术开发区2024年综合考核评价指标表及评分细则
- 品管圈PDCA改善案例-降低住院患者跌倒发生率
- 《中小学校园食品安全和膳食经费管理工作指引》专题讲座
- 广东省茂名市2023-2024学年高一上学期物理期末试卷(含答案)
- 沙发市场需求与消费特点分析
- 丰顺县县级集中式饮用水水源地基础状况调查和风险评估报告
- 重庆市2023-2024学年七年级上学期期末考试数学试题(含答案)
- 《七律二首 送瘟神》教案- 2023-2024学年高教版(2023)中职语文职业模块
评论
0/150
提交评论