什么是AOP?

aop(Aspect Oriented Programming)面向切面编程,是OOP(Object-Oriented Programing,面向对象编程)的补充和完善。OOP引入封装、继承和多态性等概念来建立一种对象层次结构,用以模拟公共行为的一个集合。但是在为分散的对象引入公共行为的时候,OOP显得无能为力。OOP擅长从上到下的关系,但是不适合从左到右的关系,例如日志、权限,这些功能的代码往往是水平地分布在对象层次中,而与所在的对象的核心功能关系不大。这些代码称为“横切”代码,在OOP中,这导致了大量的代码冗余,且不利于模块间代码的重用。

AOP则擅长于切面编程,将那些影响多个类的公共行为封装到一个模块中,供其他模块重用,便于减少重复代码,降低模块间的耦合度,提高系统的可操作性和可维护性。

一些关于aop的术语

  • Aspect: 切面,包含一些Pointcut和Advice
  • Pointcut:切入点,相当于一个条件,只有符合条件的方法才会走Advice
  • advice:通知,只有符合Pointcut的方法会执行通知,advice分为before,around,after,AfterReturning,AfterThrowing
  • advice通过以下几种通知来确定在什么时候调用advice
    • @before:前置通知,方法执行之前调用advice
    • @around:环绕通知,方法执行前后都会调用advice
    • @after:后置通知,方法执行之后调用advice(无论方法执行是否发送异常,总是调用)
    • @AfterReturning:后置通知,方法执行之后调用advice,可以获取返回值 (无论方法执行是否发送异常,总是调用)
    • @AfterThrowing:后置通知,方法执行中发生异常后调用,可以获取异常信息(只有发生异常才会)

springboot使用aop

创建项目,引入依赖

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

Aspect配置类

@Aspect
@Component
public class MyAspect {
/*
* 切入点
* */
@Pointcut("execution(public * com.jotal.springboot07aop.controller.*.*(..))")
public void execute() { } /*
* 前置通知
* */
@Before(value = "execute()")
public void Before(JoinPoint joinPoint) {
System.out.println("执行方法之前!");
} /*
* 环绕通知
* */
@Around(value = "execute()")
public Object around(ProceedingJoinPoint proceedingJoinPoint){
System.out.println("环绕通知开始");
try {
System.out.println("执行方法:"+proceedingJoinPoint.getSignature().getName());
Object Object = proceedingJoinPoint.proceed();
System.out.println("环绕结束,方法返回:"+Object);
return Object;
} catch (Throwable e) {
System.out.println("执行方法异常:"+e.getClass().getName());
return null;
}
} /*
* 后置通知
* */
@After(value = "execute()")
public void after(){
System.out.println("执行方法之后!");
} /*
* 后置通知,带有返回值
* */
@AfterReturning(pointcut = "execute()",returning = "obj")
public void afterReturn(Object obj){
System.out.println("执行方法后获取返回值:" + obj);
} /*
* 后置通知,异常时执行
* */
@AfterThrowing(throwing = "e",pointcut = "execute()")
public void doAfterThrowing(Exception e){
System.out.println("执行方法异常:" + e.getClass().getName());
}
}

@Aspect :标注切面类

@Component:注入spring ioc容器管理

@Pointcut("execution(public * com.jotal.springboot07aop.controller.*.*(..))"):声明切入点

"execution(public * com.jotal.springboot07aop.controller.*.*(..))":条件表达式, com.jotal.springboot07aop.controller包下的public声明的方法都会使用aop

@Before,@Around,@After,@AfterReturning,@AfterThrowing:通知类型

控制类

@RestController
public class testController { @GetMapping("/useAop")
public String useAop(){
return "方法的返回";
} @GetMapping("/doNotUseAop")
void doNotUseAop(){
System.out.println("doNotUseAop");
} @GetMapping("/throw")
public void throwException(){
throw new RuntimeException();
}
}

测试

有通知

http://localhost:8080/doNotUseAop

无通知

http://localhost:8080/useAop

抛出异常

http://localhost:8080/throw

springboot笔记09——使用aop的更多相关文章

  1. JAVA自学笔记09

    JAVA自学笔记09 1.子类的方法会把父类的同名方法覆盖(重写) 2.final: 1)可修饰类.方法.变量 2)修饰类时:此时该类变为最终类,它将无法成为父类而被继承 3)修饰方法时:该方法将无法 ...

  2. 机器学习实战(Machine Learning in Action)学习笔记————09.利用PCA简化数据

    机器学习实战(Machine Learning in Action)学习笔记————09.利用PCA简化数据 关键字:PCA.主成分分析.降维作者:米仓山下时间:2018-11-15机器学习实战(Ma ...

  3. 强化学习读书笔记 - 09 - on-policy预测的近似方法

    强化学习读书笔记 - 09 - on-policy预测的近似方法 参照 Reinforcement Learning: An Introduction, Richard S. Sutton and A ...

  4. 【SpringBoot】SpingBoot整合AOP

    https://blog.csdn.net/lmb55/article/details/82470388 [SpringBoot]SpingBoot整合AOPhttps://blog.csdn.net ...

  5. C++ GUI Qt4学习笔记09

    C++ GUI Qt4学习笔记09   qtc++ 本章介绍Qt中的拖放 拖放是一个应用程序内或者多个应用程序之间传递信息的一种直观的现代操作方式.除了剪贴板提供支持外,通常它还提供数据移动和复制的功 ...

  6. SpringBoot应用中使用AOP记录接口访问日志

    SpringBoot应用中使用AOP记录接口访问日志 本文主要讲述AOP在mall项目中的应用,通过在controller层建一个切面来实现接口访问的统一日志记录. AOP AOP为Aspect Or ...

  7. Java:并发笔记-09

    Java:并发笔记-09 说明:这是看了 bilibili 上 黑马程序员 的课程 java并发编程 后做的笔记 7. 共享模型之工具-2 原理:AQS 原理 对于 AQS 的原理这部分内容,没很好的 ...

  8. Spring 源码学习笔记10——Spring AOP

    Spring 源码学习笔记10--Spring AOP 参考书籍<Spring技术内幕>Spring AOP的实现章节 书有点老,但是里面一些概念还是总结比较到位 源码基于Spring-a ...

  9. SpringBoot笔记一

    1 开始 1.1 spring介绍 Spring Boot使开发独立的,产品级别的基于Spring的应用变得非常简单,你只需"just run". 我们为Spring平台及第三方库 ...

随机推荐

  1. Dubbo+Zookeeper的简单入门案例

    1.1  Dubbo简介 Apache Dubbo是一款高性能的Java RPC框架.其前身是阿里巴巴公司开源的一个高性能.轻量级的开源Java RPC框架,可以和Spring框架无缝集成. 什么是R ...

  2. 2019_软工实践_Beta(1/5)

    队名:955 组长博客:点这里! 作业博客:点这里! 组员情况 组员1(组长):庄锡荣 过去两天完成了哪些任务 文字/口头描述  检测网站不合理的地方,给组员定下相应时间进度的安排 展示GitHub当 ...

  3. Unity初学者必备5款资源插件

    Unity技术经理Sam Dogantimur为Unity初学者精心挑选和推荐了5款入门必备资源插件,涵盖游戏开发原型创作.着色器特效以及角色控制等,帮助Unity新手快速上手游戏开发. 我们将详细介 ...

  4. Netty执行流程分析与重要组件介绍

    一.环境搭建 创建工程,引入Netty依赖 二.基于Netty的请求响应Demo 1.TestHttpServerHandle  处理器.读取客户端发送过来的请求,并且向客户端返回hello worl ...

  5. PyCharm虚拟环(Project Interpreter)手动安装第三方包图解教程

    PyCharm虚拟环(Project Interpreter)手动安装第三方包图解教程 an鑫_wolfxin2010 关注 2018.03.13 21:58* 字数 313 阅读 3782评论 1喜 ...

  6. 子页面赋值给父页面:window.opener.document.getElementById

    window.opener 返回的是创建当前窗口的那个父窗口的引用,比如点击了a.htm上的一个链接而打开了b.htm,然后我们打算在b.htm上输入一个值然后赋予a.htm上的一个id为“name” ...

  7. [转]JS - Promise使用详解2(ES6中的Promise)

    原文地址:https://www.hangge.com/blog/cache/detail_1638.html 2015年6月, ES2015(即 ECMAScript 6.ES6) 正式发布.其中  ...

  8. C#发起Http请求,调用接口

    //方法1. Post 异步请求,普通的异步请求,传输普通的字符串等,对于有html代码的字段值的传输支持不好,如果需要传输html,二进制等数据的传输,请使用下面第二个方法,即使用UploadDat ...

  9. 必备Linux命令

    文章来源:https://macrozheng.github.io/mall-learning/#/reference/linux 开发者必备Linux命令 开发者必备Linux常用命令,掌握这些命令 ...

  10. 屠龙术&平凡的世界

    x 听过很多道理,却依然过不好这一生 小时候,总觉得世上肯定存在屠龙术.就像<倚天屠龙记>里面张无忌学的<乾坤大挪移>/<九阳真经>一般, 学会了就可以一人单挑光明 ...