一、什么是AOP
AOP是面向切面编程,OOP是面向对象编程。
面向对象编程将软件分解成不同层次的方面,而面向切面编程是将软件的运行过程分解为不同的切面。也就是说面向对象编程是静态的思想,而面向切面编程是更加动态的思想。
假设方法1,方法2和方法3都有共同的代码部分,将这些共同部分抽取出来形成新的方法。再将方法1、2、3分别调用这个新方法。但是如果这新的方法部分由于需求的改变而进行了改动,则之前的方法也需要显式地进行调用。如果想要它们自动地进行调用这新的方法,就可以使用AOP思想进行编程。
AOP分为静态AOP框架和动态AOP框架两种。静态AOP框架是指利用AspectJ技术,在编译时对java代码进行aop增强处理,从而形成新的源码。动态AOP是指利用代理技术,包括jdk的动态代理和cglib代理,在运行时对目标对象进行增强处理。jdk的动态代理针对的是实现了接口的目标对象的代理,cglib代理针对的是没有实现接口的目标对象的代理。一般而言,静态AOP性能更强,spring的动态aop则性能较差。
AOP的基本术语有:切面,连接点,增强处理,切入点。
切面是将增强处理组织起来的集合,增强处理在切面中得到定义。
连接点是程序执行过程中明确的点。在spring的aop中,连接点总是方法的调用。
增强处理就是在在连接点中进行的处理,主要有before,around和after。
可以进行增强处理的连接点就叫切入点。
实现spring AOP时,需要编写的部分只有业务方法,切入点以及增强方法。
为了让切面能自动对相应的bean进行增强,需要在xml文件中进行配置。
二、增强处理及其顺序:
@Aspect
被@Aspect注释过的java类的bean则成为切面。但在spring容器里,对这个切面bean的配置和对普通bean进行配置没有任何区别。
@Before
在目标对象运行之前运行。
@AfterThrowing
主要用于处理程序中未处理的异常。
@After
无论方法正常结束或异常结束,After增强处理都会执行。
@Around
可以安排目标对象的代理执行的时间,并在目标对象之前以及之后进行增强处理。
当同一个切面的切入点相同时,四个增强处理的执行顺序为:
@Around>@Before>@After>@AfteRreturing
使用@Order注解可以控制同一个切入点不同切面的执行顺序。
定义切入点可以用类似构造方法的方式。使用@Pointcut来修饰切入点表达式,同时第二行添加一个返回值为void的方法。其中方法名即为此切入点的定义名。