1>动态代理
- 动态代理是指,程序在整个运行过程中根本就不存在目标类的代理类,目标对象的代理对象只是由代理生成工具(不是真是定义的类)在程序运行是很由JVM根据反射等机制动态生成的。代理对象与目标对象的代理关系在程序运行时才确定
- 动态代理的作用
- 1、在目标类源代码不改变的情况下,增加功能
- 2、减少代码的重复
- 3、专注业务逻辑代码
- 4、解耦合,让你的业务功能和日志,事务非事务功能分离
1.1、JDK动态代理
- 动态代理的实现方式常用的有两种:使用JDK的Proxy,与通过CGLIB生成代理。JDK的动态要求目标对象必须实现接口,这是java设计上的要求。
- 从jdk1.3以来,java语言通过java.lang.reflect包提供桑格类支持代理模式Proxy,Method和InovcationHandler。
1.2、CGLIB动态代理(了解)
- CGLIB(Code Generation Library)是一个开源项目。是一个强大的,高性能,高质量的Code生成库类,它可以在运行期扩展Java类与实现Java接口。它广泛的被许多AOP的框架使用,例如Spring AOP。
- 使用JDK的Proxy实现代理,要求目标类与代理类实现相同的接口。若目标类不存在接口,则无法使用该方式实现。但对于无接口的类,要为其创建动态代理,就要使用CGLIB来实现。
- CGLIB代理的生成原理是生成目标类的子类,而子类是增强过的,这个子类对象就是代理对象。所以,使用CGLIB生成动态代理,要求目标类必须能够被继承,既不能是final的类,也不能包含final方法。
- CGLIB经常被应用在框架中,例如Spring,Hebernate等。cglib的代理效率高于JDK。项目中直接使用动态代理的地方不多,一般都使用框架提供的功能
2>AOP面向切面编程
2.1、AOP基础
- AOP(Aspect Orient Programming),面向切面编程。基于动态代理的,可以使用jdk、cglib两种代理方式
- Aop:就是动态代理的规范化,把动态代理的实现步骤,方式都定义好了,让开发人员用一种统一的方式实现动态代理
- AOP(面向切面编程)
- Aspect:切面,给你的目标类增加的功能,就是切面,如给业务添加日志、事务都是切面
- Orient:面向、对着
- Programming:编程
- oop:面向对象编程
2.2、面向切面编程
- 1、需要在分析项目功能时,找出切面
- 2、合理地安排切面的执行时间(在目标方法前,还是在目标方法后)
- 3、合理的安全切面执行的位置,在哪个类,哪个方法增加增强功能
2.3、AOP术语
- 1、Aspect:切面,表示增强的功能,就是一堆代码,完成某一个功能
- 常见的切面功能有日志、事务、统计信息、参数检查、权限验证
- 2、JoinPoint:连接点,连接业务方法和切面的位置,例如:某类中的业务方法
- 3、PointCut:切入点,指多个连接点方法的集合。多个方法
- 4、目标对象:给哪个类的方法增加功能,这个类就是目标对象
- 5、Advice:通知,通知表示切面功能执行的时间
2.4、切面三要素
- 1、切面的功能代码,切面干什么
- 2、切面的执行位置,使用PointCut表示切面执行的位置
- 3、切面的执行时间,使用Advice表示时间,在目标方法之前,还是目标方法之后
2.5、aop的实现
- aop是一个规范,一个标准
- aop的技术实现框架:
- 1、spring:spring在内部实现了aop规范,能做aop的工作
- spring主要在事务处理时使用aop
- 我们项目开发是很少使用spring的aop实现
- 因为spring的aop比较笨重
- 2、aspectJ:一个开源的专门做aop的框架。
- spring框架中继承了aspectj框架,通过spring就能使用aspectj的功能
- aspectJ框架实现aop有两种方式:
- 1)使用xml的配置文件
- 2)使用注解,我们在项目要做aop功能,一般都使用注解,aspectj有5个注解
3>学习使用aspectj框架
3.1、切面的执行时间
- 切面的执行时间,这个执行时间在规范中叫作Advice(通知、增强)
- 在aspectj框架中使用注解表示的。也可以使用xml配置文件中的标签
- 1)@Before
- 2)@AfterReturning
- 3)@Around
- 4)@AfterThrowing
- 5)@After
3.2、切面执行的位置
- 表示切面执行的位置,使用的是切入点表达式。
- execution("* …service..*(…)")
3.3、切入点表达式
- AspectJ 定义了专门的表达式用于指定切入点。表达式的原型是:
execution(modifiers-pattern? ret-type