欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

spring AOP的两种配置

程序员文章站 2023-11-09 21:20:28
定义要被代理的方法的接口 public interface TestAop { public void print(String s); } 实现上述接口 public class TestAopImp implements TestAop{ public void print(String s) ......
  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
    {
        // 执行后置通知;
    }