当前位置:编程学习 > asp >>

spring入门(10)---使用Aspectj进行AOP开发

添加类库:aspectjrt.jar和aspectjweaver.jar
添加aop schema.
定义xml元素:<aop:aspectj-autoproxy>
编写java类,并用@Aspect注解成通知
     AspectJ 支持 5 种类型的通知注解:
  @Before: 前置通知, 在方法执行之前执行
  @After: 后置通知, 在方法执行之后执行
  @AfterReturning: 返回通知, 在方法返回结果之后执行
  @AfterThrowing: 异常通知, 在方法抛出异常之后
  @Around: 环绕通知, 围绕着方法执行
配置成普通bean元素即可.

 

二、

后置通知:@After
    @After("execution(* *..WelcomeService.*(..))")
    public void applaud(){..}
后置通知在目标方法执行完成之后执行.一个切面aspect包含很多通知.
@After
    后置通知表明目标方法执行完之后,不论是否抛异常,都会织入该通知.
@AfterReturning
    方法返回后通知只在目标方法返回以后执行,若抛异常不执行.

@AfterReturning(pointcut="",returning="res")
public void xxx(Joinput jp,Object res)
在AfterReturning
通知中可接收到返回值.res即是用来接收返回值的对象.


三、

环绕通知:@Around
    @Around("execution(* *..WelcomeService.*(..))")
    public void around(ProceedingPointCut jp){..}
注意:可以控制目标方法是否调用,以及返回完全不同的对象,要慎用.

指定优先级:
@Aspect
@Order(0)
public class xxx{...}
加上@Order注解可以指定加入切面的优先级(先后顺序,值越小,优先级越高)


例子说明:


AdviceImpl类:

[java]
package www.csdn.spring.advice.aspetjs; 
 
import org.aspectj.lang.ProceedingJoinPoint; 
import org.aspectj.lang.annotation.After; 
import org.aspectj.lang.annotation.Around; 
import org.aspectj.lang.annotation.Aspect; 
import org.aspectj.lang.annotation.Before; 
 
@Aspect 
public class AdviceImpl { 
 
    @Before(value = "execution(* UserDaoImpl.*(..))") 
    public void doTransAction(){ 
        System.out.println("----开启事务-----"); 
    } 
     
    @After(value = "execution(* www.csdn..UserDaoImpl.*(..))") 
    public void doAfterTransAction(){ 
        System.out.println("-------提交事务-------"); 
    } 
     
    @Around(value = "execution(* www.csdn..UserDaoImpl.save(..))") 
    public void doSec(ProceedingJoinPoint jp){ 
        System.out.println("----------安全处理之前-------------"); 
        try { 
            Object obj = jp.proceed(); 
        } catch (Throwable e) { 
            // TODO Auto-generated catch block  
            e.printStackTrace(); 
        } 
        System.out.println("----------安全处理之后-------------"); 
    } 

[java]
package www.csdn.spring.advice.aspetjs; 
 
import org.aspectj.lang.ProceedingJoinPoint; 
import org.aspectj.lang.annotation.After; 
import org.aspectj.lang.annotation.Around; 
import org.aspectj.lang.annotation.Aspect; 
import org.aspectj.lang.annotation.Before; 
 
@Aspect 
public class AdviceImpl { 
 
    @Before(value = "execution(* UserDaoImpl.*(..))") 
    public void doTransAction(){ 
        System.out.println("----开启事务-----"); 
    } 
     
    @After(value = "execution(* www.csdn..UserDaoImpl.*(..))") 
    public void doAfterTransAction(){ 
        System.out.println("-------提交事务-------"); 
    } 
     
    @Around(value = "execution(* www.csdn..UserDaoImpl.save(..))") 
    public void doSec(ProceedingJoinPoint jp){ 
        System.out.println("----------安全处理之前-------------"); 
        try { 
            Object obj = jp.proceed(); 
        } catch (Throwable e) { 
            // TODO Auto-generated catch block  
            e.printStackTrace(); 
        } 
        System.out.println("----------安全处理之后-------------"); 
    } 

package www.csdn.spring.advice.aspetjs;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;

@Aspect
public class AdviceImpl {

 @Before(value = "execution(* UserDaoImpl.*(..))")
 public void doTransAction(){
  System.out.println("----开启事务-----");
 }
 
 @After(value = "execution(* www.csdn..UserDaoImpl.*(..))")
 public void doAfterTransAction(){
  System.out.println("-------提交事务-------");
 }
 
 @Around(value = "execution(* www.csdn..UserDaoImpl.save(..))")
 public void doSec(ProceedingJoinPoint jp){
  System.out.println("----------安全处理之前-------------");
  try {
   Object obj = jp.proceed();
  } catch (Throwable e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  System.out.println("----------安全处理之后-------------");
 }
}

配置文件:

[java]
<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
       xmlns:aop="http://www.springframework.org/schema/aop" 
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
       xsi:schemaLocation="http://www.springframework.org/schema/beans  
           http://www.springframework.org/schema/beans/spring-beans.xsd  
           http://www.springframework.org/schema/aop&

补充:软件开发 , Java ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,