版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 阅读苏教版九下文言文的技巧
- 五年级数学(小数除法)计算题专项练习及答案汇编
- 《中高端汽车数字化汽修汽配一站式服务规范》征求意见稿
- 2024年株洲道路旅客运输驾驶员从业资格考试
- 2024年昆明客运资格证专业知识试题及答案
- 2024年海口客运员考试题库答案
- 2024年烟台道路客运从业资格证考试模拟试题
- 小学口算大赛活动方案
- 2024年地税系统内部审计工作方案
- 城市道路临时停车位管理工作方案策划方案
- GB 44504-2024民用爆炸物品专用生产设备危险类别及使用年限
- Unit 2 Last weekend Part A(教学设计)-2023-2024学年人教PEP版英语六年级下册
- Unit 3 What would you like?Part A(教学设计)-2023-2024学年人教PEP版英语五年级上册
- 2024年秋季国家知识产权局专利审查协作四川中心专利审查员招聘笔试(高频重点复习提升训练)共500题附带答案详解
- 2024-2025学年九年级上册数学第一次月考试卷01【人教版】
- 2024年电工(高级技师)考前冲刺必会试题库300题(含详解)
- 酒店改造合同协议书
- 07FJ01~03 防空地下室建筑设计(2007年合订本)
- 《信息安全技术 公共信息网络安全预警指南》
- 老年心房颤动诊治中国专家共识(2024)解读
- 宣城2024年安徽宣城广德市招聘社区工作者15人笔试历年典型考题及考点附答案解析
评论
0/150
提交评论