spring学习笔记(四)

AOP的概念

         在实际的开发过程中,我们时常都会遇到多段连续代码在很多方法中会重复的使用,这是为了增加代码的复用降低我们的工作量,通常会将这些代码提取出来成为一个独立的方法或者工具类,在其他要使用它的地方直接调用,这种按照程序执行流程顺序提取代码的方式我们叫做纵向切割(请注意这些代码都是连续的)。但是,会存在一些代码无法直接纵向切割提取出来,如我们在使用事务的时候:

……

Public void delete(int id) {

         transManager.beginTransaction();

         业务代码

         transManager.commit();

}

Public void update(int id) {

         transManager.beginTransaction();

         业务代码

         transManager.commit();

}

         这两个方法都是先开启事务,再执行业务代码,最后提交事务,很明显开启事务最后提交事务是重复的代码,按照DRY: Dont repeat yourself.原则这样显然并不是一个好的选择,我们应该把它提取出来,但是直接纵向切割显然是不行的,事务中间的业务代码事都不一样的,我们要提取的代码并不连续,而是包裹着业务代码,这时候就轮到AOP出场了。我们是否可以将事务的开启和事务的提交先提取出来,在代码的编译期、类的装置器或者使用动态代理在程序运行的期间织入这些代码到相应的位子。

       这里提到了三种织入的方式:编译期织入、类装载期织入、动态代理织入,很明显前两种是需要特殊的java编译器或特殊的类装载器才能够完成的,但Spring并没有给我们提供这些,所以Spring Aop使用了动态代理的方式织入代码。

       如果这种织入的假设想要成立,那么首先有一个问题我们必须解决,那就是如何定位的问题,如何定位一段代码要织入的位置,为了解决这个问题,Spring Aop为我们提供了切点(PointCut)以及增强(Advice)两个接口,切点用来确定织入点是哪个类的哪个方法,增强则用来确定织入到方法的前面、后面还是前后都要,或者在抛出异常是织入,同时增强还包含了要织入的代码,所以由一个切点和一个增强就能确定一个切面(包含连接点信息以及横切代码),可以看出来所谓的面向切面编程,其实就是面向PointCutAdvice两个接口编程。


今天先介绍概念,稍后详细介绍PointCut、Advice和动态代理


你可能感兴趣的:(spring,AOP)