[spring] Spring AOP : JoinPoint와 PointCut의 차이점은 무엇입니까?

저는 Aspect Oriented Programming 개념과 Spring AOP를 배우고 있습니다. Pointcut과 Joinpoint의 차이점을 이해하지 못하고 있습니다. 둘 다 저에게 똑같은 것 같습니다. Pointcut은 조언을 적용하는 곳이고 Joinpoint는 우리가 조언을 적용 할 수있는 곳이기도합니다. 그렇다면 차이점은 무엇입니까?

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

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

Joinpoint의 예는 무엇입니까?



답변

joinpoint를 : 의 joinpoint를는 인 후보 요점 프로그램 실행 태양이 연결 가능 응용 프로그램이 점은 예외가 발생되고, 또는 필드가 수정되고, 메소드가 호출되는 수 있었다.. 새로운 동작을 추가하기 위해 애스펙트 코드를 애플리케이션의 정상적인 흐름에 삽입 할 수있는 지점입니다.

조언 : 이것은 포인트에 의해 지정된 결합 점에서 수행 할 조치를 나타내는 시스템 전반에 대한 API 호출을 포함하는 오브젝트입니다.

포인트 컷 : 포인트 컷은 어떤 조인 포인트에서 관련 조언이 적용되어야하는지 정의합니다. AOP 프레임 워크에서 지원하는 모든 조인 포인트에서 조언을 적용 할 수 있습니다. 물론 가능한 모든 조인 포인트에 모든 측면을 적용하고 싶지는 않습니다. 포인트 컷을 사용하면 조언을 적용 할 위치를 지정할 수 있습니다. 종종 명시적인 클래스 및 메서드 이름을 사용하거나 일치하는 클래스 및 메서드 이름 패턴을 정의하는 정규식을 통해 이러한 포인트 컷을 지정합니다. 일부 AOP 프레임 워크를 사용하면 메서드 매개 변수의 값과 같은 런타임 결정을 기반으로 조언을 적용할지 여부를 결정하는 동적 포인트 컷을 만들 수 있습니다.

다음 이미지는 Advice, PointCut, Joinpoints를 이해하는 데 도움이 될 수 있습니다.
여기에 이미지 설명 입력

출처

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

외식 할 때 메뉴를보고 선택할 수있는 몇 가지 옵션이 표시됩니다. 메뉴에있는 항목 중 하나 이상을 주문할 수 있습니다. 그러나 실제로 주문하기 전까지는 “식사 기회”일뿐입니다. 주문하고 웨이터가 테이블로 가져 오면 식사입니다.

Joinpoint는 메뉴의 옵션이고 Pointcut은 사용자가 선택하는 항목입니다.

Joinpoint는 코드 내에서 측면을 적용 할 수있는 기회입니다. 그 기회를 잡고 하나 이상의 Joinpoint를 선택하고 그것에 측면을 적용하면 Pointcut이 있습니다.

소스 위키 :

A는 점은 가입 제어 흐름을 통해 도달 할 수있는 프로그램의 제어 흐름에서 포인트입니다 두 개의 서로 다른 경로 (IMO : 그 이유는 전화 관절이다).

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

포인트 컷은 조인 포인트의 집합입니다.


답변

결합 점과 포인트 컷의 차이점을 이해하려면 포인트 컷은 위빙 규칙을 지정하고 결합 포인트는 해당 규칙을 충족하는 상황으로 지정하는 것으로 생각하십시오.

아래 예에서

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

Pointcut은 모든 패키지의 모든 클래스에있는 getName () 메서드에 advice를 적용해야한다는 규칙을 정의하고 joinpoint는 클래스에있는 모든 getName () 메서드의 목록이되므로 이러한 메서드에 advice가 적용될 수 있습니다.

(Spring의 경우 관리 빈에만 Rule이 적용되며 public method에만 advice가 적용될 수있다.)


답변

JoinPoints : 기본적으로 실제 비즈니스 로직의 일부가 아닌 필수 기능을 삽입하려는 실제 비즈니스 로직의 위치입니다. JoinPint의 몇 가지 예는 다음과 같습니다 : 메서드 호출, 정상적으로 반환되는 메서드, 예외를 던지는 메서드, 개체 인스턴스화, 개체 참조 등.

포인트 컷 : 포인트 컷은 결합 점을 식별하는 데 사용되는 정규식과 유사합니다. Pontcuts는 “pointcut expression language”를 사용하여 표현됩니다. 포인트 컷은 크로스 컷 문제를 적용해야하는 실행 흐름의 포인트입니다. Joinpoint와 Pointcut에는 차이가 있습니다. Joinpoint는 더 일반적이며, 교차 절단 우려를 도입 할 ‘선택할 수있는’제어 흐름을 나타내는 반면 pointcuts는 교차 절단 우려를 도입 할 ‘원하는’결합 점을 식별합니다.


답변

개념 AOP를 처음 접하는 사람을위한 평신도 설명. 이것은 완전하지는 않지만 개념을 이해하는 데 도움이됩니다. 기본 전문 용어에 이미 익숙하다면 지금 읽기를 중단 할 수 있습니다.

일반 클래스 Employee가 있고 이러한 메서드가 호출 될 때마다 뭔가를하고 싶다고 가정합니다.

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

이러한 메서드를 JoinPoints 라고 합니다. 프레임 워크가로드 한 모든 클래스 중에서 메서드를 찾을 수 있도록 이러한 메서드를 식별하는 방법이 필요합니다. 따라서 이러한 메서드의 서명과 일치하는 정규식을 작성합니다. 아래에서 볼 수 있듯이 더 많은 것이 있지만 느슨하게이 정규식이 Pointcut을 정의하는 것 입니다. 예 :

* * mypackage.Employee.get*(*)

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

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

  1. 조치를 취해야한다 – 예를 들어, / 전에 메소드 실행 후 또는 예외에
  2. 일치하면 어떻게 해야하나요 (메시지를 인쇄 할 수도 있음)

이 두 가지의 조합을 Advice 라고 합니다.

상상할 수 있듯이 # 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() {....}

BTW,이 전체 논리를 Aspect 라는 클래스에 래핑하고 클래스를 작성합니다.

@Aspect
public class MyAwesomeAspect{....}

이 모든 것을 작동 시키려면 Spring에 클래스를 구문 분석하여 @ AOP 키워드를 읽고 이해하고 조치를 취해야합니다. 이를 수행하는 한 가지 방법은 spring config xml 파일에 다음을 지정하는 것입니다.

<aop:aspectj-autoproxy>


답변

AspectJ와 같은 AOP 언어를 SQL과 같은 데이터 쿼리 언어와 비교하면 조인 포인트 (즉, aspect 코드를 짜는 코드의 모든 위치)를 행이 많은 데이터베이스 테이블로 생각할 수 있습니다. 포인트 컷은 행 / 결합 포인트의 사용자 정의 하위 집합을 선택할 수있는 SELECT stamement와 같습니다. 선택한 위치에 짜는 실제 코드를 조언이라고합니다.


답변

정의

문서에 따라 :

결합 지점 : 메서드 실행 또는 예외 처리와 같은 프로그램 실행 중 지점.

조인트 포인트를 고려할 수 있습니다. 는 프로그램 실행시 이벤트로 . Spring AOP를 사용하는 경우 메서드 호출로도 제한됩니다. AspectJ는 더 많은 유연성을 제공합니다.

그러나 식당에 갈 때 메뉴에있는 음식을 모두 먹지 않기 때문에 모든 이벤트를 처리하지 않습니다 (나는 당신을 모르고있을 것입니다! 그러나, 나는 확실히하지 않습니다). 따라서 처리 할 이벤트와이를 처리 할 작업을 선택합니다. 여기에 Pointcuts가 있습니다. 문서에 따라

Pointcut : 결합 점 과 일치하는 술어 .

그럼 당신은 무엇을 함께 할 수있는 연결 포인트 컷 , 간다 조언 . 문서에 따라

Advice포인트 컷 표현식과 연관되어 있으며 포인트 컷 과 일치하는 모든 결합 포인트에서 실행됩니다.

암호

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 proxy-ed가 우리의 목표입니다!
  • doYourBusiness()가능한 조인트 포인트
  • SomeAspect 우리의 측면은 ExampleBusinessClass
  • somePointCut()조인트 포인트 와 일치 하는 포인트 컷 의 정의입니다.
  • afterSomePointCut()입니다 조언 우리의 전후에 실행되고, somePointCut 포인트 컷 과 일치하는 doYourBusiness() 공동 점은
  • beforeSomePointCut()모든 메소드 실행 과 일치 하는 조언 이기도합니다 public. 과 달리 afterSomePointCut이것은 인라인 포인트 컷 선언을 사용합니다.

나를 믿지 않는다면 문서를 볼 수 있습니다 . 이게 도움이 되길 바란다


답변

둘 다 측면 지향 프로그래밍의 “위치”와 관련이 있습니다.

조인 포인트는 AOP로 코드를 실행할 수있는 개별 장소입니다. 예 : “메서드가 예외를 던질 때”.

포인트 컷은 결합 포인트의 모음입니다. 예 : “Foo 클래스의 메서드가 예외를 throw 할 때”.