本篇文章给大家带来的内容是关于springboot中aop的使用介绍(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。
第一步:添加依赖
<dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-aop</artifactid> </dependency>
第二步:定义一个切面类
package com.example.demo.aop;import java.lang.reflect.method;import java.util.arrays;import javax.servlet.http.httpservletrequest;import org.aspectj.lang.joinpoint;import org.aspectj.lang.proceedingjoinpoint;import org.aspectj.lang.annotation.*;import org.slf4j.logger;import org.slf4j.loggerfactory;import org.springframework.core.annotation.order;import org.springframework.stereotype.component;import org.springframework.web.context.request.requestcontextholder;import org.springframework.web.context.request.servletrequestattributes;import static com.sun.xml.internal.ws.dump.loggingdumptube.position.before;@component@aspect // 将一个java类定义为切面类@order(-1)//如果有多个aop,这里可以定义优先级,越小级别越高public class logdemo { private static final logger log = loggerfactory.getlogger(logdemo.class); @pointcut("execution(* com.example.demo.test.testcontroller.test(..))")//两个..代表所有子目录,最后括号里的两个..代表所有参数 public void logpointcut() { } @before("logpointcut()") public void dobefore(joinpoint joinpoint) throws throwable { // 接收到请求,记录请求内容 servletrequestattributes attributes = (servletrequestattributes) requestcontextholder.getrequestattributes(); httpservletrequest request = attributes.getrequest(); system.out.println("before"); } @after(value = "logpointcut()") public void after(joinpoint joinpoint) { system.out.println("after"); } @afterreturning(returning = "ret", pointcut = "logpointcut()")// returning的值和doafterreturning的参数名一致 public void doafterreturning(object ret) throws throwable { system.out.println("afterreturning"); } @around("logpointcut()") public void doaround(proceedingjoinpoint pjp) throws throwable { system.out.println("around1"); object ob = pjp.proceed();//环绕通知的进程方法不能省略,否则可能导致无法执行 system.out.println("around2"); }}
注意:
如果同一个 切面类,定义了定义了两个 @before,那么这两个 @before的执行顺序是无法确定的
对于@around,不管它有没有返回值,但是必须要方法内部,调用一下 pjp.proceed();否则,controller 中的接口将没有机会被执行,从而也导致了 @before不会被触发
测试的controller如下:
package com.example.demo.test;import org.springframework.stereotype.controller;import org.springframework.web.bind.annotation.requestmapping;import org.springframework.web.bind.annotation.requestmethod;import org.springframework.web.bind.annotation.responsebody;@controllerpublic class testcontroller { @requestmapping(value = "test",method = requestmethod.get) @responsebody public string test(string name){ system.out.println("============method"); return name; }}
配置完成,看看效果,输出如下:
around1before============methodaround2afterafterreturning
可以看到,切面方法的执行如下:
around-->before-->method-->around-->after-->afterreturning
如果配置了@afterthrowing,当有异常时,执行如下:
around-->before-->method-->around-->after-->afterthrowing
以上就是springboot中aop的使用介绍(代码示例)的详细内容。