AOP常用术语

1、为什么要用AOP

1)就是为了方便,看一个国外很有名的大师说,编程的人都是“懒人”,因为他把自己做的事情都让程序去做了。用了AOP能让你少写很多代码,这点就够充分了吧。

2)就是为了更清晰的逻辑,可以让你的业务逻辑去关注自己本身的业务,而不去想一些其他的事情。这些其他的事情包括:安全,事物,日志等等。

2、那些AOP术语

切面(Aspect) 切面是通知和切入点的结合。现在发现了吧,没连接点什么事,链接点就是为了让你好理解切点搞出来的,明白这个概念就行了。通知说明了干什么和什么时候干(什么时候通过方法名中的befor,after,around等就能知道),二切入点说明了在哪干(指定到底是哪个方法),这就是一个完整的切面定义。

 

通知、增强处理(Advice) 就是你想要的功能,也就是上说的安全、事物、日子等。你给先定义好,然后再想用的地方用一下。包含Aspect的一段处理代码

通知有以下几种:

(1)前置通知:在动态代理反射原有对象方法或执行环绕通知前执行的通知功能。

(2)后置通知:在动态代理反射原有对象方法或执行环绕通知后执行的通知功能。无论是否抛出异常,它都会被执行。

(3)返回通知:在动态代理反射原有对象方法或执行环绕通知后执行的通知功能。

(4)异常通知:在动态代理反射原有对象方法或执行环绕通知产生异常后执行的通知。

(5)环绕通知:在动态代理中,它可以取代当前被拦截对象的方法,通过参数或反射调用被拦截对象的方法。

 

引入(introduction) 允许我们向现有的类添加新方法属性。这不就是把切面(也就是新方法属性:通知定义的)用到目标类中吗

 

切点(Pointcut) 在动态代理中,被切面拦截的方法就是一个切点,切面将可以将其切点和被拦截的方法按照一定的逻辑织入到约定的流程当中。在连接点的基础上,来定义切点,你的一个类里,有15个方法,那就有十几个连接点了对吧,但是你并不想在所有方法附件都使用通知(使用叫织入,下面再说),你只是想让其中几个,在调用这几个方法之前、之后或者抛出异常时干点什么,那么就用切入点来定义这几个方法,让切点来筛选连接点,选中那几个你想要的方法。

 

连接点(JoinPoint) 连接点是一个判断条件,由它可以指定哪些是切点。对于指定的切点,Spring会生成代理对象去使用对应的切面对其拦截,否则就不会拦截它。spring允许你是通知(Advice)的地方,那可就真多了,基本每个方法的前、后(两者都有也行),或抛出异常是时都可以是连接点,spring只支持方法连接点。其他如AspectJ还可以让你在构造器或属性注入时都行,不过那不是咱们关注的,只要记住,和方法有关的前前后后都是连接点。

 

织入(weaving) 把切面应用到目标对象来创建新的代理对象的过程。织入是一个生成代理对象的过程。实际代理的方法分为静态代理和动态代理。静态代理是在编译class文件时生成的代码逻辑,但是在Spring中并不使用这样的方式。一种是通过ClassLoader也就是在类加载的时候生成的代码逻辑,但是它在应用程序代码运行前就生成对应的逻辑。还有一种是运行期,动态生成代码的方式,这是Spring AOP所采用的方式。

Spring是以JDK和CGLIB动态代理来生成代理对象的。当类的实现存在接口时,Spring将提供JDK动态代理;当类不存在接口的时候没有办法使用JDK动态代理,Spring会采用CGLIB来生成代理对象。

(JDK动态代理时通过接口实现的,CGLIB代理是通过继承来实现的)

 

目标(target) 引入中所提到的目标类,也就是要被通知的对象,也就是真正的业务逻辑,他可以在毫不知情的情况下,被咋们织入切面。二自己专注于业务本身的逻辑。

 

代理(proxy) 怎么实现整套AOP机制的,都是通过代理,这个一会儿给细说。

 

目标对象 – 项目原始的Java组件。

 

AOP代理  – 由AOP框架生成java对象。

 

AOP代理方法 = advice + 目标对象的方法。

3.看一段代码:

@Aspect //声明切面,标记类
public class Audience {
 
@Pointcut("execution(* *.perform(..))") //定义切点,标记方法
public void performance() {}
 
@Before("performance()")  //切点之前执行
public ....      
 
@AfterReturning("performance()")  //切点之后执行
public ...
 
@AfterThrowing("performance()")  //切点抛出异常后执行
public ...
}
<aop:config>
<aop:aspect ref="audience">  //切面代码Bean,标记类
<aop:pointcut id="performance" expression="excution(* *.performance(..))"  />   //定义切点,标记方法
 
<aop:before  method="..."  pointcut-ref="performance" />  //前后通知babalalal
<aop:after-returnning  method="..."  pointcut-ref="performance" />
<aop:after-throwing  method="..."  pointcut-ref="performance" />
 
</aop:aspect>
</aop:config>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值