转:SpringAop中@Before、@After、@Around执行顺序


首先说明,SpringAop需要有aspectjweaver这个依赖,要先加入到maven中;

Sql代码   收藏代码
  1. <dependency>  
  2.     <groupId>org.aspectj</groupId>  
  3.     <artifactId>aspectjweaver</artifactId>  
  4.     <version>1.8.8</version>  
  5. </dependency>  

 

其次,对于进行增强的方法,需要将其所在类加入到ioc容器中,如下:

 

Java代码   收藏代码
  1. @Component  
  2. public class HelloWorld {  
  3.   
  4.     public void sayHello (){  
  5.         System.out.println("Hello World!");  
  6.     }  
  7.       
  8. }  

 

 

接下来需要声明切面,切点,通知,一样需要在spring的ioc容器内,且需要@Aspect注解,

@Aspect是让spring对该进行aop扫描,这样才能扫描到该类内部的切点、通知的注解,如下:

 

Java代码   收藏代码
  1. @Aspect  
  2. @Component  
  3. public class HelloWorldAspect {  
  4.   
  5.     @Pointcut(value = "execution(* aop..sayHello(..))")  
  6.     public void pointCut (){    
  7.           
  8.     }  
  9.       
  10.     @Before(value = "pointCut()")  
  11.     private void beforeAdvice (){   
  12.                 System.out.println("===========before advice param:");  
  13.     }  
  14.       
  15.     @After( value = "pointCut()")  
  16.     private void afterAdvice (){  
  17.             System.out.println("===========after advice param:");  
  18.     }  
  19.       
  20.     @Around(value = "pointCut()")  
  21.     private void aroundAdvice (ProceedingJoinPoint pjp) throws Throwable{  
  22.         System.out.println("===========before advice param: around");  
  23.         pjp.proceed();  
  24.         System.out.println("===========after advice param: around");  
  25.     }  
  26.       
  27. }  

 这样一来,我们就完成了切点匹配,前置、后知、环绕通知的声明,然后就可以进行测试了

 

扫描二维码关注公众号,回复: 329598 查看本文章

 

测试代码如下:

Java代码   收藏代码
  1. @Test  
  2. public void testAop (){  
  3.     ApplicationContext ctx = new AnnotationConfigApplicationContext(AopConfig.class);  
  4.     HelloWorld hw = ctx.getBean(HelloWorld.class);  
  5.     hw.sayHello();  
  6. }  

 

 

 

 

输出的结果如下:

 

Java代码   收藏代码
  1. ===========before advice param: around  
  2. ===========before advice param:  
  3. Hello World!  
  4. ===========after advice param: around  
  5. ===========after advice param:  

 

 

 

 所以我们得到结果:

前置时    环绕通知  ->  前置通知

后置时    环绕通知  ->  后置通知

 

另外spring中还有@AfterReturning、@AfterThrowing,这些将在下一次再写了,如果想早点看的话,可以参考下面的这个链接:

http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle

猜你喜欢

转载自sunbin.iteye.com/blog/2285877