动态代理:可以在程序的执行过程中,创建代理对象。
通过代理对象执行方法,给目标类的方法增加额外的功能(功能增强)
动态代理
实现方式:
jdk动态代理,使用jdk中的Proxy,Method,InvocetionHandler创建代理对象。
Jdk动态代理要求目标类必须实现接口
cglib动态代理:第三方的工具库,创建代理对象,原理是继承。通过继承目标类,创建子类,
子类就是代理对象。要求目标类不能是final的,方法也不能是final的。
JKD动态代理实现步骤
- 创建目标类,SomeServiceImpl目标类,给它的doSome,doOther增加 输出时间,事务
- 创建一个InvocationHandler接口的实现类,在这个类实现给目标方法增加功能。
- 创建使用JDK中 类proxy,创建代理对象。实现创建对象的能力
动态代理的作用:
1)在目标类源代码不改变的情况下,增加功能
2)减少代码的重复
3)专注业务逻辑代码
4)解耦合,让你的业务功能和日志,事务等非业务功能分离
Aop:面向切面编程,基于动态代理的,可以使用jdk,oglib两种代理方式,Aop就是动态代理的规范化,
把动态代理的实现步骤,方式都定义好了,让开发人员用一种统一的方式,使用动态代理。
Aop(Aspect Orient Programming)面向切面编程
Aspect:切面,给你的目标类增加的功能,就是切面
切面的特点:一般都是非业务方法,独立使用的。
Orient:面向,对着。
Programming:编程,
理解面向切面编程:
1)需要在分析项目功能时,找出切面。
2)合理的安排切面的执行时间(在目标方法前,还是目标方法后)
3)合理的安全切面执行的位置,在哪个类,哪个方法增加功能
术语:
1)Aspect:切面,表示增强的功能,就是一堆代码,完成某一个功能。非业务功能,
常见的切面功能有:日志,事务,统计信息,参数检查,权限验证。
2)JoinPoint:连接点,连接业务方法和切面的位置。就是某类中的业务方法。一个方法
3)PointCut:切入点,指多个连接点方法的集合。多个方法
4)目标对象:给哪个类的方法增加功能,这个类就是目标对象
5)Advice:通知,通知表示切面功能执行的时间。
一个切面有三个关键的要素:
1)切面的功能代码,切面干什么
2)切面的执行位置,使用PrintCut表示切面的位置
3)切面的执行时间,使用Advice表示时间,在目标方法之前,还是目标方法之后。
aop的实现
aop是一个规范,是动态代理的一个规范化,一个标准
aop的技术实现框架:
-
spring:spring内部实现类aop规范,能做aop的工作。
spring主要在事务处理时使用aop。
我们项目开发中很少使用spring的aop实现。因为spring的aop比较笨重。 -
aspectJ:一个开源的专门做aop的框架。spring框架中集成了aspectJ框架,通过spring就能使用aspectJ的功能。
aspectJ实现aop有两种方式:- 使用xml配置文件
- 使用注解,项目中要使用aop功能,一般使用注解,aspectJ有五个注解。
学习aspectJ框架的使用。
1)切面的执行时间,这个执行时间在规范中叫做Advice(通知,增强)在aspectJ框架中使用注解表示的。也可以使用xml配置文件中的标签
- @Before
- @AfterReturning
- @Around
- @AfterThrowing
- @After
2)表示切面的执行位置,使用的是切入点表达式
使用aspectJ框架实现aop。
使用aop:目的是给已经存在的一些类和方法,增加额外的功能。前提是不改变原来类的代码
使用aspectJ是实现aop的基本步骤:
- 新建maven项目
- 加入依赖
- spring依赖
- aspectJ依赖
- junit单元测试
- 创建目标类:接口和他的是现类。
要做的是给类中的方法增加功能 - 创建切面类:普通类
- 在类的上面要加入注解 @Aspect
- 在类中定义方法,方法就是切面要执行的功能代码
在方法的上面要加入aspectJ中的通知注解,例如@Before
要需要指定切入点表达式execution()
- 创建spring配置文件:声明对象,把对象交给容器统一管理
声明对象可以使用注解或者xml配置文件- 声明目标对象
- 声明切面类对象
- 声明aspectJ框架中的自动代理生成器标签。
自动代理生成器:用来完成代理对象的自动创建功能。
- 创建测试类,从spring容器中获取目标对象(实际上就是代理对象)。
通过代理执行方法,是实现aop功能增强。