>  기사  >  Java  >  Spring AOP 주석에 대한 자세한 설명

Spring AOP 주석에 대한 자세한 설명

Guanhui
Guanhui앞으로
2020-06-28 17:59:443234검색

Spring AOP 주석에 대한 자세한 설명

Aspect: Aspect

Aspect = 포인트컷 + 알림. 이전 Spring 버전에서는 일반적으로 XML 구성이 사용되었지만 이제 클래스에는 일반적으로 @Aspect라는 주석이 추가됩니다. 측면은 지정된 조인 포인트에 교차 논리(조언)를 엮는 역할을 담당합니다.

대상 개체: Target

강화할 개체입니다.

Join Point: JoinPoint

가로챌 수 있는 프로그램 실행 지점은 스프링 클래스의 메소드 입니다.

진입점: PointCut

차단 방법, 즉 교차 논리를 구체적으로 구현하는 방법이 실행되어야 합니다. 포인트컷 규칙은 Spring에서 AspectJ 포인트컷 표현 언어를 통해 설명됩니다.

진입점과 연결점의 차이점: 연결점은 "절단"할 수 있는 모든 지점입니다. 진입점은 실제로 절단해야 하는 지점입니다.

조언: Advice

"주변", "이전" 및 "이후"와 같은 다양한 유형의 조언을 포함하여 진입점에 대한 교차 논리입니다.

알림의 동작 지점은 다음과 같습니다.

  • before: 포인트컷 이전에 실행됨

  • after: 포인트컷 이후에 실행됨

  • around: 포인트컷에서 가로채기 방법, 이전 및 이후에 사용자 정의됨, 더보기 유연함

예외 처리 알림도 있습니다.

Weaving: Weaving

Aspect와 대상 개체를 연결하고 프록시 개체를 만드는 과정입니다. 봄에는 동적 프록시가 사용됩니다. 대상 객체에 인터페이스가 있으면 jdk 동적 프록시를 사용하고, 그렇지 않으면 cglib 동적 프록시를 사용하세요.

너무 많은 개념에 대해 이야기했기 때문에 코드 구현을 살펴보면 독자가 이를 더 깊이 이해하는 데 도움이 될 수 있습니다. 다음은 주석을 통해 방법을 향상시키는 간단한 AOP-Demo입니다.
먼저 애스펙트 클래스:

package com.example.demo.aop;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

/**
 * @author Fcb
 * @date 2020/6/20
 * @description 切面类=切入点+通知
 */
@Aspect
@Component
public class LogAspect {

  //这个方法定义了切入点
  @Pointcut("@annotation(com.example.demo.aop.anno.MyLog)")
  public void pointCut() {}

  //这个方法定义了具体的通知
  @After("pointCut()")
  public void recordRequestParam(JoinPoint joinPoint) {
    for (Object s : joinPoint.getArgs()) {
      //打印所有参数,实际中就是记录日志了
      System.out.println("after advice : " + s);
    }
  }

  //这个方法定义了具体的通知
  @Before("pointCut()")
  public void startRecord(JoinPoint joinPoint) {
    for (Object s : joinPoint.getArgs()) {
      //打印所有参数
      System.out.println("before advice : " + s);
    }
  }

  //这个方法定义了具体的通知
  @Around("pointCut()")
  public Object aroundRecord(ProceedingJoinPoint pjp) throws Throwable {
    for (Object s : pjp.getArgs()) {
      //打印所有参数
      System.out.println("around advice : " + s);
    }
    return pjp.proceed();
  }
}

주석:

package com.example.demo.aop.anno;
import java.lang.annotation.*;
/**
 * @author Fcb
 * @date 2020/6/20
 * @description
 */
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
public @interface MyLog {
}

대상 클래스:

package com.example.demo.aop.target;

import com.example.demo.aop.anno.MyLog;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author Fcb
 * @date 2020/6/20
 * @description
 */
@RestController
public class MockController {

  @RequestMapping("/hello")
  @MyLog
  public String helloAop(@RequestParam String key) {
    System.out.println("do something...");
    return "hello world";
  }

}

마지막으로 테스트 클래스:

package com.example.demo.aop.target;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
/**
 * @author Fcb
 * @date 2020/6/20
 * @description
 */
@SpringBootTest
class MockControllerTest {
  @Autowired
  MockController mockController;

  @Test
  void helloAop() {
    mockController.helloAop("aop");
  }
}

콘솔 결과:

어라운드 어드바이스: aop
어드바이스 전: aop
뭔가를 하세요...
조언 후: aop

추천 튜토리얼: "Java Tutorial"

위 내용은 Spring AOP 주석에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 jb51.net에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제