程序员晋级之路——初识AOP

简介: 程序员晋级之路——初识AOP

前言


何为AOP?AOP就是面向切面的编程。

何为面向切面的编程?就像高速公路的省界收费站一样,每条进出我们省的高速都会在省界上设立一个收费站,那么省界就是一个切面,收费站就是我们的处理方案,我们需要做的是定义省界这个面和在面上的收费站的功能。


应用场景


在项目完成之后,交付之前我们一般会对程序进行压力测试,在测试中怎么更加精准的定位系统运行的瓶颈呢?这时候你需要AOP监测每个接口甚至每个方法执行的时间!

在项目做异常处理时,我们怎样才能更加简单明了,将所有异常统一截取到同一个方法中进行处理?这时候你需要AOP将抛出的异常接受并处理!

AOP的定义非常灵活,可以是返回值类型,也可以是注释,也可以是某一个包下的所有方法或者指定方法,所以学习AOP之后,你不需要担心没有用武之地!


AOP结构


首先需要在这个类上添加一个@Aspect注释,这就声明了这个类是一个切面。

如下例子,将所有返回值为指定类型的方法定义为一个切面:

@Aspect
@Component
@Slf4j
public class ResultAspect {
  // 切入点  所有返回值类型是com.test.xbo包下ResultBO的方法
  @Pointcut("execution(public com.test.xbo.ResultBO *(..))")
  public void ResultAspect() {
  }
  // 环绕通知,参数必须为ProceedingJoinPoint,proceed就是被切面的方法
  @Around("ResultAspect()")
  public Object deAround(ProceedingJoinPoint joinPoint) throws Throwable {
      long startTime = System.currentTimeMillis();
      joinPoint.proceed();
      String str = "## 控制器运行时间:" + joinPoint.getSignature() + ":" + (System.currentTimeMillis() - startTime);
    return null;
  }
}


再如,我定义一个注释,将所有添加该注释的方法定义为一个切面:

1、定义一个注释,添加该注释的方法会打印出该方法执行的时间:


@Target({ ElementType.METHOD, ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
public @interface DoneTime {
  String param() default "";
}


2、定义一个切面

@Aspect
@Component
@Slf4j
public class DoneTimeAspect {
  @Around("@annotation(doneTime)")
  public Object around(ProceedingJoinPoint joinPoint, DoneTime doneTime) throws Throwable {
    long startTime = System.currentTimeMillis();
    Object o = joinPoint.proceed();
    String str = "## DoneTime-" + joinPoint.getSignature() + ":" + (System.currentTimeMillis() - startTime);
    log.error(str);
    return o;
  }
}

这样我们就完成了两个非常典型的AOP切面的例子!

相关文章
|
8月前
|
安全 架构师 Java
理论实战源码齐飞!架构师社区疯传的SpringSecurity进阶小册真香
安全管理是Java应用开发中无法避免的问题,随着Spring Boot和微服务的流行,Spring Security受到越来越多Java开发者的重视,究其原因,还是沾了微服务的光。作为Spring家族中的一员,其在和Spring家族中的其他产品如SpringBoot、Spring Cloud等进行整合时,是拥有众多同类型框架无可比拟的优势的。
98 0
|
6月前
|
Java 数据库连接 开发者
从零到一:JAVA反射技术的“逆袭”之路
【7月更文挑战第1天】Java反射技术,从高级特性走向普及,核心是Class类,用于运行时检查和操作类信息。在Spring等框架中,反射实现DI和AOP,提升灵活性。动态代理通过Proxy和InvocationHandler实现方法拦截。反射现已成为Java不可或缺的工具,未来潜力无限。
26 0
|
8月前
|
安全 Java Android开发
程序世界的奇幻旅程:从码农梦想家到JAVA开发实践者
程序世界的奇幻旅程:从码农梦想家到JAVA开发实践者
58 0
|
8月前
|
架构师 Java 数据库连接
震精!十年系统架构师每天熬夜到天明,竟在写Spring企业开发详解
回顾Spring的光辉岁月,一路与时俱进,引领时代之潮流。即便发生了多次版本的升级,其整体框架依然是向下兼容的,在这一点上,Spring明显区别于Struts、Hibernate 等框架的升级风格。
|
Java 测试技术 API
美团java研发岗二面:微服务问题被虐哭了,直到看到这些知识点
微服务架构基于一个概念,其中所有服务应该能够彼此交互以构建业务功能。因此,要实现这一点,每个微服务必须具有接口。这使得 Web API 成为微服务的一个非常重要的推动者。RESTful API 基于 Web 的开放网络原则,为构建微服务架构的各个组件之间的接口提供了最合理的模型。
102 0
美团java研发岗二面:微服务问题被虐哭了,直到看到这些知识点
|
设计模式 架构师 Java
白活了!谷歌架构师10年心血汇成的《24种设计模式》,这才是正解
设计模式 设计模式(Design Pattern)是前辈们对代码开发经验的总结,是解决特定问题的一系列套路。它不是语法规定,而是一套用来提高代码可复用性、可维护性、可读性、稳健性以及安全性的解决方案。一看代码一团糟,那这人肯定不怎么样。 现在各种开源框架里满满都是设计模式,所以可以不用但是最好要懂,除非一辈子CRUD,不看框架。
|
前端开发 安全 Java
从萌芽到巨人: 揭秘Rod Johnson与Spring框架的故事
在这个充满创意和技术追求的世界中,有一个名为 Spring 的框架,它孕育了无数创新和成功的故事。这是一个关于持续进化和超越自我的故事,一个激励人心的旅程,由一位富有远见的程序员和他的团队引领着。
MyBatis这样用,同事直呼哇塞,堪称最佳实践
MyBatis是一款非常流行的ORM框架,相信很多小伙伴都在使用。我们经常会把它和MyBatis-Plus或者MBG一起使用,用多了之后对于其一些常规操作就不太熟悉了。最近总结了下MyBatis的实用用法和技巧,希望对大家有所帮助!
|
设计模式 程序员
程序员成长第三篇:好的代码和好的工程师
程序员成长第三篇:好的代码和好的工程师
86 0
|
前端开发 JavaScript Java
有哪些值得学习的spring boot开源项目;默默无闻但有趣的编程语言; 面试的时候怎么介绍项目经验比较出彩|极客观点
有哪些值得学习的spring boot开源项目;默默无闻但有趣的编程语言; 面试的时候怎么介绍项目经验比较出彩|极客观点
127 0