Heim  >  Artikel  >  Java  >  Einführung in die Verwendung von AOP in Springboot (Codebeispiel)

Einführung in die Verwendung von AOP in Springboot (Codebeispiel)

不言
不言nach vorne
2018-10-15 15:51:152308Durchsuche

Dieser Artikel bietet Ihnen eine Einführung in die Verwendung von AOP in Springboot (Codebeispiele). Ich hoffe, dass er für Freunde hilfreich ist.

Schritt 1: Abhängigkeiten hinzufügen

        <dependency>  
            <groupId>org.springframework.boot</groupId>  
            <artifactId>spring-boot-starter-aop</artifactId>  
        </dependency>

Schritt 2: Definieren Sie eine Aspektklasse

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");
    }
}

Hinweis:

Wenn dieselbe Aspektklasse zwei @Befores definiert, kann die Ausführungsreihenfolge der beiden @Befores nicht bestimmt werden

Für @Around Unabhängig davon, ob es einen Rückgabewert hat oder nicht, muss pjp.proceed() innerhalb der Methode aufgerufen werden. Andernfalls hat die Schnittstelle im Controller keine Chance, ausgeführt zu werden, was ebenfalls zum Fehler von @Before The führt Der Controller, der für den

-Test ausgelöst wird, lautet wie folgt:

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;


@Controller
public class TestController {

    @RequestMapping(value = "test",method = RequestMethod.GET)
    @ResponseBody
    public String test(String name){
        System.out.println("============method");
        return name;
    }
}

Die Konfiguration ist abgeschlossen. Überprüfen Sie den Effekt. Die Ausgabe lautet wie folgt:

around1
before============method
around2
after
AfterReturning

Wie Sie sehen können, ist die Ausführung der Aspektmethode wie folgt:

around-->before-->method--> ;around-->after-->AfterReturning

Wenn @AfterThrowing konfiguriert ist und eine Ausnahme auftritt, erfolgt die Ausführung wie folgt:

around-->before--> ;method-->around-->after-->AfterThrowing

Das obige ist der detaillierte Inhalt vonEinführung in die Verwendung von AOP in Springboot (Codebeispiel). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:cnblogs.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen