
程序运行期间,将某段代码动态的切入到指定方法的指定位置进行运行的这种编程方式叫AOP
相关概念
横切关注点:就是开始、结束、异常、返回
连接点,每个方法的开始、结束、异常、返回这几个点都是连接点,理解为方法和横切关注点的交点上
切入点:真正需要执行插入方法的连接点
切面类::要插入的增强方法所在类
通知方法:要插入的增强方法
面向切面需要的包
(基本)
spring-aop
spring-beans
spring-context
spring-core
spring-expression
spring-aspects(基本切面)
(面向切面的加强版的包)
com.springsource.net.sf.cglib
com.springsource.org.aopalliance
com.springsource.org.aspectj.weaver
使用切面的基本步骤:
1.目标类和切面类(封装了通知方法)加入ioc容器(Component/Service等4个注解)
2.@Aspect加到切面类上
3.每个通知方法,何时何地运行
@Before 【aspectj中的,以下都是。在目标方法之前】
@After 【最终结束,一般是finally执行的最后】
@AfterReturning【成功返回,不抛异常的情况下】
@AfterThrowing
@Around环绕通知
通知注解里边写切入点表达式如
@Before("execution(public int com.wjm.MyClass.add(int,int))")
最模糊匹配,【可以起作用,但是不要这样写】exceution(* *.*(..))
4.开启基于注解的AOP功能:aop名称空间
------------------------
AOP的底层就是动态代理
容器中保存的组件是他的代理对象,不是原始目标类。
原始目标类有接口,就用java动态代理创建代理类;没有接口就用cglib增强创建代理类。
------------------------
通知方法加个参数JoinPoint(aspectJ下的),可以获得目标方法的相关信息。
再价格参数Object result,并在通知注解上写@AfterReturning(returning="result") 就能获得返回值
------------------------
可重用的切入点表达式
@Pointcut("execution()")
public void xxx()
然后把xxx()写入到其他的通知方法的切入点表达式的注解的地方,表示引用。
------------------------
环绕通知--就是一个动态代理
@Around("execution....")
public void myAround(ProceedingJoinPointpjp)
前置的通知顺序一般无所谓,根据配置随机,而对于其他点(After、AfterReturning、AfterThrowing)的通知方法,环绕通知比普通通知优先,如果目标方法抛出异常的话,环绕通知就把异常“吃掉了”
如果是多个切面类,按照字符顺序(也可以在类上加@Order)排先前置,后置的话就是先切入的后出去。
如果多个切面类,环绕通知只影响他所在类的切面。
------------------------
网友评论