1.动态代理

jdk动态代理:使用jdk的Proxy,Method,InvocationHandler创建代理对象。

jdk动态代理要求目标类必须实现接口

cglib动态代理:第三方的工具库,创建代理对象,原理是继承。通过继承目标类,创建子类。

子类就是代理的对象。要求看目标类不能是final的,方法也不能是finall的

2.动态代理的作用:

1)在目标类源代码不改变的情况下,增加功能。

2)减少代码的重复

3)专注业务逻辑代码

4)解耦合,让你的业务功能和日志,事务非业务功能分离。

3. AOP:面向切面编程,基于动态代理,可以使用jdk,cglib两种代理方式

AOP就是动态代理规范化,把动态代理的实现步骤,方式都定义好了,

让开发人员用一种统一的方式,使用动态代理。

使用使用jdk的Proxy创建代理对象

补充invoke方法

添加类属性target 并写入有参构造方法

2.在实现类中使用jdk的Proxy创建代理对象

/创建目标对象

Student target = new StudentImpl();

//创建InvocationHandler对象

InvocationHandler handler = new MyIncationHandler(target);

//使用Proxy创建代理

Class clazz;

Student proxy = (Student) Proxy.newProxyInstance(target.getClass().getClassLoader(),

​ target.getClass().getInterfaces(),

​ handler);

//通过代理执行方法,会调用handler中的invoke()

proxy.doSome();

aop:看做时动态代理的规范化,把实现动态代理的步骤进行了一个规范,定义

术语:

1.Aspect:切面,来表示增强的功能。

2.JoinPoint : 连接点,来连接业务方法和切面的位置

3.Pointcut : 切入点,之多个连接点方法的集合

4.目标对象:给哪个类的方法增加功能

5.Advice:通知,通知表示切面功能执行的时间

一个切面的三要素:

1.切面的功能代码(切面要干什么)

2.切面的执行位置(使用Pointcut表示切面执行的位置)

3.切面的执行时间(使用Advice表示时间,在目标方法之前,还是目标方法之后)

什么时候考虑用aop技术

1.当要给一个系统中存在的类修改功能,但是原有的类不完善,需要aop增加功能

2.要给一个项目中的多个类,增加一个相同的功能,使用aop

3.给业务方法增加事务,日志输出

aspectj框架的使用

execution(访问修饰符 返回值 包名.类名.方法名(方法参数) 异常)

在配置文件中加入

<aop:aspectj-autoproxy />

1.@Before 前置通知

方法的定义要求:

1.公共方法public

2.方法没有返回值

3.方法名称自定义

4.方法可以有参数,也可以没有参数。

如果有参数,参数不是自定义,有几个参数类型可以使用

myBefore()属性 :

value ,是切入点表达式,表示切面的功能执行的位置

特点:

1.在目标方法前先执行

2.不会改变目标方法的执行结果

3.不会影响目标方法的执行

2.@AfterReturning 后置通知。

方法的定义要求:

1.公共方法public

2.方法可以有返回值

3.方法名称自定义

4.方法是有参数的,推荐是object,参数名自定义(public String afterThing(Object res))

属性 :

value ,是切入点表达式,表示切面的功能执行的位置

returning 返回的类型 和下面方法参数名称一样,建议类型为Object

特点:

1.在目标方法之后执行

2.能根据目标方法的返回值,可以根据返回值做不同的处理

3.可以修改这个返回值

3.@Around 循环通知

方法的定义要求:

1.公共方法public

2.方法必须有返回值 推荐是Object

3.方法名称自定义

4.方法是有固定参数 ProceedingJoinPoint(public Object aro(ProceedingJoinPoint pj))

属性:

value 切入点表达式

特点:

1.它是功能最强的通知

2.在目标方法的前和后都能增强功能

3.控制目标方法是否被调用

4.修改原来目标方法的执行结果

4.@AfterThrowing 异常通知

方法的定义要求:

1.公用方法public

2.没有返回值

3.方法名称自定义

4.方法有一个Exception ,如果还有就是JoinPoint

属性:

1.value 切入点表达式

2.throwing 自定义的变量,表示目标抛出的异常对象

变量名必须和方法的参数名一样

特点:

1.在目标方法抛出异常是执行

2.可以做异常的监控程序,监控目标函数执行时是否有异常

如果有异常,可以发送邮件,短信进行通知

5.@After 最终通知

方法的定义格式

1.公用方法public

2.没有返回值

3.方法名称自定义

4.方法没有参数,如果还有就是JoinPoint

属性:

value 切入点表式

特点:

1.总是会执行

2.在目标方法之后执行的

6.@Pointcut 定义管理切入点

方法:

管理切入点公式

下方方法public,void,没有参数,可用函数名代替该切入点公式

Cglib框架

没有接口类时,Spring自动使用Cglib动态代理

有接口类时,在切面扫面器上加一个属性 proxy-target-class = “true”

文章作者: 郭远
本文链接:
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 郭远的博客空间
Spring Spring
喜欢就支持一下吧
打赏
微信 微信
支付宝 支付宝