AOP
Aop面向切面编程
1、Aop面向切面编程。是OOP思想(面向对象编程)的拓展和延续。把程序重复的代码抽离出来,在需要执行的时候使用动态代理技术,在不修改源码的基础上,对已有方法进行增强。减少重复代码,提高开发效率,维护方便。
2、Aop的实现方式是动态代理技术。根据是否实现了接口来判断使用基于接口的动态代理(被代理对象至少实现一个接口)还是基于子类(不能是final类)的动态代理。
3、Aop可以减少重复代码,将重复的部分通过动态代理的方式插入到将要执行的代码中。
Aop的组成部分
1、Joinpoint(连接点):
是我们业务层中,连接我们需要增强的部分和业务之间的点,也可认为是需要增强的那些方法,可以在这些方法上加上事务的支持,所以这些方法是连接点。即便没有被业务支持或者说没被增强,它依然是连接点。
2、Pointcut(切入点):
是连接点的同时又被增强的方法,通过动态代理,将通知插入连接点,这个连接点就叫切入点。
3、Advice(通知/增强):
通知就是在拦截到切入点之后要做的事情,类型有
前置通知(before),在切入点方法执行之前执行
后置通知(after-returning),在切入点方法正常执行之后执行
异常通知(after-throwing),方法异常执行之后执行
最终通知(after),无论方法正常不正常都会执行
环绕通知,环绕通知是整个通知部分,其余的通知会在方法中明确说明通知类型。通知是对方法的增强,可能是对当该方法进行的事务操作。
4、Introduction(引介):
是一种特殊的通知,在不修改代码的前提下,在运行期为类动态的添加一些方法或者变量。
5、其他:
Target(目标对象):即被代理对象
Weaving(织入): 在目标对象上加入增强内容生成新的功能更强大的代理对象的过程就是织入。
Proxy(代理):target被织入通知增强后就是代理对象。
Aspect(切面):切入点和通知的结合就是切面。
基于XML的AOP配置步骤
1、 添加xmls:aop的约束
2、 配置spring的IOC将需要增强的类配置进来,即target(目标对象)。
3、 同时将通知的bean也配置进来,交给spring的IOC
4、 使用<aop:condig>声明这里开始了AOP的配置
5、 使用aop:aspect在config里面,表明这是一个配置切面
id属性是给这个切面起名字
ref属性是给这个切面指定通知的bean
6、 在aspect里面使用对应的标签配置通知的类型
Aop:
before:表示通知是前置通知
Method属性:用于指定通知类里面哪个方法是前置通知
Pointcut属性:用于指定切入点表达式,主要是指增强了目标对象target中的哪些方法。
Pointcut:关键字execution(权限修饰符 返回值 类的包下实际路径.具体的方法(参数列表))这个括号里面的代码可以用通配符代替。通常是切入到业务层实现类下的所有方法 com.xxx.service.impl..(…)
7、 Pointcut放在切面配置中的时候代表只有这个切面能用,放到切面外面的时候可以通用aop:pointcut,是指使用通知增强了目标对象/被代理对象中的哪些方法。
Spring的环绕通知:
Xml中配置aop:around 属性有:pointcut-ref指向要增强的业务层的方法 ,method要插入的通知方法。
环绕通知方法的使用事项:
在使用时,需要传入spring提供的一个接口ProceedingJoinPoint作为参数,
该接口提供了一个proceed()方法,
当程序执行时,spring会自动提供该接口实现类。
Object proceed(args)
该方法返回值是方法执行所得的对象。
方法参数是将要增强方法的返回值 pjp。getArgs能自动获得该方法执行所需要的参数。
该方法的异常要用Throwable抛出。
AOP注解配置:context:component-scan