热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

springboot中aop切面使用

创建一个aspect切面类AspectFORAOPOrder(99)控制多个Aspect的执行顺序,越小越先执行ComponentpublicclassTes

创建一个aspect切面类

@Aspect // FOR AOP
@Order(99) // 控制多个Aspect的执行顺序,越小越先执行
@Component
public class TestAspect {@Autowiredprivate AopService aopService; //server层,测试aop中可以通过autowire,调用service里面的方法 //execution 方式@Pointcut("execution(* com.zcy.controller..*.show2(..))")public void pointCutZ(){}//自定义注解方式,当然可以放spring自带的注解,使用方式一样@Pointcut(value = "@annotation(com.zcy.annotation.WxdAnnotation)")public void wxdAnnotation() {} //使用零 及:&& || 方法的使用@Before("pointCutZ() && wxdAnnotation()")public void show2Test(){System.out.println("-----LogAspect---show2test");} //使用一@Before("wxdAnnotation()")public void beforeWxdTest(JoinPoint point){System.out.println("beforeWxdTest:"+point.getSignature().getName());}//使用二@Before("@annotation(com.zcy.annotation.ZcyAnnotation)")public void beforeZcyTest(JoinPoint point){System.out.println("beforeZcyTest:"+point.getSignature().getName());}//使用三@Before("@annotation(study)")public void beforeTest(JoinPoint point, StudyAnnotation study) throws Throwable {ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();HttpServletRequest request = attributes.getRequest();// 记录下请求内容System.out.println("URL : " + request.getRequestURL().toString());System.out.println("HTTP_METHOD : " + request.getMethod());System.out.println("IP : " + request.getRemoteAddr());System.out.println("beforeTest:" + study.name());System.out.println("typename:"+point.getSignature().getDeclaringTypeName());System.out.println("funName:"+point.getSignature().getName());Object[] args = point.getArgs();if(args !=null && args.length>0){ShowObject showObject = (ShowObject)args[0];System.out.println(showObject.getId()+","+showObject.getSysCode());}}

//后置异常通知  GloableException 自定义的异常。@AfterThrowing(value = "@annotation(study)",throwing = "ex")public void throwsTest(JoinPoint jp,GlobalErrException ex,StudyAnnotation study){//没看到效果System.out.println("方法异常时执行....."+ex.getiErrorInfo().getMgs());}@After("@annotation(study)")public void afterTest(JoinPoint point, StudyAnnotation study) {System.out.println("afterTest:" + study.name());}@AfterReturning(returning = "ret", value = "@annotation(study)")public void afterReturnTest(Object ret,StudyAnnotation study){System.out.println("afterReturnTest:"+JsonUtility.object2String(ret));aopService.test1();}//环绕通知,环绕增强,相当于MethodInterceptor@Around("@annotation(study)")public Object arround(ProceedingJoinPoint pjp,StudyAnnotation study) throws Throwable{System.out.println("arround---start");Object o = pjp.proceed();System.out.println("方法环绕proceed,结果是 :" + o);System.out.println("arround---end");return o;}

自定义注解  

WxdAnnotation  StudyAnnotation  ZcyAnnotation

代码一样,贴出一个

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface StudyAnnotation {String name();
}

controller 层

@Api("aop相关")
@RestController
@RequestMapping("aop")
public class AopController {@Autowiredprivate AopService aopService;@WxdAnnotation(name="show1wxd")@ZcyAnnotation(name = "show1zcy")@StudyAnnotation(name="show")@ApiOperation("show")@RequestMapping(value = "show",method = RequestMethod.GET)public String show(){System.out.println("show-----");return "OK";}@WxdAnnotation(name="s")@ApiOperation("show2")@RequestMapping(value="/show2",method = RequestMethod.GET)public String show2() {System.out.println("show22-----");return "OK2";}@StudyAnnotation(name="show3")@ApiOperation("show3")@RequestMapping(value="/show3",method = RequestMethod.POST)public ShowObject show3(@RequestBody ShowObject showObject) {System.out.println("show3-----");ShowObject showObject1 = new ShowObject("2222","bbbbbb");return showObject1;}@ApiOperation("show4")@RequestMapping(value="/show4",method = RequestMethod.GET)public ResultBody show4() throws Exception{System.out.println("show4-----");ResultBody showObject1 = new ResultBody();if(1==1){throw new GlobalErrException(BusinessErrorInfo.ERROR);}return showObject1;}
}

dto中ShowObject对象

@Data
@AllArgsConstructor
public class ShowObject {private String id;private String sysCode;}

结果:调用show 结果

arround---start
beforeTest:show
typename:com.zte.daas.zcy.controller.AopController
funName:show
beforeWxdTest:show
beforeZcyTest:show
show-----
方法环绕proceed,结果是 :OK
arround---end
afterTest:show
afterReturnTest:"OK"
--AopService--test1

show4的结果 注释了aroud方法。异常时:执行到after 后,再执行异常部分

URL : http://localhost:8088/aop/show4
HTTP_METHOD : GET
IP : 0:0:0:0:0:0:0:1
beforeTest:show4
typename:com.zcy.controller.AopController
funName:show4
show4-----
afterTest:show4
方法异常时执行.....失败11111111
2018-04-19 13:58:18.266 [http-nio-8088-exec-1] ERROR c.z.common.exception.GlobalErrExceptionHandle - busiErrorHandlerOverJson:9999:失败11111111







二: 切面方法说明

@Aspect

作用是把当前类标识为一个切面供容器读取

@Before
标识一个前置增强方法,相当于BeforeAdvice的功能

@AfterReturning 正常非异常的情况退出调用,否则不调用

后置增强,相当于AfterReturningAdvice,方法退出时执行

@AfterThrowing  异常调用

异常抛出增强,相当于ThrowsAdvice

@After   

final增强,不管是抛出异常或者正常退出都会执行

@Around

环绕增强,相当于MethodInterceptor

3 execution切点函数

execution函数用于匹配方法执行的连接点,语法为:

execution(方法修饰符(可选)  返回类型  方法名  参数  异常模式(可选)) 


参数部分允许使用通配符:

*  匹配任意字符,但只能匹配一个元素

.. 匹配任意字符,可以匹配任意多个元素,表示类时,必须和*联合使用

+  必须跟在类名后面,如Horseman+,表示类本身和继承或扩展指定类的所有类


示例中的* chop(..)解读为:

方法修饰符  无

返回类型      *匹配任意数量字符,表示返回类型不限

方法名          chop表示匹配名称为chop的方法

参数               (..)表示匹配任意数量和类型的输入参数

异常模式       不限




4 更多切点函数

除了execution(),Spring中还支持其他多个函数,这里列出名称和简单介绍,以方便根据需要进行更详细的查询

4.1 @annotation()

表示标注了指定注解的目标类方法

例如 @annotation(org.springframework.transaction.annotation.Transactional) 表示标注了@Transactional的方法

4.2 args()

通过目标类方法的参数类型指定切点

例如 args(String) 表示有且仅有一个String型参数的方法

4.3 @args()

通过目标类参数的对象类型是否标注了指定注解指定切点

如 @args(org.springframework.stereotype.Service) 表示有且仅有一个标注了@Service的类参数的方法

4.4 within()

通过类名指定切点

如 with(examples.chap03.Horseman) 表示Horseman的所有方法

4.5 target()

通过类名指定,同时包含所有子类

如 target(examples.chap03.Horseman)  且Elephantman extends Horseman,则两个类的所有方法都匹配

4.6 @within()

匹配标注了指定注解的类及其所有子类

如 @within(org.springframework.stereotype.Service) 给Horseman加上@Service标注,则Horseman和Elephantman 的所有方法都匹配

4.7 @target()

所有标注了指定注解的类

如 @target(org.springframework.stereotype.Service) 表示所有标注了@Service的类的所有方法

4.8 this()

大部分时候和target()相同,区别是this是在运行时生成代理类后,才判断代理类与指定的对象类型是否匹配

5 逻辑运算符

表达式可由多个切点函数通过逻辑运算组成

5.1 &&

与操作,求交集,也可以写成and

例如 execution(* chop(..)) && target(Horseman)  表示Horseman及其子类的chop方法

5.2 ||

或操作,求并集,也可以写成or

例如 execution(* chop(..)) || args(String)  表示名称为chop的方法或者有一个String型参数的方法

5.3 !

非操作,求反集,也可以写成not

例如 execution(* chop(..)) and !args(String)  表示名称为chop的方法但是不能是只有一个String型参数的方法



推荐阅读
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • Imtryingtofigureoutawaytogeneratetorrentfilesfromabucket,usingtheAWSSDKforGo.我正 ... [详细]
  • 解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法
    本文介绍了解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法,包括检查location配置是否正确、pass_proxy是否需要加“/”等。同时,还介绍了修改nginx的error.log日志级别为debug,以便查看详细日志信息。 ... [详细]
  • Java实战之电影在线观看系统的实现
    本文介绍了Java实战之电影在线观看系统的实现过程。首先对项目进行了简述,然后展示了系统的效果图。接着介绍了系统的核心代码,包括后台用户管理控制器、电影管理控制器和前台电影控制器。最后对项目的环境配置和使用的技术进行了说明,包括JSP、Spring、SpringMVC、MyBatis、html、css、JavaScript、JQuery、Ajax、layui和maven等。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • 利用Visual Basic开发SAP接口程序初探的方法与原理
    本文介绍了利用Visual Basic开发SAP接口程序的方法与原理,以及SAP R/3系统的特点和二次开发平台ABAP的使用。通过程序接口自动读取SAP R/3的数据表或视图,在外部进行处理和利用水晶报表等工具生成符合中国人习惯的报表样式。具体介绍了RFC调用的原理和模型,并强调本文主要不讨论SAP R/3函数的开发,而是针对使用SAP的公司的非ABAP开发人员提供了初步的接口程序开发指导。 ... [详细]
  • WebSocket与Socket.io的理解
    WebSocketprotocol是HTML5一种新的协议。它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • 深入理解Kafka服务端请求队列中请求的处理
    本文深入分析了Kafka服务端请求队列中请求的处理过程,详细介绍了请求的封装和放入请求队列的过程,以及处理请求的线程池的创建和容量设置。通过场景分析、图示说明和源码分析,帮助读者更好地理解Kafka服务端的工作原理。 ... [详细]
  • 在springmvc框架中,前台ajax调用方法,对图片批量下载,如何弹出提示保存位置选框?Controller方法 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
author-avatar
大好
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有