一、 AOP的基本概念

  1. Aspect(切面):通常是一个类,里面可以定义切入点和通知
  2. Pointcut(切点):就是带有通知的连接点,在程序中主要体现为书写切入点表达式
  3. JointPoint(连接点):程序执行过程中明确的点,一般是方法的调用
  4. Advice(通知):AOP在特定的切入点上执行的增强处理,有before,after,afterReturning,afterThrowing,around
  5. AOP代理:AOP框架创建的对象,代理就是目标对象的加强。Spring中的AOP代理可以使JDK动态代理,也可以是CGLIB代理,前者基于接口,后者基于子类

切面 = 切点+通知

连接点和切入点的区别:

Jointpoint(连接点) 是具体的某个目标方法
Pointcut(切入点) 用于指定 “连接点” 的一个表达式

通知类型

  1. Before:在目标方法被调用之前做增强处理,@Before只需要指定切入点表达式即可
  2. AfterReturning:在目标方法正常完成后做增强,@AfterReturning除了指定切入点表达式后,还可以指定一个返回值形参名returning,代表目标方法的返回值
  3. AfterThrowing:主要用来处理程序中未处理的异常,@AfterThrowing除了指定切入点表达式后,还可以指定一个throwing的返回值形参名,可以通过该形参名来访问目标方法中所抛出的异常对象
  4. After:在目标方法完成之后做增强,无论目标方法时候成功完成。@After可以指定一个切入点表达式
  5. Around:环绕通知,在目标方法完成前后做增强处理,环绕通知是最重要的通知类型,像事务,日志等都是环绕通知,注意编程中核心是一个ProceedingJoinPoint
@Component
@Aspect
public class Operator {@Pointcut("execution(* ...service.*)")public void pointCut(){//配置切点}@Before("pointCut()")public void doBefore(JoinPoint joinPoint){//通知-在目标方法被调用之前做增强处理}@After("pointCut()")public void doAfter(JoinPoint joinPoint){//通知-在目标方法完成之后做增强}@AfterReturning(pointcut="pointCut()",returning="returnVal")public void afterReturn(JoinPoint joinPoint,Object returnVal){//通知-在目标方法正常完成后做增强}@AfterThrowing(pointcut="pointCut()",throwing="error")public void afterThrowing(JoinPoint joinPoint,Throwable error){//通知-主要用来处理程序中未处理的异常}@Around("pointCut()")public void around(ProceedingJoinPoint pjp){//通知-环绕通知,在目标方法完成前后做增强处理,环绕通知是最重要的通知类型,像事务,日志等都是环绕通知System.out.println("AOP Aronud before...");pjp.proceed();//执行目标方法System.out.println("AOP Aronud after...");}
}

二、 编码式实现切面

spring aop常用的就是下面几个注解

  1. @Aspect 标注增强处理类(切面)
  2. @Pointcut 自定义切点位置
  3. @Around 定义增强,环绕通知处理

下面使用编码式如何去实现一个切面

1、定义一个需要被切面处理方法

public class TestMethod {public void test(){System.out.println("测试方法");}
}

2、定义通知方法相当于@Around

@Component
public class TestMethodInterceptor implements MethodInterceptor {@Overridepublic Object invoke(MethodInvocation methodInvocation) throws Throwable {System.out.println("方法调用前");Object proceed = methodInvocation.proceed();System.out.println("方法调用后");return proceed;}
}

3、定义切面编程

public static void main(String[] args) {TestMethod delegate = new TestMethod();//目标TestMethodInterceptor interceptor = new TestMethodInterceptor();//准备通知JdkRegexpMethodPointcut pointcut = new JdkRegexpMethodPointcut ();pointcut.setPattern("com.example.demo.TestMethod.*");//定义切点//切面=切点+通知Advisor advisor = new DefaultPointcutAdvisor(pointcut, interceptor);//创建一个代理工厂ProxyFactory factory = new ProxyFactory();factory.addAdvisor(advisor);//给代理工厂一个切面factory.setTarget(delegate);//需要被代理的对象TestMethod proxy = (TestMethod) factory.getProxy();proxy.test();
}

4、输出:

方法调用前
测试方法
方法调用后

spring注解:spring aop注解详解相关推荐

  1. java注解式开发_JAVA语言之Spring MVC注解式开发使用详解[Java代码]

    本文主要向大家介绍了JAVA语言的Spring MVC注解式开发使用详解,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助. MVC注解式开发即处理器基于注解的类开发, 对于每一个定义的处 ...

  2. spring框架 AOP核心详解

    AOP称为面向切面编程,在程序开发中主要用来解决一些系统层面上的问题,比如日志,事务,权限等待,Struts2的拦截器设计就是基于AOP的思想,是个比较经典的例子. 一 AOP的基本概念 (1)Asp ...

  3. Spring面向切面编程(AOP)详解

    Spring面向切面编程(AOP)详解 面向切面编程(AOP)是Spring框架的另外一个重要的核心内容. 而在讲AOP之前,先来了解一下动态代理这个概念,因为AOP基于动态代理. 动态代理概念:在程 ...

  4. Spring AOP 切点详解

    本文内容 Spring 10种切点表达式详解 切点的组合使用 公共切点的定义 声明切点@Poincut @Poincut 的使用格式如下: @Poincut("PCD") // 切 ...

  5. spring(7)---深入理解Spring核心技术——Spring中的各模块详解

    深入理解Spring核心技术--Spring中的各模块详解 Spring框架的两个基本概念IOC容器和AOP,相信大家现在对Spring中的这两个部分的基本概念有了一定的认识,好了,那么今天我们就来正 ...

  6. 【夯实Spring Cloud】Spring Cloud分布式配置中心详解

    本文属于[夯实Spring Cloud]系列文章,该系列旨在用通俗易懂的语言,带大家了解和学习Spring Cloud技术,希望能给读者带来一些干货.系列目录如下: [夯实Spring Cloud]D ...

  7. 【JAVA秘籍心法篇-Spring】Spring XML解析源码详解

    [JAVA秘籍心法篇-Spring]Spring XML解析源码详解 所谓天下武功,无坚不摧,唯快不破.但有又太极拳法以快制慢,以柔克刚.武功外式有拳打脚踢,刀剑棍棒,又有内功易筋经九阳神功.所有外功 ...

  8. 一对一关联查询注解@OneToOne的实例详解(一)

    转载自: https://www.cnblogs.com/boywwj/p/8092915.html 一对一关联查询注解@OneToOne的实例详解 表的关联查询比较复杂,应用的场景很多,本文根据自己 ...

  9. Spring第三天,详解Bean的生命周期,学会后让面试官无话可说!

    点击下方链接回顾往期 不要再说不会Spring了!Spring第一天,学会进大厂! Spring第二天,你必须知道容器注册组件的几种方式!学废它吊打面试官! 今天讲解Spring中Bean的生命周期. ...

  10. Spring Boot的启动器Starter详解

    Spring Boot的启动器Starter详解 作者:chszs,未经博主允许不得转载.经许可的转载需注明作者和博客主页:http://blog.csdn.net/chszs Spring Boot ...

最新文章

  1. php redis消息队列用哪种好,phpredis提高消息队列的实时性方法(推荐)
  2. 三维重建学习(5):简单地从数学原理层面理解双目立体视觉
  3. 7 天玩转 ASP.NET MVC — 第 6 天
  4. python标准库os中用来列出_Python 标准库 os 中用来列出指定文件夹中的文件和子文件夹列表的方式是listdir()。_高职高专数字资源平台答案_学小易找答案...
  5. win7如何修改dns服务器地址,Win7系统DNS怎么设置?Win7系统DNS设置方法
  6. MIX 2008与ASP.NET MVC框架的Road-Map
  7. Electron —— Cannot find module ‘index.js’
  8. 电脑投屏电视怎么设置_教程 | 小米VR一体机投屏到电视/电脑/手机
  9. 高德地图——地理围栏
  10. 毕业论文格式大全、排版技巧及常见问题汇总
  11. LayoutInflater.inflate()方法的深入理解
  12. Oracle EBS 寄销/VMI(1)--基础设置;寄销/VMI(2)--采购篇
  13. some和every的区别和用法
  14. windows 恢复误删文件
  15. 使用CSS实现多种Noise噪点效果
  16. 基于qt和mysql的学生数据库管理系统
  17. 精英任务 | 第二期券商研报复现挑战赛
  18. java对象内存布局中的基本类型字段排列顺序
  19. 【计算机毕业设计】ssm+jsp二手车交易网站
  20. 宇视网络视频录像机重要录像如何保存

热门文章

  1. elasticsearch源码结构一览
  2. CH32V103_MG996R 舵机驱动
  3. 引导滤波(guided filter)理解和代码实现
  4. JS本地存储加载渲染页面信息、动态更新本地存储数据
  5. log4j发送日志邮件
  6. python resample函数_python resample() 函数
  7. cadence SPB17.4 - allegro - create and switch Visibility view
  8. Kx3551高音质完美功能安装包
  9. VINS-RGBD运行指令
  10. 计算机网络课程设计 文华学院,计算机网络课程设计-校园网的组建与设计.doc