首先,我们要知道AOP中我们要配置哪几部分
- 切面(Aspect)任何存在通知和切入点映射关系的类都需要被修饰为@Aspect,同时因为我们希望交给Spring来管理,所以用@Component来修饰作为一个Bean
- 在切面中,将通知(共性方法advice)抽取为一个方法
- 切入点(Pointcut)使用一个
public void funcName()
方法,在该方法上标记@pointcut()里面的参数设置为正则表达式,符合该表达式的方法会被监听拦截到。 - 通知和切入点的映射关系,在通知上面配好切入点的执行时机@before @after @around @afterReturning @afterThrowing
接下来我们就来实操一下:
第一步,配置切面:
@Component
@Aspect
public class AOPAdvice {
}
第二步,配置切入点:
@Component
@Aspect
public class AOPAdvice {
@Pointcut("execution(* *..*(..))")
public void pt(){}
}
第三步,抽取通知方法:
@Component
@Aspect
public class AOPAdvice {
@Pointcut("execution(* *..*(..))")
public void pt(){}
public void before(){
System.out.println("前置before...");
}
}
第四步:配置方法和切入点的关系,以Before为例:
@Component
@Aspect
public class AOPAdvice {
@Pointcut("execution(* *..*(..))")
public void pt(){}
@Before("pt1()")
public void before(){
System.out.println("前置before...");
}
}
进阶:
我们可以把切入点单独做一个类
public class AOPPointcut {
@Pointcut("execution(* *..*(..))")
public void pt2(){}
}
同时使用@around来进行织入
@Component
@Aspect
public class AOPAdvice {
@Pointcut("execution(* *..*(..))")
public void pt(){}
@Before("pt1()")
public void before(){
System.out.println("前置before...");
}
@Around("AOPPointcut.pt2()")
public Object around(ProceedingJoinPoint pjp) throws Throwable {
System.out.println("环绕前around before...");//织入部分1
Object ret = pjp.proceed();//这里就代表原先执行的方法,我们可以获得该部分方法的返回值
System.out.println("环绕后around after...");//织入部分2
return ret;//如果要求方法结束后有返回值,我们可以在这里返回
}
}
最后如果你仍然保留了XML文件的话,那你需要去XML文件里面开启AOP注解的支持。如果是纯注解开发的话,那就去你的主配置类开启支持:
@Configuration
@ComponentScan("com.sun")
@EnableAspectJAutoProxy
public class SpringConfig {
}