在实际的开发过程当中,咱们时常都会遇到多段连续代码在不少方法中会重复的使用,这是为了增长代码的复用下降咱们的工做量,一般会将这些代码提取出来成为一个独立的方法或者工具类,在其余要使用它的地方直接调用,这种按照程序执行流程顺序提取代码的方式咱们叫作纵向切割(请注意这些代码都是连续的)。可是,会存在一些代码没法直接纵向切割提取出来,如咱们在使用事务的时候:java
……编程
Public void delete(int id) {工具
transManager.beginTransaction();spa
业务代码代理
transManager.commit();接口
}事务
Public void update(int id) {开发
transManager.beginTransaction();编译器
业务代码it
transManager.commit();
}
这两个方法都是先开启事务,再执行业务代码,最后提交事务,很明显开启事务最后提交事务是重复的代码,按照DRY: Dont repeat yourself.原则这样显然并非一个好的选择,咱们应该把它提取出来,可是直接纵向切割显然是不行的,事务中间的业务代码事都不同的,咱们要提取的代码并不连续,而是包裹着业务代码,这时候就轮到AOP出场了。咱们是否能够将事务的开启和事务的提交先提取出来,在代码的编译期、类的装置器或者使用动态代理在程序运行的期间织入这些代码到相应的位子。
这里提到了三种织入的方式:编译期织入、类装载期织入、动态代理织入,很明显前两种是须要特殊的java编译器或特殊的类装载器才可以完成的,但Spring并无给咱们提供这些,因此Spring Aop使用了动态代理的方式织入代码。
若是这种织入的假设想要成立,那么首先有一个问题咱们必须解决,那就是如何定位的问题,如何定位一段代码要织入的位置,为了解决这个问题,Spring Aop为咱们提供了切点(PointCut)以及加强(Advice)两个接口,切点用来肯定织入点是哪一个类的哪一个方法,加强则用来肯定织入到方法的前面、后面仍是先后都要,或者在抛出异常是织入,同时加强还包含了要织入的代码,因此由一个切点和一个加强就能肯定一个切面(包含链接点信息以及横切代码),能够看出来所谓的面向切面编程,其实就是面向PointCut和Advice两个接口编程。
今天先介绍概念,稍后详细介绍PointCut、Advice和动态代理