spring AOP的两种配置

2022-10-17,,,

  1. xml配置
  • 定义要被代理的方法的接口

 

public interface testaop {
    public void print(string s);
}
  • 实现上述接口

 

public class testaopimp implements testaop{
    public void print(string s) {
        system.out.println("具体业务逻辑");
    }
}
  • 定义切面(要在被代理方法的前后进行的操作)
public class logutil {
    public void logbefore(joinpoint joinpoint) { //joinpoint为代理的方法
        system.out.println("业务处理之前记录日志");
    }

    public void logafter(joinpoint joinpoint) {
        system.out.println("业务处理之后记录日志");
    }

//    @around("print()")
//    public void doaround(proceedingjoinpoint pjp) throws throwable {
//        system.out.println("开始处理业务");
////        pjp.proceed();
//        system.out.println("处理业务结束");
//    }

    //在处理的过程中发生异常
    public void doafterthrowing(exception e) {
        system.out.println("例外通知:" + e);
    }
    
    public void doafterreturning(object result) {
        system.out.println("后置通知:" + result);
    }
}
  • xml文件中配置
 <bean id="testaop" class="aop.testaopimp"/>
 <bean id="logutil" class="aop.logutil"/>
    <aop:config>
        <aop:aspect id="aspect" ref="logutil">
            <aop:pointcut id="pointtestaop" expression="execution(* aop.testaopimp.print*(..))"/>
            <aop:before method="logbefore" pointcut-ref="pointtestaop"/>
            <aop:after method="logafter" pointcut-ref="pointtestaop"/>
            <!--<aop:around method="doaround" pointcut-ref="pointtestaop"/>-->
            <aop:after-returning method="doafterreturning" pointcut-ref="pointtestaop" returning="result"/>
            <aop:after-throwing method="doafterthrowing" throwing="e" pointcut-ref="pointtestaop"/>
        </aop:aspect>
    </aop:config>

  2.注解配置

  • 开启注解 在xml配置文件中加上<aop:aspectj-autoproxy/>
  • 导包(不导包用不了注解)
    <dependency>
            <groupid>aspectj</groupid>
            <artifactid>aspectjrt</artifactid>
            <version>1.5.3</version>
     </dependency>
     <dependency>
            <groupid>commons-logging</groupid>
            <artifactid>commons-logging</artifactid>
            <version>1.2</version>
     </dependency>
  • 接口和实现类和xml配置相同,接下来定义切面
@aspect
    public class logutil {
    @pointcut("execution(* aop.testaopimp.print(string))")
    public void print() {
    }

    
    @before("print()")
    public void logbefore(joinpoint joinpoint) { //joinpoint为代理的方法
        system.out.println("业务处理之前记录日志");
    }

    @after("print()")
    public void logafter(joinpoint joinpoint) {
        system.out.println("业务处理之后记录日志");
    }

//    @around("print()")
//    public void doaround(proceedingjoinpoint pjp) throws throwable {
//        system.out.println("开始处理业务");
////        pjp.proceed();
//        system.out.println("处理业务结束");
//    }

    //在处理的过程中发生异常
    @afterthrowing(pointcut = "print()", throwing = "e")
    public void doafterthrowing(exception e) {
        system.out.println("例外通知:" + e);
    }
    
    @afterreturning(pointcut = "print()", returning = "result")
    public void doafterreturning(object result) {
        system.out.println("后置通知:" + result);
    }

****************注意点****************

  1. around切点等于before切点加上after切点,使用的时候二者选其一 pjp.proceed()就等于执行被代理的函数
  2. 对于几个切点的执行顺序:
     try
    {
        //  执行前置通知;
        
        //  执行目标方法;
        
        // 执行返回通知;
    }
    catche(exception e)
    {
        // 执行异常通知;
    }
    finally
    {
        // 执行后置通知;
    }

 

《spring AOP的两种配置.doc》

下载本文的Word格式文档,以方便收藏与打印。