目录
1.什么是面向切面编程
切面提供了取代继承和委托的另一种可选方案,在使用面向切面编程时,我们可以通过声明的方式定义这个功能要以何种方式在何处应用,而无需修改受影响的类.横切关注点可以被模块化为特殊的类,这些类被称为切面.
- 1定义AOP术语:advise通知,pointcut切点,joinpoint连接点
advise通知:切面也有目标--它必须要完成的工作.在AOP术语中,切面的工作被称为通知.通知定义了切面是什么以及何时使用
spring有5种类型的通知:
1).前置通知before在目标方法被调用之前通知功能
2).后置通知after:在目标方法被调用之后通知
3).返回通知After-returning:目标方法成功执行后调用通知
4).异常通知After-throwing:抛出异常时通知
5).环绕通知Around:方法在调用前后调用后都执行
连接点joinPoint:连接点是在应用执行过程中能够插入切面的一个点.切面代码能够通过这些点插入到应用程序正常的流程中,并添加新的行为
切点pointCut:
切面aspect:是通知和切点的结合,通知和切点共同定义了切面的全部内容---他是什么,在何时和何处完成器功能
引入introduction:引入允许我们向现有的类添加新方法或属性.
织入weaving:织入是把切面应用到目标对象并创新新的代理对象的过程
总结:通知包含了需要用于多个应用对象的横切行为;连接点是程序执行过程中能够应用通知的所有点;切点定义了通知被应用的具体位置;
2.spring对AOP的支持
spring提供了4种类型的AOP支持
1).基于代理的经典spring AOP
2).纯POJO切面
3).@Aspect注解驱动的切面
4).注入式Aspect切面
注意:spring AOP构建在动态代理基础之上,因此spring对AOP的支持局限于方法拦截.如果你的AOP需求超过了简单的方法调用,那么需要考虑使用AspectJ来实现切面
3.spring在运行时通知对象
代理类封装了目标类,并拦截被通知方法的调用,并把调用转发给真正的目标bean.当代理拦截到方法调用时,在调用目标bean之前,会执行切面逻辑. - 通过切点来选择连接点
springAOP支持的指示器有:arg(),@args(),execution(),this(),target,@target(),within(),@within(),@annotation
execution()是我们在编写切点定义时最主要使用的指示器,
1.编写切点@pointcut("execution(* com.zh3721.crowdsource.webapp..controller.*.*(..))")
2.在切点选择中选择bean
可以在切点表达式中使用bean的ID来表示bean,如@pointcut("execution(* com.zh3721.crowdsource.webapp..controller.*.*(..)and bean(XXX))")表示我们在切入controller包下的方法时,限定bean的id为XXX
3.