Spring核心思想之 AOP:基础概念及注解式AOP初体验
对AOP的理解开始是抽象的,看到切点的匹配方式其实与正则表达式性质大致一样就基本了解AOP是基本是个什么作用了。只是整个概念更抽象,需要具化理解。下图列表是AOP相关概念解释,可能也比较抽象^_^
1)连接点joinPoint:每个service方法的特色时机点都是连接点,是候选点之一。本质是一个关注点的模块化,这个关注点可能会横切多个对象。
2)切入点PointCut:用户定位真正感兴趣的方法。
3)增强通知Advice:横切逻辑+方位信息(具体哪种连接点),可以有前置、后置、返回后、环绕、异常增强类型。
4)目标对象target:
5)代理对象Proxy:它指的是⼀个类被AOP织⼊增强后,产⽣的代理类即代理对象。
6)织入Weaving:它指的是把增强应⽤到⽬标对象来创建新的代理对象的过程。spring采⽤动态代 理织⼊,⽽AspectJ采⽤编译期织⼊和类装载期织⼊。
7)切面Aspect:切面=切入点+增强=切入点+横切逻辑+方位信息。
个人想象理解AOP:一个正在运行中的项目类似于长江中奔腾的江水,现在要在中间架桥()。AOP的作用就是定位哪个方位,怎么架桥,根据条件架几座桥,是大桥还是小桥。
比如:一个log日志针对系统中的某个特定接口方法,这个方法在系统中广泛实现。如果每个实现的方法都自己添加这个log,那不仅增加开发难度,后续维护的工作量会更复杂。那么AOP切面编程就是一个相当契合的解决方法,一个开发维护也方便。
xml配置示例:
图中每个关于aop的属性都很重要也好理解,对pointcut中方法进行printLog方法增强。这个方法在切面id为logUtil中。
实际切点pointcut个人理解本质就是一个正则表达式,了解Spring如何解析这个表达式就可以准确写出想要的系统效果。在Spring 配置概述 - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)中简单介绍了AOP相关的注解配置,下面简单示例:
1)添加Spring AOP支持及AspectJ依赖
2)使用方法规则拦截(等价的两种写法)
Bean定义:
Aspect定义:
测试方法:
测试结果:
3)使用自定义注解类拦截
自定义拦截注解@Action注解:
被拦截类:
Aspect类定义:
测试结果:
综合配置类: