1、Spring除了支持Schema方式配置AOP,还支持注解方式:使用@Aspect来配置
2、Spring默认不支持@Aspect风格的切面声明,通过如下配置开启@Aspect支持:
- <aop:aspectj-autoproxy/>
3、通过以上配置,Spring就能发现用@Aspect注解的切面内并把它应用到目标对象上。
4、定义一个切面:
- @Aspect
- public class AspectStyle {
- @Before("execution(* com.sxit..*.*(..))")
- public void before(){
- System.out.println("方法执行前执行.....");
- }
- }
5、后置返回通知:
- @AfterReturning("execution(* com.sxit..*.*(..))")
- public void afterReturning(){
- System.out.println("方法执行完执行.....");
- }
6、后置异常通知:
- @AfterThrowing("execution(* com.sxit..*.*(..))")
- public void throwss(){
- System.out.println("方法异常时执行.....");
- }
7、后置最终通知:
- @After("execution(* com.sxit..*.*(..))")
- public void after(){
- System.out.println("方法最后执行.....");
- }
8、环绕通知:
- @Around("execution(* com.sxit..*.*(..))")
- public Object around(ProceedingJoinPoint pjp){
- System.out.println("方法环绕start.....");
- try {
- pjp.proceed();
- } catch (Throwable e) {
- e.printStackTrace();
- }
- System.out.println("方法环绕end.....");
- }
9、按上面的每一个通知都要写一个定义,其实这部分可以抽出来,定义个一个公共的切入点。
- package com.sxit;
- import org.aspectj.lang.ProceedingJoinPoint;
- import org.aspectj.lang.annotation.After;
- import org.aspectj.lang.annotation.AfterReturning;
- import org.aspectj.lang.annotation.AfterThrowing;
- import org.aspectj.lang.annotation.Around;
- import org.aspectj.lang.annotation.Aspect;
- import org.aspectj.lang.annotation.Before;
- import org.aspectj.lang.annotation.Pointcut;
- @Aspect
- public class AspectStyle {
- @Pointcut("execution(* com.sxit..*.*(..))")
- public void init(){
- }
- @Before(value="init()")
- public void before(){
- System.out.println("方法执行前执行.....");
- }
- @AfterReturning(value="init()")
- public void afterReturning(){
- System.out.println("方法执行完执行.....");
- }
- @AfterThrowing(value="init()")
- public void throwss(){
- System.out.println("方法异常时执行.....");
- }
- @After(value="init()")
- public void after(){
- System.out.println("方法最后执行.....");
- }
- @Around(value="init()")
- public Object around(ProceedingJoinPoint pjp){
- System.out.println("方法环绕start.....");
- Object o = null;
- try {
- o = pjp.proceed();
- } catch (Throwable e) {
- e.printStackTrace();
- }
- System.out.println("方法环绕end.....");
- return o;
- }
- }
10、打印信息:
- 方法before前执行.....
- 方法环绕start.....
- 我看.....................
- 方法after执行.....
- 方法环绕end.....
- 方法afterReurning执行.....