动态代理,以及面向切面编程(AOP)

动态代理:可以在程序的执行过程中,创建代理对象。

通过代理对象执行方法,给目标类的方法增加额外的功能(功能增强)

动态代理

实现方式:

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的技术实现框架:

  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有五个注解。

学习aspectJ框架的使用。

1)切面的执行时间,这个执行时间在规范中叫做Advice(通知,增强)在aspectJ框架中使用注解表示的。也可以使用xml配置文件中的标签
  1. @Before
  2. @AfterReturning
  3. @Around
  4. @AfterThrowing
  5. @After
2)表示切面的执行位置,使用的是切入点表达式

使用aspectJ框架实现aop。

使用aop:目的是给已经存在的一些类和方法,增加额外的功能。前提是不改变原来类的代码

使用aspectJ是实现aop的基本步骤:

  1. 新建maven项目
  2. 加入依赖
    1. spring依赖
    2. aspectJ依赖
    3. junit单元测试
  3. 创建目标类:接口和他的是现类。
    要做的是给类中的方法增加功能
  4. 创建切面类:普通类
    1. 在类的上面要加入注解 @Aspect
    2. 在类中定义方法,方法就是切面要执行的功能代码
      在方法的上面要加入aspectJ中的通知注解,例如@Before
      要需要指定切入点表达式execution()
  5. 创建spring配置文件:声明对象,把对象交给容器统一管理
    声明对象可以使用注解或者xml配置文件
    1. 声明目标对象
    2. 声明切面类对象
    3. 声明aspectJ框架中的自动代理生成器标签。
      自动代理生成器:用来完成代理对象的自动创建功能。
  6. 创建测试类,从spring容器中获取目标对象(实际上就是代理对象)。
    通过代理执行方法,是实现aop功能增强。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值