阿里云大学JavaWeb开发系列课程:Spring框架入门第十六讲回顾

aop的本质就是动态代理

使用静态代理设计模式的原因:在传统的业务层,我们需要加上很多的公共业务或称之为关注点,比较常见的就是日志,安全,权限,缓存,事务等等。如果我们把这些公共业务放到每个方法中,会发现方法中都是重复的代码。本着代码重用的原则,我们把这些重复的代码放到一个公共的方法中去。但由于这些公共的业务不仅是一个业务类要去实现,可能会有很多个,甚至是整个项目中的绝大部分,像增删改查都需要事务的管理。对于这样的情况,更多的是想把它提到一个类中来做,通过类来调用使得它可以重用。但是即使用类来调用,比如说在每个类中写log()方法,然后A.log()去调用它,在业务的方法中至少会有一个调用的代码,这个调用的代码和业务本身没有什么关系,只是我们在执行这个方法时需要用到的附加功能。这样会使得业务不是很纯粹。而且还有了依赖的关系。

领域业务—领域模型

不同的行业涉及到的领域不同,但都会涉及到共同的业务,我们把这些业务抽出来,就成了领域模型,按照这个模型去进行操作。

比如做一个支付的业务(支付模型),要采用第三方去支付,首先接入第三方的接口,在第三方接口中会进行安全检测,身份验证,资金验证,然后才完成支付的操作。

公共业务和领域业务分离

如果通过静态代理来写,会使代理类急剧增加。而且多加了一个类,代码量变大。由此引发了动态代理。

动态代理是为了解决静态代理每个类都需要写代理的弊端。通过动态代理可以代理所有的类,分为接口的代理,类的代理。

接口的代理就是jdk的动态代理,默认就是支持接口的动态代理。而类的代理需要通过ctilip,现在用javaseist比较多,ctilip反而较少。(ctilip,javaseist忘了怎么写的,随便瞎写一个名)

 

通过Proxy生成一个代理类,通过Proxy的静态方法生成一个代理对象(代理实例),return后面这部分。通过代理实例去调用代理实例的方法时,如下图中的getproxy是一个代理实例,通过代理实例调用代理对象(list.remove(0))时,会去触发所对应的InvocationHandler实现的invoke方法。

也就是说生成的这个代理对象(list)一旦去调用方法(remove)(任何方法),就会去触发对应的

InvocationHandler实现的invoke方法。触发的时候,它就会将代理对象所调用的方法对象,传给method

 

代理对象所调用方法的参数传给agrs

对象本身传给proxy

 

在invoke里面我们可以加上公共的业务了

然后去调用方法本身去执行它,通过反射区执行它

spring的aop简单来讲就是动态代理的框架。动态代理需要我们去编写,还比较麻烦。spring的aop只要通过spring来配置一下,把公共的业务放到一个类里面,你把你的领域业务放出来,然后你通过spring的配置,然后它就会将你的公关业务放到领域业务中去,这种编程称为面向切面的编程aop,通过aop可以不去改变原有的代码,增加新的功能。

关注点就是某种公共的业务,切面就是关注点的模块化。

spring将公共的业务在哪个地方去执行分的很细,它分为了在目标方法执行之前去执行,目标方法执行之后去执行,目标方法执行返回值之后去执行,目标方法执行发生异常的时候去执行,目标方法执行环绕之前之后去执行,所以分为了前置通知,后置通知,环绕通知,异常通知等等。

通过连接点pointcut把公关业务和领域业务进行连接,以便在执行领域业务的时候去执行公共业务。连接点提供了一个非常好的表达式,可以通过execution这个表达式去指定某一个类的某一个方法,也可以指定某一个类下的所有方法,还可以指定某一个包下的所有类的所有方法。

并且spring提供了三种方式来实现aop。第一种,它提供了一个接口,我们只需要去实现它的接口就可以了,接口又提供了好几个类型,有异常的类型。。。spring把这种类型称为通知/切面。

第二种,自定义,不具有任何的侵入性,我不用去实现spring给我们提供的接口,我也可以去实现这个业务。

直接配置,依然可以使我们的业务被执行。

第三种,通过spring提供的注解:@Aspect、@Before、@After、@Around

异常通知,当我们在实现spring给我们提供的接口的时候,异常通知接口比较特殊。异常通知其实是一个标识接口

Exception.java

package cn.sxt.log;

import java.lang.reflect.Method;

import org.springframework.aop.ThrowsAdvice;

public class ExceptionLog implements ThrowsAdvice{
	public void afterThrowing(Method method,Exception ex) 
			throws Throwable{
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值