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


88

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

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

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

Joinpoint의 예는 무엇입니까?

답변:


161

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

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

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

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

출처

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

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

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

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

소스 위키 :

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

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

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


3
정답으로 표시되어야합니다. 더 많은 정보를 추가하려면 Cragi Walls 답변을 참조하십시오 ... coderanch.com/t/485525/Spring/Difference-Joint-Point-Point-Cut .
Victor

2
요점 : 포인트 컷은 어떤 조인 포인트 조언이 적용되어야하는지 정의합니다 +1
Naman Gala

확인, more Joinpoints and apply an aspect to them, you've got a Pointcut. 측면 또는 조언을 위해?
Asif Mushtaq

@Premraj 그래서, 당신의 비유 조언에 따르면 식사를 주문할 것입니다. 내가 맞아?
Vishwas Atrey

레스토랑 비유는 JoinPoints와 포인트 컷 간의 혼란을 없애는 데 도움이되었습니다. 감사합니다!
SM

30

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

아래 예에서

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

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

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


1
"Pointcut은 모든 패키지의 모든 클래스에있는 getName () 메서드에 advice를 적용해야한다는 규칙을 정의하고 joinpoint는 클래스에 존재하는 모든 getName () 메서드의 목록이 될 것이므로 이러한 메서드에 자문을 적용 할 수 있습니다." 미안하지만 더 혼란스러워지고 있습니다. 현실 세계의 일상 시나리오를 비유 해 주시겠습니까?
Saurabh Patil 2013

28

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

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


1
Joinpoint-조언 코드를 적용 / 실행할 수있는 잠재적 장소. Pointcut-어드바이스를 실행하기 위해 실제로 선택된 조인 포인트.
user104309

25

개념 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>


1
저는 AOP를 처음 접했고이 설명은 Advice / Pointcuts / JoinPoints 간의 관계를 아주 명확하게 이해하는 데 도움이되었습니다.
Jatin Shashoo

이것은 초보자에게 훨씬 더 나은 설명입니다. 감사합니다
Aakash

11

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


9

정의

문서에 따라 :

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

조인트 포인트를 고려할 수 있습니다. 는 프로그램 실행시 이벤트로 . 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이것은 인라인 포인트 컷 선언을 사용합니다.

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


1
간단한 설명. 인용 된 세 개의 텍스트만으로도 충분합니다. 감사.
TRiNE

6

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

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

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


4

JoinPoint : Joinpoint는 Exception catch, 다른 메서드 호출과 같이 실행 흐름이 변경된 프로그램 실행 지점입니다.

PointCut : PointCut은 기본적으로 조언 (또는 호출 aspect)을 넣을 수있는 Joinpoint입니다.

따라서 기본적으로 PointCuts는 JoinPoints의 하위 집합입니다 .


3

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

아시다시피 aop의 주요 목적은 애플리케이션 코드에서 교차 절단 관심사 로직 (Aspect)을 분리하는 것이므로 Spring에서이를 구현하기 위해 (Advice / Advisor)를 사용합니다.

Pointcut은 "모든 메서드는 insert로 시작"과 같이이 조언을 정확히 적용하려는 위치를 필터링하는 데 사용되므로 다른 메서드는 제외되므로 Pointcut 인터페이스 {ClassFilter and MethodMatcher}에 있습니다.

따라서 Advice는 교차 절단 논리 구현이고 Advisor는 조언과 PointCut입니다. 만약 당신이 조언 스프링 만 사용한다면 그것을 조언자에게 매핑하고 포인트 컷을 참으로 만들 것입니다. 이것은 아무것도 차단하지 않는다는 것을 의미합니다. 그렇기 때문에 어드바이스 만 사용하면 필터링하지 않았으므로 대상 클래스의 모든 메서드에 적용됩니다.

그러나 Joinpoint는 프로그램의 한 위치입니다. Class 객체에 접근 할 때 리플렉션처럼 생각할 수 있습니다. 그런 다음 Method 객체를 얻을 수 있습니다. 그러면이 클래스의 모든 메서드를 호출 할 수 있습니다. 이렇게 생각하면 컴파일러가 작동합니다. 이것은 Joinpoint를 상상할 수 있습니다.

Joinpoint는 필드, 생성자 또는 메서드와 함께있을 수 있지만 Spring에서는 메서드와 만 joinpoint가 있으므로 Spring에서는 Joinpoint 유형 (Before, After, Throws, Around)이 있으며 모두 클래스의 위치를 ​​참조합니다.

내가 언급했듯이 포인트 컷 (필터 없음)없이 어드바이스를받을 수 있으며 모든 메쏘드에 적용되거나 특정 메쏘드에 적용되는 [advice + pointcut] 어드바이저를 가질 수 있지만 어드바이스 없이는 어드바이스를받을 수 없습니다. pointcut과 같이 joinpoint를 지정해야하므로 spring의 advice 유형은 joinpoint와 정확히 동일한 유형이므로 어드바이스를 선택할 때 암시 적으로 어떤 joinpoint를 선택해야합니다.

요약하자면, advice는 대상 클래스에 대한 관점의 구현 로직입니다.이 어드바이스는 호출 전, 호출 후, 호출 후 또는 호출 주변과 같은 조인 포인트를 가져야합니다. 그런 다음 pointcut을 사용하여 정확히 적용 할 위치를 필터링 할 수 있습니다. 메서드를 필터링하거나 pointcut을 사용하지 않고 (필터 없음) 클래스의 모든 메서드에 적용됩니다.


3

Pointcut은 Aspect-클래스 구현에 정의됩니다. 포인트 컷은 기본적으로 어드바이스 내의 포인트 컷 표현을 말합니다.

예를 들어,

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

위의 의미는 "includeAddOns"메서드가 모든 메서드 ( "app.purchase2.service.impl"패키지 내의 클래스)를 호출하기 전에 호출된다는 것을 의미합니다 (@Before 조언으로 인해).

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

조인트 포인트는 "app.purchase2.service.impl"패키지의 메소드를 "includeAddOns ()"aspect 클래스의 메소드에 결합한 실제 메소드 호출입니다.

org.aspectj.lang.JoinPoint클래스 를 사용하여 조인 포인트의 속성에 액세스 할 수 있습니다 .


좋은 대답입니다! 마침내 나는 그 차이를 이해했습니다!
Dante

2

mgroves에 동의합니다. 포인트 컷은 여러 조인트 포인트의 집합으로 간주 될 수 있습니다. 조인트 포인트는 조언이 구현 될 수있는 특정 위치를 지정합니다. 포인트 컷은 모든 조인트 포인트 목록을 반영합니다.


0

JoinPoint : 어플리케이션에서 Advice가 실행될 지점 (방법)을 지정합니다.

Pointcut : JoinPoints의 조합이며 JoinPoint Advice가 실행될 시점을 지정합니다.


-5

조인 포인트는 실제로 조언을하는 곳입니다.

그러나 포인트 컷은 결합 포인트의 모음입니다. 그것은 우리가 교차 절단 논리를 얼마나 많은 방식으로 배치 하는지를 의미합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.