Spring AOP : JoinPoint와 PointCut의 차이점은 무엇입니까?
저는 Aspect 지향 프로그래밍 개념과 Spring AOP를 배우고 있습니다. Pointcut과 Joinpoint의 차이점을 이해하지 않습니다. 둘 다 저에게 똑같은 것 가변. Pointcut은 조언을 적용하는 곳이고 Joinpoint는 우리의 조언을 적용 할 수있는 곳이기도합니다. 차이점 차이점은 무엇입니까?
포인트 컷의 예는 다음과 가변합니다.
@Pointcut("execution(* * getName()")
Joinpoint의 예는 무엇입니까?
joinpoint를 : 의 joinpoint는 인 후보 요점 프로그램 실행 태양이 연결 가능 응용 프로그램이 점은 예외가 발생하고, 또는 필드가 수정되고 메소드가 호출되는 수 있습니다 .. 새로운 동작을 추가하기 위해 애 스펙 코드를 애플리케이션의 그래픽 흐름에 삽입 할 수있는 지점입니다.
조언 :이 포인트에 의해 지정된 결합 점에서 수행 할 조치를 결합 시스템 전반에 대한 API 호출을 포함하는 오브젝트입니다.
포인트 컷 ( Pointcut) : 포인트 컷은 어떤 결합 점에서 관련 조언이 적용되어야합니다. AOP 프레임 워크에서 지원하는 모든 조인 포인트에서 조언을 적용 할 수 있습니다. 물론 가능한 모든 결합 지점에서 모든 층을 적용하고 싶지는 않습니다. 포인트를 사용하면 위치를 이용할 수 있습니다. 지정 명시적인 클래스 및 메서드 이름을 사용하거나 일치하는 클래스 및 메서드 이름 패턴을 정의하는 정규식을 통해 포인트 컷을합니다. 일부 AOP 프레임 워크를 사용하면 메소드 매개 변수의 값과 같은 실행 결정을 기반으로 조언을 적용할지 여부를 결정하는 동적 포인트 컷을 만들 수 있습니다.
다음 이미지는 Advice, PointCut, Joinpoint를 이해하는 데 도움이 될 수 있습니다.
레스토랑 비유를 출처 설명 : @Victor의 출처
식당에 가면 메뉴를 선택할 수있는 몇 가지 옵션이 표시됩니다. 메뉴에있는 항목 중 하나 이상을 주문할 수 있습니다. 실제로 주문하기는 "식사 기회"일뿐입니다. 주문하면 웨이터가 테이블로 가져와 가면 식사가됩니다.
Joinpoints는 메뉴의 옵션이고 Pointcuts는 사용자가 선택하는 항목입니다.
Joinpoint는 코드 내에서 계층을 적용 할 수있는 기회입니다. 그 기회를 하나 이상의 Joinpoint를 선택하고 거기에서 적용하면 Pointcut이 있습니다.
소스 위키 :
A는 점은 가입 제어 흐름을 통해 도달 할 수있는 프로그램의 제어 흐름에서 포인트 두 개의 서로 다른 경로입니다 (IMO : 그 이유는 전화 관절이다).
조언 은 다른 기능을 수정하는 기능 클래스를 설명합니다.
포인트 컷은 조인 포인트의 집합입니다.
결합 점과 포인트 컷의 차이점을 이해해야 할 포인트 컷을 직조 규칙을 지정하고 결합 포인트를 해당 규칙을 선정하는 상황으로 지정하는 것과 같은 생각하십시오.
아래 예에서
@Pointcut("execution(* * getName()")
Pointcut은 모든 패키지의 모든 클래스에있는 getName () 메소드에 조언을 적용해야 할 규칙을 정의하고 joinpoint는 클래스에있는 모든 getName () 메소드의 목록이 될 것입니다.
(봄의 경우 관리 빈에만 규칙이 적용되는 공공 방식에만 조언이 수있다.)
JoinPoints : 기본적으로 실제적인 비즈니스 기능의 약간은 필요하지만 약간의 기타를 삽입하려는 실제 비즈니스의입니다. JoinPint의 몇 가지 예는 다음과 가능한 메서드 참조 호출, 즉 반환되는 메서드, 예외를 던지는 메서드, 개체 인스턴스화, 개체를 참조합니다.
포인트 컷 : 포인트 컷은 결합 점을 광역하는 데 사용되는 정규식과 유사합니다. Pontcuts는 "pointcut expression language"를 사용하여 표현됩니다. 포인트 컷은 크로스 컷 문제를 적용해야하는 실행 흐름의 포인트입니다. Joinpoint와 Pointcut은 차이가 있습니다. 조인 포인트는 더 일반적이며 크로스 컷 문제를 '선택할 수있는'제어 흐름을 반면 포인트 컷은 크로스 컷 문제를 '우리가 원하는'조인 포인트를 찍습니다.
개념 AOP를 처음 접하는 사람을위한 평신도 설명. 이것은 완전하지만 개념을 이해하는 데 도움이됩니다. 기본 전문 용어에 이미 익숙해지면 지금 읽기를 중단 할 수 있습니다.
일반 클래스 직원이 있어야 할 메서드가 호출 될 때마다 행동을하고 싶다고 가정합니다.
class Employee{
public String getName(int id){....}
private int getID(String name){...}
}
이 방법을 JoinPoints 라고 합니다. 모든 클래스에서 작동하는 방법을 지원합니다. 따라서 방법의 서명과 일치하는 정규식을 작성합니다. 아래에서 볼 수 더 많은 것들이 있습니다. 정규식이 Pointcut을 정의하는 것 입니다. 예 :
* * mypackage.Employee.get*(*)
첫 번째 *는 수정 자 public / private / protected / default입니다. 두 번째 *는 메서드의 반환 유형입니다.
하지만 다음 두 가지를 더 말해야합니다.
- 때 조치를 취해야한다 - 예를 들어, / 전에 메소드 실행 후 또는 예외에
- 일치하면 어떻게 해야하나요 (기부를 인쇄 할 수도 있음)
이 두 가지의 조합을 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와 가변합니다. 선택한 위치에 짜는 실제 코드를 조언이라고합니다.
둘 다 지향 프로그래밍의 "위치"와 관련이 있습니다.
조인 포인트는 AOP로 코드를 수있는 수있는 장소입니다. 예 : "메서드가 예외를 던질 때".
포인트 컷은 결합 포인트의 모음입니다. 예 : "Foo 클래스의 메서드가 예외를 던질 때".
정의
문서에 따라 :
결합 지점 : 메소드 실행 또는 예외 처리와 같은 프로그램 실행 중 지점.
실행할 포인트 는 프로그램 실행시 이벤트로 실행할 수 있습니다 . 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
이것은 인라인 포인트 컷 선언을 사용합니다.
저를 믿지 않는다면 문서를 볼 수 있습니다 . 이게 도움이 되길 바란다
JoinPoint : Joinpoint는 Exception catch, 다른 메서드 호출과 같이 실행 흐름이 변경된 프로그램 실행 지점입니다.
PointCut : PointCut은 기본적으로 조언 (또는 호출 aspect)을 넣을 수있는 Joinpoint입니다.
따라서 기본적으로 PointCuts는 JoinPoints의 하위 집합입니다 .
mgroves에 동의합니다. 포인트 컷은 여러 조인트 포인트의 집합으로 간주 될 수 있습니다. 조인트 포인트는 조언이 구현 될 수있는 특정 위치를 지정합니다. 포인트 컷은 모든 조인트 포인트 목록을 반영합니다.
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
클래스 를 사용하여 조인 포인트의 속성에 액세스 할 수 있습니다 .
봄의 AOP에는 {Advisor, Advice, Pointcut, Joinpoint}가 있습니다.
아시다시피 aop의 주요 목적은 애플리케이션 코드에서 교차 절단 관심사 로직 (Aspect)을 분리하는 것이므로 Spring에서이를 구현하기 위해 (Advice / Advisor)를 사용합니다.
Pointcut은 "모든 메서드가 insert로 시작"과 같이이 조언을 정확히 적용하려는 위치를 필터링하는 데 사용되므로 다른 메서드는 제외되므로 Pointcut 인터페이스 {ClassFilter and MethodMatcher}에 있습니다.
따라서 Advice는 교차 절단 논리 구현이고 Advisor는 조언과 PointCut입니다. 만약 당신이 조언 스프링을 사용한다면 그것을 조언자에게 매핑하고 포인트 컷을 TRUE로 만들 것입니다. 그렇기 때문에 어드바이스 만 사용하면 필터링하지 않았으므로 대상 클래스의 모든 메서드에 적용됩니다.
그러나 Joinpoint는 프로그램의 한 위치입니다. Class 객체에 접근 할 때 리플렉션처럼 생각할 수 있습니다. 그런 다음 Method 객체를 얻을 수 있습니다. 그러면이 클래스의 모든 메서드를 호출 할 수 있습니다. 이렇게 생각하면 컴파일러가 작동합니다. 이것은 Joinpoint를 상상할 수 있습니다.
Joinpoint는 필드, 생성자 또는 메서드와 함께있을 수 있지만 Spring에서는 메서드와 만 joinpoint가 있으므로 Spring에서는 Joinpoint 유형 (Before, After, Throws, Around)이 있으며 모두 클래스의 위치를 참조합니다.
내가 언급했듯이 포인트 컷 (필터 없음)없이 어드바이스를받을 수 있으며 모든 메쏘드에 적용되거나 특정 메쏘드에 적용되는 [advice + pointcut] 어드바이저를 가질 수 있지만 어드바이스 없이는 어드바이스를받을 수 없습니다. pointcut과 같이 joinpoint를 지정해야하므로 spring의 advice 유형은 joinpoint와 정확히 동일한 유형이므로 어드바이스를 선택할 때 암시 적으로 어떤 joinpoint를 선택해야합니다.
요약하자면, advice는 대상 클래스에 대한 관점의 구현 로직입니다.이 어드바이스는 호출 전, 호출 후, 호출 후 또는 호출 주변과 같은 조인 포인트를 가져야합니다. 그런 다음 pointcut을 사용하여 정확히 적용 할 위치를 필터링 할 수 있습니다. 메서드를 필터링하거나 pointcut을 사용하지 않고 (필터 없음) 클래스의 모든 메서드에 적용됩니다.
JoinPoint : 어플리케이션에서 Advice가 실행될 지점 (방법)을 지정합니다.
Pointcut : JoinPoints의 조합이며 JoinPoint Advice가 실행될 시점을 지정합니다.
조인 포인트는 실제로 조언을하는 곳입니다.
그러나 포인트 컷은 결합 포인트의 모음입니다. 그것은 우리가 교차 절단 논리를 얼마나 많은 방식으로 배치 하는지를 의미합니다.
'ProgramingTip' 카테고리의 다른 글
Android Studio- 프로젝트 평가 리스너 오류를 알리지. (0) | 2020.10.16 |
---|---|
API <11에 대한 Android invalidateOptionsMenu () (0) | 2020.10.15 |
Bower : 2 가지 버전의 jQuery 설치 (0) | 2020.10.15 |
태그 (0) | 2020.10.15 |
Django 모델에서 UUID를 기본 키로 사용 (일반 관계 영향) (0) | 2020.10.15 |