개념 AOP를 처음 접하는 사람을위한 평신도 설명. 이것은 완전하지는 않지만 개념을 이해하는 데 도움이됩니다. 기본 전문 용어에 이미 익숙하다면 지금 읽기를 중단 할 수 있습니다.
일반 클래스 Employee가 있고 이러한 메서드가 호출 될 때마다 뭔가를하고 싶다고 가정합니다.
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>