@AspectJ 는 Java 5에 추가된 어노테이션을 사용하여 aspect를 정의하는 스타일을 말하며 이것은 AspectJ 라이브러리를 사용하여 AspectJ 5와 동일한 방법으로 aspect와 pointcut을 정의할 수 있습니다.

하지만 Spring AOP를 사용하여 실행하기 때문에 AspectJ의 weaver나 complier는 사용하지 않아도 됩니다. 그것들을 사용하면 AspectJ의 모든 기능을 사용할 수 있습니다.

6.2.1. Enabling @AspectJ Support

autoproxing을 사용하여 자동으로 aspect가 적용될 bean의 프록시를 만들게 됩니다. 이렇게 하려면 설정파일에 간단한 설정을 추가해 주면 됩니다.

스키마 기반의 XML에서는 다음의 한 줄을 추가하면 됩니다.
<aop:aspectj-autoproxy/>

DTD 기반의 XML에서는 다음과 같이 적어 줍니다.
<bean class="org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator" />

아마도 내용은 동일한데 스키마 기반이라 네임스페이스를 달리하여 좀 더 간단하게 선언할 수 있는듯 합니다.

XML 스키마(Schema)
(2)

6.2.2. Declaring an aspect

@Aspect를 클래스 선언 위에 붙여 줍니다. 그리고 bean으로 등록하여 주기만 하면BeanPostProcessor가 알아서 찾아서 Spring AOP 설정으로 사용하게 될 겁니다.

물론 일반 클래스기 때문에 평범한 클래스처럼 사용할 수 있습니다. 아마도 그렇기 때문에 투명성(transparency)을 보장하게 됐다는 것이 아닌가 싶습니다. 자기 자신이 Aspect로 사용되지만 일반 클래스와 다를바가 없기 때문이죠.(물론 어노테이션이 좀 붙는 건 어쩔 수 없겠지만요.ㅋㅋ)

Enabling @AspectJ Support

6.2.3. Declaring a pointcut

pointcut 선언은 두 부분으로 나눠집니다. pointcut 서명(signature) 부분과 표현(expression) 부분입니다.
서명 부분은 일반 메소드 선언 부분과 동일합니다.(반드시 리턴타입이 void 여야 합니다.)
표현 부분은 @Pointcut 을 사용하며 AspectJ 5의 형식을 사용합니다.

초간단 @Pointcut 과 @Advice 예제
@Pointcut Designator

6.2.4. Declaring advice

pointcut 표현식과 함께 사용할 수 도 있고 pointcut 이름을 사용하여 특정 메소드의 실행 전, 후, 예외가 발생했을 때 등에 할일을 추가할 수 있습니다.

@Before("com.xyz.myapp.SystemArchitecture.dataAccessOperation()")
이런식으로 @Before 를 사용하여 before advice를 만들 때 이 advice가 적용될 포인트 컷의 이름을 줄 수 있으며

@Before("execution(* com.xyz.myapp.dao.*.*(..))")
이렇게 직접 pointcut 표현식을 사용하여 advice가 적용될 지점을 나타낼 수도 있습니다.(in-place pointcut)

같은 pointcut이 여러 advice에서 사용될 거라면 이름을 사용하는 방법이 좋겠죠.

@AfterReturning 어드바이스 만들기
@Around 어드바이스 예제
Advice parameters
Advice ordering

6.2.5. Introductions

@DeclareParents 을 사용하여 선언하며 지정된 타입들이 새로운 부모 클래스를 상속 받도록 합니다.

새로 추가 할 메소드나 필드를 모아놓은 인터페이스를 만들고 그 인터페이스를 구현한 클래스를 만듭니다. 그리고 이 인터페이스의 기능을 추가할 대상 클래스들을 지정해 주고 구현한 클래스를 묶어 주면 대상 클래스들도 해당 인터페이스 타입으로 사용할 수 있게 됩니다. 즉 새로운 메소드와 필드를 추가적으로 사용할 수 있게 됩니다.

Introduction 예제

6.2.6. Aspect instantiation models

@Aspect의 속성으로 perthis와 pertarget을 사용할 수 있습니다.

perthis는 해당 포인트컷에 매칭되는 메소드를 실행할 때 새로운 Aspect 객체를 만들고 그 메
소드를 가진 객체와 연관을 맺게 됩니다. 즉 타겟 객체와 묶이게 되는거죠. 해당 타겟 객체와 연관된 aspect 객체가 만들어 지기 전가진 advice가 적용되지 않습니다.

pertarget는 perthis와 다른건 포인트컷에 매칭되는 메소드를 가진 객체들 마다 새로운 aspect객체를 만들지 않고 딱 하나만 만든다는 것만 다르고 나머진 같습니다.

6.2.7. Example

around advice를 사용하여 PessimisticLockingFailureException을 잡아서 처리하고 사용자에게 안 보이도록 하는 aspect를 만들어 봅니다.