programing

스프링 AAP: JoinPoint와 PointCut의 차이점은 무엇입니까?

css3 2023. 3. 31. 22:33

스프링 AAP: JoinPoint와 PointCut의 차이점은 무엇입니까?

저는 애스펙트 지향 프로그래밍 개념과 스프링 AOP를 배우고 있습니다.포인트 컷과 조인 포인트의 차이를 이해하지 못하고 있습니다.둘 다 같은 것 같습니다.포인트 컷은 어드바이스를 적용하는 장소이며, Joinpoint는 어드바이스를 적용할 수 있는 장소이기도 합니다.그럼 뭐가 다른데?

포인트 컷의 예는 다음과 같습니다.

@Pointcut("execution(* * getName()")

조인 포인트의 예는 무엇입니까?

결합점:조인 포인트는 애스펙트를 연결할 수 있는 응용 프로그램 실행 후보 지점입니다.이 포인트는 호출되는 메서드, 예외 발생 또는 필드 변경일 수 있습니다.이러한 포인트는, 애플리케이션의 통상의 플로우에 애스펙트의 코드를 삽입하고, 새로운 동작을 추가할 수 있는 포인트입니다.

어드바이스: 이 오브젝트는 시스템 전체의 관심사에 대한 API 호출을 포함하는 오브젝트로, 포인트로 지정된 조인 포인트에서 수행할 액션을 나타냅니다.

포인트 컷:포인트 컷은 어떤 결합점에서 관련 조언을 적용해야 하는지 정의합니다.조언은 AOP 프레임워크에서 지원되는 모든 조인 포인트에서 적용할 수 있습니다.물론 가능한 모든 결합점에 자신의 모든 측면을 적용하는 것은 아닙니다.포인트 컷을 사용하면 조언을 적용할 위치를 지정할 수 있습니다.종종 명시적인 클래스 및 메서드 이름을 사용하거나 일치하는 클래스 및 메서드 이름 패턴을 정의하는 정규식을 사용하여 이러한 포인트 컷을 지정합니다.일부 AOP 프레임워크에서는 메서드 파라미터의 값과 같은 런타임 결정에 따라 어드바이스를 적용할지 여부를 결정하는 동적 포인트 컷을 작성할 수 있습니다.

,음음 point 、 PointCut 、 Joinpoints 。 여기에 이미지 설명 입력

원천

레스토랑의 비유를 사용한 설명: 출처: @Victor

레스토랑에 가면 메뉴를 보고 선택할 수 있는 여러 가지 옵션을 볼 수 있습니다.메뉴 중 하나 이상을 주문할 수 있습니다.하지만 실제로 주문하기 전까지는 "식사 기회"에 불과합니다.주문을 하고 웨이터가 가져다 주면 식사입니다.

결합점은 메뉴의 옵션이고 점절단은 사용자가 선택하는 항목입니다.

Joinpoint는 코드 내에서 애스펙트를 적용할 수 있는 기회입니다.그냥 기회일 뿐이야이 기회에 하나 이상의 결합점을 선택하고 애스펙트를 적용하면 포인트 컷이 됩니다.

소스 Wiki:

조인 포인트는 제어 플로우가 2개의 다른 경로를 통해 도달할 수 있는 프로그램 제어 흐름의 포인트입니다(IMO: 그래서 콜 조인트가 됩니다).

조언은 다른 기능을 수정하는 기능 클래스를 설명합니다.

포인트 컷은 결합점(즉, 결합점 세트)의 패턴과 일치하는 패턴입니다.

결합점과 포인트 컷의 차이를 이해하려면 포인트 컷은 직조 규칙을 지정하는 것으로 간주하고 결합점은 이러한 규칙을 충족하는 상황으로 간주합니다.

다음 예에서는

  @Pointcut("execution(* * getName()")  

Pointcut은 어드바이저가 모든 패키지의 클래스에 존재하는 getName() 메서드에 적용되어야 한다는 규칙을 정의합니다.또한 이러한 메서드에 어드바이스를 적용할 수 있도록 조인포인트는 클래스에 존재하는 모든 getName() 메서드의 리스트가 됩니다.

(Spring의 경우 관리 대상 콩에만 적용되며, 어드바이스는 공공방법에만 적용됩니다.)

AOP 개념에 익숙하지 않은 사람을 위한 Layman 설명.이것은 완전한 것은 아니지만 개념을 이해하는 데 도움이 될 것입니다.기본 용어들을 이미 숙지하고 계신 분들은 이제 그만 읽으셔도 됩니다.

일반 클래스 Employee가 있으며 이러한 메서드가 호출될 때마다 작업을 수행하려고 한다고 가정합니다.

class Employee{
    public String getName(int id){....}
    private int getID(String name){...}
}

이러한 메서드를 JoinPoint라고 부릅니다.모든 클래스 중에서 프레임워크가 메서드를 찾을 수 있도록 이러한 메서드를 식별할 수 있는 방법이 필요합니다.로드된 메서드.그래서 우리는 이 방법들의 시그니처에 맞는 정규 표현을 쓸 거예요.아래에 보이는 것처럼 더 많은 것이 있지만, 이 정규 표현은 Pointcut을 정의하는 것입니다.

* * mypackage.Employee.get*(*)

첫 번째 *는 public/private/protected/default 수식어입니다.두 번째 *는 메서드의 반환 유형입니다.

하지만 다음 두 가지를 더 말해야 합니다.

  1. 액션을 실행해야 하는 시기(예: 메서드 실행 전/후 또는 예외 발생 시)
  2. 일치할 때 수행할 작업(메시지만 출력할 수 있음)

이 두 가지를 조합한 것을 어드바이스라고 부릅니다.

상상이 가듯이 함수를 써야 2번을 할 수 있어요.기본은 이렇습니다.

주의: 알기 쉽게 하기 위해 REGEX라는 단어를 사용하여* * mypackage.Employee.get*(*)정의에 실제로는 완전한 표현이 정의에 들어갑니다.

@Before("execution(REGEX)")
public void doBeforeLogging() {....}   <-- executed before the matching-method is called

@After("execution(REGEX)")
public void doAfterLogging() {....}  <-- executed after the matching-method is called

이러한 방법을 많이 사용하기 시작하면 @After/@Before/@Around 어드바이스를 많이 지정할 수 있습니다.반복된 규칙적인 표현은 결국 상황을 혼란스럽게 만들고 유지하기 어렵게 만들 것이다.따라서 식에 이름을 붙이고 Aspect 클래스의 다른 모든 곳에서 사용합니다.

@Pointcut("execution(REGEX)") <-- Note the introduction of Pointcut keyword
public void allGetterLogging(){} <-- This is usually empty

@Before("allGetterLogging")
public void doBeforeLogging() {....}

@After("allGetterLogging")
public void doAfterLogging() {....}

덧붙여서, 이 논리 전체를 Aspect라고 하는 클래스로 정리하고, 클래스를 작성합니다.

@Aspect
public class MyAwesomeAspect{....}

이 모든 것을 작동시키려면 Spring에게 @AOP 키워드를 읽고 이해하고 액션을 취하기 위한 클래스를 해석하도록 지시해야 합니다.spring config xml 파일에 다음 항목을 지정하는 것도 한 가지 방법입니다.

<aop:aspectj-autoproxy>

조인 포인트:이들은 기본적으로 실제 비즈니스 로직에서 필요한 여러 가지 기능을 삽입하고 싶지만 실제 비즈니스 로직에는 포함되지 않는 곳입니다.Join Pint의 예로는 메서드 호출, 메서드 정상 반환, 메서드 예외 발생, 오브젝트 인스턴스화, 오브젝트 참조 등이 있습니다.

포인트 컷:포인트 컷은 결합점을 식별하는 데 사용되는 정규 표현과 비슷합니다.폰트컷은 "포인트컷 표현 언어"를 사용하여 표현됩니다.포인트 컷은 크로스 컷을 적용해야 하는 실행 흐름의 포인트입니다.조인포인트와 포인트컷 사이에는 차이가 있습니다. 조인포인트는 더 일반적이며 교차 우려 사항을 '선택할 수 있는' 모든 제어 흐름을 나타내며, 포인트 컷은 교차 우려 사항을 '원하는' 결합 지점을 식별합니다.

정의들

설명서에 따르면:

조인 포인트: 메서드 실행 또는 예외 처리와 같은 프로그램 실행 중 포인트입니다.

연결 지점을 프로그램 실행 시 이벤트로 간주할 수 있습니다.Spring AOP를 사용하는 경우 이마저도 메서드의 호출로 제한됩니다.Aspect J는 유연성을 높입니다.

하지만 레스토랑에 가면 메뉴에 있는 모든 음식을 다 먹지 않기 때문에 모든 이벤트를 다 처리하지는 않습니다(모르겠어요!하지만, 저는 확실히 모릅니다).처리할 이벤트와 처리할 작업을 선택합니다.포인트 컷 갑니다.설명서에 따르면

포인트 컷: 결합점일치하는 술어.

그런 다음 포인트 컷을 어떻게 해야 할지 생각하시면 조언이 나옵니다.설명서에 따르면

조언포인트 컷 표현식과 관련지어지며 포인트 컷과 일치하는 모든 결합 지점에서 실행됩니다.

코드

package com.amanu.example;

import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;

/**
 * @author Amanuel Nega on 10/25/16.
 */
class ExampleBussinessClass {

    public Object doYourBusiness() {
        return new Object();
    }

}

@Aspect
class SomeAspect {

    @Pointcut("execution(* com.amanu.example.ExampleBussinessClass.doYourBusiness())")
    public void somePointCut() {
    }//Empty body suffices

    @After("somePointCut()")
    public void afterSomePointCut() {
        //Do what you want to do after the joint point is executed
    }

    @Before("execution(* *(*))")
    public void beforeSomePointCut() {
        //Do what you want to do before the joint point is executed
    }

}

코드의 설명

  • ExampleBusinessClass아아아!
  • doYourBusiness()가능한 연결 지점입니다.
  • SomeAspect와 같은 가지 입니다.ExampleBusinessClass
  • somePointCut()포인트 컷의 정의로, 우리의 조인트 포인트와 일치합니다.
  • afterSomePointCut()어드바이스는 다음 주에 실시됩니다.somePointCut 어울리는 포인트doYourBusiness()
  • beforeSomePointCut()모든 것에 맞는 조언이기도 하다.public메서드의 실행.★★★★★★★★★★★★★★★와 달리afterSomePointCut 컷 을 사용합니다.

내 말을 못 믿겠다면 서류를 봐도 돼.이게 도움이 됐으면 좋겠다

AspectJ와 같은 AOP 언어를 SQL과 같은 데이터 쿼리 언어와 비교하면

  • 결합점(즉, 코드의 모든 장소, 애스펙트 코드를 엮을 수 있는 곳)은 행이 많은 데이터베이스 테이블로 생각할 수 있습니다.
  • 포인트 컷은 행/조인 포인트의 사용자 정의 서브셋을 선택할 수 있는 SELECT 층과 같습니다.
  • 선택한 장소에 짜넣는 실제의 코드를 어드바이스라고 부릅니다.

둘 다 애스펙트 지향 프로그래밍의 '어디'와 관련이 있습니다.

조인 포인트는 예를 들어 "메서드가 예외를 발생시킬 때"와 같이 AOP로 코드를 실행할 수 있는 개별 장소입니다.

포인트 컷은 결합점의 집합입니다.예: "클래스 Foo의 메서드가 예외를 발생시키는 경우"

Join Point: Join Point는 프로그램 실행 중 예외 캐치, 호출 기타 메서드처럼 실행 흐름이 변경된 지점입니다.

PointCut: PointCut은 기본적으로 조언을 할 수 있는 결합점입니다.

기본적으로 PointCuts는 JoinPoints의 서브셋입니다.

봄철 AOP에는 {Advisor, Advisor, Pointcut, Joinpoint}가 있습니다.

아시다시피 aop의 주요 목적은 애플리케이션 코드에서 교차 우려 논리(Aspect)를 분리하는 것입니다.사용하는 봄에 이를 구현하기 위해(Advisor/Advisor)

포인트 컷은 "모든 메서드가 삽입으로 시작한다"와 같이 이 어드바이스를 정확히 적용할 위치를 필터링하기 위해 사용되며, 다른 메서드는 제외됩니다.그 때문에 포인트 컷인터페이스 {ClassFilter and MethodMatcher}에 있습니다.

어드바이스는 크로스 컷 로직의 실장, 어드바이저는 어드바이스에 포인트 컷을 더한 것입니다.어드바이스만 사용하면 스프링은 어드바이저에게 매핑하고 포인트 컷을 TRUE로 만듭니다.이것은 아무것도 막지 않는 것을 의미합니다.그렇기 때문에 어드바이스만 사용하는 경우 필터링을 하지 않았기 때문에 타겟클래스의 모든 메서드에 적용됩니다.

그러나 Joinpoint는 프로그램 내 위치입니다.Class 객체에 액세스하여 Method 객체를 얻을 수 있습니다.그러면 이 클래스의 어떤 메서드도 호출할 수 있습니다.이렇게 생각하면 Joinpoint를 상상할 수 있습니다.

조인포인트는 필드, 컨스트럭터 또는 메서드와 함께 사용할 수 있지만 봄에는 메서드만 있는 조인포인트가 있기 때문에 봄에는 (Before, After, Flows, Around) 유형의 조인포인트가 모두 클래스 내의 위치를 참조합니다.

포인트 컷(필터 없음) 없이 어드바이스를 할 수 있다고 말씀드렸듯이 모든 메서드에 적용할 수도 있고 [어드바이즈 + 포인트 컷]어드바이저를 특정 메서드에 적용할 수도 있지만 포인트 컷과 같은 조인 포인트 없이는 어드바이저를 할 수 없습니다.그렇기 때문에 봄철 어드바이스 타입은 결합점과 완전히 같은 타입이기 때문에 어드바이스 타입을 선택할 때는 어떤 결합점을 암묵적으로 선택할 수 있습니다.

마지막으로 어드바이스는 타깃클래스에 대한 각 측면의 구현 로직입니다.이 어드바이스는 호출 전, 호출 후, 호출 투척 후 또는 호출 주변에서와 같은 결합점을 가져야 합니다.그런 다음 포인트 컷을 사용하여 적용할 위치를 정확히 필터링하여 메서드를 필터링하거나 포인트 컷 없음(필터 없음)을 사용하여 클래스의 모든 메서드에 적용할 수 있습니다.

포인트 컷은 Aspect - class 구현에 정의됩니다.포인트 컷은 기본적으로 어드바이스 내의 포인트 컷 표현입니다.

예를 들어,

@Before("execution(* app.purchase2.service.impl.*(..))")
public void includeAddOns(RolesAllowed roles) {
..
}

위의 의미는 includeAddOns 메서드가 (@Before 조언에 의해) 메서드를 호출하기 전에 (패키지 "app" 내의 클래스에서) 호출된다는 것입니다.구입2.service.displaces")

전체 주석을 포인트 컷이라고 합니다.@Before("execution(* app.purchase2.service.impl.*(..))")

결합점은 실제 메서드 호출로 패키지 "app"에서 메서드에 결합됩니다.구입2.includeAddOns()의 메서드에 service.impl을 추가합니다.

연결 지점의 속성에 액세스할 수 있습니다.org.aspectj.lang.JoinPoint학급.

나는 mgroves에 동의해.점 절단은 여러 접합점의 집합으로 간주할 수 있습니다.접합점은 조언을 구현할 수 있는 특정 위치를 지정하며, 여기서 포인트 컷은 모든 접합점의 목록을 반영한다.

Join Point:어드바이스를 실행할 어플리케이션의 포인트(메서드)를 지정합니다.

포인트 컷:JoinPoints의 조합으로 JoinPoint 어드바이스를 실행할 시점을 지정합니다.

레스토랑에 가면 메뉴를 보고 선택할 수 있는 여러 가지 옵션을 볼 수 있습니다.메뉴 중 하나 이상을 주문할 수 있습니다.하지만 실제로 주문하기 전까지는 "식사 기회"에 불과합니다.주문을 하고 웨이터가 가져다 주면 식사입니다.

조인 포인트는 메뉴의 옵션이고 포인트 컷은 사용자가 선택하는 항목입니다.결합점은 코드 내에서 애스펙트를 적용할 수 있는 기회입니다.그냥 기회일 뿐이야이 기회를 이용해 하나 이상의 결합점을 선택하고 해당 결합점에 대한 애스펙트를 적용하면 포인트 컷을 얻을 수 있습니다.

PointCut은 주석입니다. 스코프를 선언할 수 있습니다.()그 조언이 어디에 적용될지.

대신 JoinPoint는 인터페이스이며 5가지 조언 모두에 사용되는 파라미터입니다.특히 @Around 조언에는 ProceedingJoinPoint(JoinPoint의 자녀 인터페이스)가 적용되어 있습니다..proceed()프로그램 진행 여부를 제어할 수 있습니다.arg를 변경할 수도 있습니다.

Aspect는 어드바이스 패키지입니다.

::CoffeeService.buildDrink() ★★★★★★★★★★★★★★★★★」BreadService.buildFood()AfterSaleApsect.java, 있다surveyAdvice() ★★★★★★★★★★★★★★★★★」couponAdvice()이러한 서비스에 짜넣을 수 있습니다.

조언을 설명하기 위해 우리는 적어도 세 가지를 지적할 필요가 있다.

  • 시기: joinPoint: 특정 이벤트가 발생하는 시나리오.(메서드 실행, 예외 처리, 객체 변수 값 변경 등)Spring AOP에서 조인 포인트는 항상 메서드의 실행입니다.참조)
  • Who: 포인트 컷, 대상의 전제 조건(식)이 일치해야 합니다.그렇지 않으면 조언이 실행되지 않습니다.
  • 무엇을 할지.
@Aspect
public Class AfterSaleApsect{

    //@When("Who")
    //public void What(){
    //    ...
    //}
 
    //@AfterReturning("execution(* com.example.restaurant.service.*.build*())")
    @AfterReturning("myPointcut()")
    public void surveyAdvice(){
        doSurvey();       
    }
 
    //@AfterReturning("execution(* com.example.restaurant.service.*.build*())")
    @AfterReturning("myPointcut()")
    public void couponAdvice(){
        doCoupon();
    }

    //Make it reusable
    @Pointcut("execution(* com.example.restaurant.service.*.build*())")
    public void myPointcut(){}
 
}

주요 차이점은 다음과 같습니다.

측면은 교차하는 유형을 정의하지만, AspectJ 시스템은 완전히 임의 교차를 허용하지 않습니다.오히려 각 측면은 프로그램 실행 시 원칙적인 포인트를 가로지르는 유형을 정의합니다.이러한 원칙적인 점을 결합점이라고 합니다.

즉, 결합점은 애플리케이션 코드의 실행 흐름에서 애스펙트 어드바이스를 적용할 수 있는(즉, 포인트 컷(또는 그 이상) 장소의 잘 정의된 집합입니다.Aspect J를 사용하여 코드에 willy하게 포인트 컷을 적용할 수 없습니다.점절단을 적용할 수 있는 위치에 대한 공식적인 정의는 결합점입니다.

가장 좋은 답은 여기에 있습니다.스프링 AOP에서 @Pointcut을 사용하는 방법의 의미는 무엇입니까?그냥 포인트 시그니처입니다.

코드에 추가할 장소를 지정하기 위해 포인트 컷 익스프레스 언어를 사용합니다.1개의 장소만 있는 경우 @Before, @After 또는 @Around 주석에서 직접 정의할 수 있습니다.여러 개의 장소가 있는 경우 먼저 @Pointcut 주석을 사용하여 각 위치를 정의할 수 있습니다(더미 메서드를 사용).다음으로 이들을 그룹화하여(& 또는 ||), @Before, @After 또는 @Around 주석으로 사용할 수 있습니다.

조인 포인트는 실제로 어드바이스를 배치하는 장소입니다.

포인트 컷은 결합 포인트 수집입니다.즉, 크로스 컷 논리를 얼마나 많이 배치하는지를 포인트 컷이라고 합니다.

언급URL : https://stackoverflow.com/questions/15447397/spring-aop-whats-the-difference-between-joinpoint-and-pointcut