Aspect Oriented Programming
===
动态代理
实现方式
jdk动态代理:使用jdk中的Proxy,InvocationHandler创建代理对象
jdk动态代理要求目标必须实现接口
cglib动态代理:第三方工具库,创建代理对象,原理是继承。通过继承目标类,创建子类。子类就是代理对象,要求目标类和方法不能是final
动态代理的作用
- 在目标类源代码不变的条件下增加功能
- 减少代码冗余
- 使开发人员专注于业务逻辑
- 解耦合,让业务功能和非业务功能分离
AOP(Aspect Oriented Programming)
面向切面编程,基于动态代理,可以使用jdk,cglib两种代理方式。
AOP就是动态代理的规范化,将动态代理的实现步骤和方法都定义好,让开发人员
用统一的方式使用动态代理
-
Aspect:切面,指给目标类额外增加的功能
切面的特点:一般都是非业务方法,常见为日志,事务,统计,参数检查,权限验证等
-
Orient:面向
-
Programming:编程
- 需要在分析项目功能时找出切面(独立于业务的增强方法)
- 合理的安排切面执行时间(目标方法前or后)
- 合理的安排切面执行的位置,在哪个类,哪个方法添加增强功能
一些术语:
- Joinpoint:连接点,连接业务和增强方法的位置
- Pointcut:切入点,指多个连接点的集合
- 目标对象:欲增强方法的类
- Advice:通知,表示切面功能的执行时间
一个切面有三个关键要素
- what:切面的功能代码,要干什么
- where:切面执行位置,用pointcut表示
- when:切面执行时间,用Advice表示
AOP的实现:
aop是一个规范,是动态代理的规范和标准
实现框架:
-
spring:spring在内部实现了aop规范,能做aop工作
spring主要在事务处理使用aop。
但由于其实现较笨重,在项目开发中很少使用spring的aop
-
aspectJ:一个开源的专门做aop的框架,spring框架中集成了aspectj框架,可直接通过spring使用aspectj的功能
实现方式:
- xml配置文件:配置全局事务
- 注解实现是更常用的方法,aspectj有5个注解。
学习aspectj框架的使用
切面的执行时间,这个执行时间在规范中叫做Advice(通知,也有人称为增强),在aspectj框架中使用注解表示执行时间点:(xml标签也可以)
- @Before
- @AfterReturning
- @Around
- @AfterThrowing
- @After
aop实现步骤
具体代码见:
github.com/AndyLeezCode/Learn_Spring/tree/master/ch05-aop-leading
github.com/AndyLeezCode/Learn_Spring/tree/master/ch06-aop-aspectj