SpringAOP
想不想学AOP啊?我教你啊!=_=
一、AOP的相关概念
AOP面向切面编程,不多说,看概念就去查百度。
相关术语:
通知:切面要完成的工作。
连接点:在应用执行过程中能够插入切面的一个点。
切点:满足时机的连接点中的一个或多个。
切面:需要执行通知的类。
二、Spring中AOP的使用
1、JavaConfig方式
配置类:
@Configuration
@EnableAspectJAutoProxy
public class JavaConfig{
}
切面类:
@Aspect
@Component
public class MyAopClass {
@Pointcut(value = "execution(* cn.zzcfirst.boottest01.controller.TestController.getTaco(..))")
public void pointcut(){}
@Before(value = "pointcut()")
public void before(JoinPoint jp){
System.out.println(jp.getArgs());
System.out.println("---> before method");
}
@After(value = "pointcut()")
public void after(){
System.out.println("--->after");
}
@AfterReturning(value = "pointcut()", returning = "returnValue")
public void afterReturning(Object returnValue){
System.out.println("--->returning");
System.out.println(returnValue);
}
@AfterThrowing(value = "pointcut()", throwing = "err")
public void afterThrowing(Exception err){
System.out.println("--->throwing");
System.out.println(err);
}
@Around(value = "pointcut()")
public void aroundAdivce(ProceedingJoinPoint jp){
try{
System.out.println("before");
System.out.println("after");
jp.proceed();
System.out.println("return");
}catch(Throwable e){
System.out.println("throw");
}
}
}
先来看看我们写的这些东西有什么用。首先我们创建了一个配置类 — JavaConfig。这个类被@Configuration和@EnableAspectJAutoProxy修饰,其中EnableAspectJAutoProxy表示开启AspectJ注解驱动。
具体解释:
@Aspect修饰切面类,表示是一个切面。
@Component修饰切面使得切面可以被添加到容器中。
@Pointcut修饰了一个切点,表示在哪个或哪些方法运行的时候要运行切面方法(表达式语法规则:限定符 返回值 方法全限定名(参数))。
@Before方法在切点执行之前执行,可以使用JoinPoint类作为参数,获取传入切点方法的参数。
@After在切点执行之后执行。
@AfterReturning方法在切点执行之后,且返回结果之后执行,可以使用它的属性returning和切面方法的参数绑定,获取切点方法的返回值。
@AfterThrowing方法在切点抛出异常后执行,可以使用throwing属性和切面方法参数绑定,获取切点抛出的异常。
@Around方法是环绕通知,结合了以上四种基本的通知,格式如上代码所示。
2、XML配置方式
<aop:config>
<aop:aspect ref="MyAopClass">
<aop:pointcut
id="pointcut"
expression="表达式"/>
<aop:before
pointcut-ref="pointcut"
method="要执行的方法"/>
<aop:after
pointcut-ref="pointcut"
method="要执行的方法"/>
<aop:after-returning
pointcut-ref="pointcut"
method="要执行的方法"/>
<aop:after-throwing
pointcut-ref="pointcut"
method="要执行的方法"/>
<aop:around
pointcut-ref="pointcut"
method="要执行的方法"/>
</aop:aspect>
</aop:config>
以上XML配置方式显然有些繁杂,也可以使用XML+注解的方式进行配置:
<aop:aspectj-autoproxy/> + 注解即可实现