本文共 3071 字,大约阅读时间需要 10 分钟。
视频课程链接:
AOP:Aspect Oriented Programming面向切面编程,是OOP面向对象编程的一种补充
将程序中交叉业务逻辑(事务、日志)代码提取出来,封装成切面,由AOP容器在适当时机(位置)将封装的切面动态的织入到具体业务逻辑中
AOP不是Spring特有的
适用于具有横切逻辑的场合,如事务管理、日志记录、性能监测、异常通知、访问控制等
连接点 Joinpoint
程序执行的某个特定位置,如方法调用前、方法调用后、方法抛出异常时、方法调用前后等
切入点 Pointcut
定位查找到需要的连接点,即切点
增强 Advice 也称为通知
在切点上执行的一段程序代码,用来实现某些功能
目标对象 Target
将执行增强处理的目标类
织入 Weaving
将增强添加到目标类具体切入点上的过程
代理 Proxy
一个类被织入增强后,会产生一个代理类
切面 Aspect
切点和增强的组合
概念:为其他对象提供一种代理,以控制对这个对象的访问,起到中介的作用
通过代理对象访问目标对象,可以增强额外的操作,扩展目标对象的功能
分类:
静态代理
代理类是程序员创建或工具生成
所谓静态就是程序运行之前就已经存在代理类的字节码文件
缺点:代理对象需要和目标对象实现相同的接口,如果接口增加方法,目标对象和代理对象都要维护
动态代理
代理类是程序在运行期间由JVM根据反射等机制动态生成的,自动生成代理类和代理对象
所谓动态就是指在程序运行前不存在代理类的字节码文件
动态代理的两种技术:
jdk技术
Proxy.newProxyInstance(classLoader, //目标类的类加载器 interfaces, //目标类的接口列表 InvocationHandler //交叉业务逻辑);
特点:目标对象必须实现一个或多个接口,如果没有实现任何接口,则无法使用jdk的动态代理,此时可以使用cglib
如果没有实现接口,则通过继承来实现的
步骤:
添加jar包
cglib cglib ${cglib.version}
用法
Enhancer.create(class, //目标类的类型 InvocationHandler, //交叉业务逻辑);
Spring AOP原理就是使用动态代理
Spring AOP支持5种类型的通知(增强)
通知类型 | 实现接口 | 描述 |
---|---|---|
前置通知(增强) | MethodBeforeAdvice | 在方法执行前添加功能 |
后置通知 | AfterReturningAdvice | 在方法执行后添加功能 |
环绕通知 | MethodInterceptor | 在方法执行前后添加功能 |
异常通知 | ThrowsAdvice | 在方法抛出异常后添加功能 |
引入通知(了解) | IntroductionInterceptor | 在目标类中添加新方法和属性 |
注:多个Advice之间不允许有耦合,即多个Advice之间不允许有业务交叉
org.springframework spring-aop org.springframework spring-aspects
定义增强类,实现相应的接口
定义切入点,配置位置信息,指定哪些类的哪些方法需要被执行AOP
使用NameMatchMethodPointcutAdvisor根据方法名匹配切入点
Advisor是Pointcut和Advice的配置器,Pointcut+Advice=Advisor
login logout
使用ProxyFactoryBean配置代理
aop04.service.UserService
logAdvisor
对结果进行缓存的计算器
运行结果如下:
CalcServiceImpl.add33CalcServiceImpl.add3CalcServiceImpl.minus-1.0-1.03
基于命名空间的配置,原理是使用后处理器,更简单
特点:
定义增强类,不需要实现任何接口,但有多种写法:
写法 | 说明 |
---|---|
public void 方法名(JoinPoint) | 前置通知 |
public void 方法名(JoinPoint,Object) | 后置通知 |
public void 方法名(JoinPoint,Exception) | 异常通知 |
public Object 方法名(ProceedingJoinPoint) | 环绕通知 |
切点表达式,一种表达式,用来定义切点位置
语法:within(包名.类名)
匹配该类中的所有方法
匹配特定包中的特定类中特定返回值类型的特定参数的特定方法
语法:execution(表达式)
表达式:返回值类型 包名.类名.方法名(参数类型)
通配符:* 和 ..
转载于:https://blog.51cto.com/12402007/2156511