spring学习笔记(9)AOP基本概念

通过上一篇文章对AOP的一些实例讲解后,我们在这篇文章中结合一些例子来系统地了解AOP中涉及到的一些基本概念。

1. 增强

上一篇文章我们都在讲增强,但并未谈及它的概念,但通过很多实例分析,我们很容易理解,增强就是为程序执行过程的很多特定地方添加一些新的功能。

2. 连接点

程序执行过程的某个特定位置点,如增强嵌入(织入)处的方法调用前,调用后、抛出异常后等程序执行点,乃至类初始化前后、类销毁前后等,都能称为连接点,它们都带有一定的边界特性。

3. 切点

切点可以理解成“带有目的性”的连接点,当我们带着特定目的,意图在某个连接点织入增强时,这些连接点就成为了切点,它具有“方位”性质,对应于我们的“目的”所在地,比如我们要去吃饭,我们可能要通过gps找周围的饭店,饭店在地图上显示的位置就是一个方位。抽象体现为特定类下特定方法执行前后,异常抛出点等等。

4. 织入

正如它的名字一样,也对应于我们前面介绍增强、切点等概念中提到的,相当于以切点为原点,开始编织一张“增强网”,使这个切点具有增强的特性。,AOP有三种织入方式
1. 编译器织入:通过使用特殊的Java类编译器
2. 类装载期织入:通过特殊的类加载器
3. 动态代理织入:通过运行期为目标类添加增强生成子类的方式

5. 代理

如我们上一篇文章提到的ProxyFactoryBean,它是一个代理类的生成工厂,通过它生成的代理类融合了原类(Target)和增强(myBeforeAdvice,myAfterReturningAdvice等)的特性。

6. 切面

我们把增强覆盖在所有具有方位信息的连接点(切点)就形成了我们强大的切面,这恰是我们的AOP(面向切面编程)的核心概念所在。比如我们在使用mybatis时要为所有名为xxxxMap的DAO层中的类(切入点)添加日志记录(增强),这就形成了一个切面。



面向切面编程的核心在于切面设计,即良好的切点定位和增强配置。通过AspectJ的切点表达式,我们能动态地定位切点,渗透进我们项目的每一个类、方法中。


时间: 2025-01-18 20:47:05

spring学习笔记(9)AOP基本概念的相关文章

Spring学习笔记之aop动态代理(3)

Spring学习笔记之aop动态代理(3) 1.0 静态代理模式的缺点: 1.在该系统中有多少的dao就的写多少的proxy,麻烦 2.如果目标接口有方法的改动,则proxy也需要改动. PersonDao.java public interface PersonDao { public void savePerson(); } PersonDaoImpl.java public class PersonDaoImpl implements PersonDao{ public void save

spring学习笔记(7)AOP前夕[2]CGLib动态代理实例解析

CGLib动态代理基本原理 CGLib--Code Generation Library,它是一个动态字节代码生成库,基于asm.使用CGLib时需要导入asm相关的jar包.而asm又是何方神圣? asm是一个java字节码操纵框架,它能被用来动态生成类或者增强既有类的功能.ASM 可以直接产生二进制 class 文件,也可以在类被加载入 Java 虚拟机之前动态改变类行为.Java class 被存储在严格格式定义的 .class文件里,这些类文件拥有足够的元数据来解析类中的所有元素:类名称

spring学习笔记(6)AOP前夕[1]jdk动态代理实例解析

JDK动态代理技术 动态代理最常见应用是AOP(面向切面编程).通过AOP,我们能够地拿到我们的程序运行到某个节点时的方法.对象.入参.返回参数,并动态地在方法调用前后新添一些新的方法逻辑,来满足我们的新需求,比如日志记录等. 动态代理常见有两种方式:基于JDK的反射技术的动态代理和基于CGLib的动态代理. 使用反射技术创建动态代理 JDK创建动态代理的核心是java.lang.reflect.InvocationHandler接口和java.lang.reflect.Proxy类.让我们先分

spring学习笔记(8)AOP增强(advice)配置与应用

增强类型 增强(advice)主要包括如下五种类型 1. 前置增强(BeforeAdvice):在目标方法执行前实施增强 2. 后置增强(AfterReturningAdvice):在目标方法执行后实施增强 3. 环绕增强(MrthodInterceptor):在目标方法执行前后实施增强 4. 异常抛出增强(ThrowsAdvice):在目标方法抛出异常后实施增强 5. 引介增强(IntroductionIntercrptor):在目标类中添加一些新的方法和属性 前置增强和后置增强配置 下面通过

spring学习笔记(13)基于Schema配置AOP详解

基于Schema配置入门实例 除了基于@AspectJ注解的形式来实现AOP外,我们还可以在IOC容器中配置.先来看看一个常见的应用场景,在我们的web项目中,我们需要为service层配置事务,传统的做法是在每个业务逻辑方法重复下面配置中: Created with Raphaël 2.1.0程序开始1. 获取DAO层封装好的数据库查询API,如HIbernate中的SessionFactory/Session和mybatis中的xxxMapper2. 开启事务3. 根据入参查询数据库完成相应

spring学习笔记(10)@AspectJ研磨分析[1]入门、注解基本介绍

@AspectJ准备 AspectJ是一个面向切面的框架,它扩展了Java语言.AspectJ定义了AOP语法所以它有一个专门的编译器用来生成遵守Java字节编码规范的Class文件. 在使用AspectJ之前,我们需要导入aspectJ相应的jar包,可到我的资源页http://download.csdn.net/detail/qwe6112071/9468329 中下载,而如果使用maven则可直接在pom.xml中加入如下代码: <dependency> <groupId>o

spring学习笔记(21)编程式事务配置,service层概念引入

访问数据库事务导入 在我之前的文章<spring学习笔记(19)mysql读写分离后端AOP控制实例>中模拟数据库读写分离的例子,在访问数据库时使用的方法是: public <E> E add(Object object) { return (E) getSessionFactory().openSession().save(object); } 通过直接开启session而后保存对象.查询数据等操作,是没有事务的.而如果我们的项目规模变大,业务逻辑日益复杂,我们在一个方法中进行大

spring学习笔记(19)mysql读写分离后端AOP控制实例

在这里,我们接上一篇文章,利用JNDI访问应用服务器配置的两个数据源来模拟同时操作不同的数据库如同时操作mysql和oracle等.实际上,上个例子可能用来模拟mysql数据库主从配置读写分离更贴切些.既然如此,在本例中,我们就完成读写分离的模拟在web端的配置实例. 续上次的例子,关于JNDI数据源的配置和spring datasource的配置这里不再重复.下面着重加入AOP实现DAO层动态分库调用.可先看上篇文章<spring学习笔记(18)使用JNDI模拟访问应用服务器多数据源实例 >

spring学习笔记(16)趣谈spring 事件机制[2]:多监听器流水线式顺序处理

上一篇我们使用到的ApplicationListener是无序的,结合异步调度它能满足了我们的大部分应用场景,但现在我们来个另类的需求,我们来模拟一条作业调度流水线,它不能异步,必须按照先后次序执行不同的任务才能得到我们的最终结果. 需求示例:现在假如华中科技大学的小白想要为它的智能机器人作品申报国家创新奖,需要经过学校.省级创新科研机构.国家创新科研机构逐层审核.我们尝试通过事件来实现,核心就在监听器实现SmartApplicationListener接口.示例如下: 1. 配置事件发布者小白