선언적 트랜잭선 관리(declarative transaction management)와 같이 EJB를 대체할 만한 선언적인 엔터프라이즈 서비스를 제공하기 위해 사용하며, 이것으로 OOP를 보완 하기 위해 사용자 정의 apect를 만들어 사용할 때 유용합니다.

6.1.1. AOP concepts

Aspect : 여러 객체를 관통하는 cross-concern을 구현한 것.
Join Point : 프로그램이 실행되는 동안의 여러 시점들.. 그 중에서 Spirng AOP는 메소드 실행 시점 만을 나타냅니다.
Advice : Aspect에 의해 제공되어 특정 join point에 끼어들어 수행하게 될 작업.
Pointcut : 특정 Join point들을 나타내는 표현 방법.
Introduction : 프록시 객체에 추가적인 메소드나 필드를 추가하는 것.
Target object : 하나 또는 여러개의 aspect에 의해 advice가 적용될 객체.
AOP proxy : Aspect를 구현하기 위해 Spring 프레임웤에서 만들어 내는 객체로, JDK의 Proxy인터페이스 또는 CGLib을 사용합니다. Spring 2.0을 사용하면 투명성을 유지하면서[footnote]이전에는 일일히 ProxyFactoryBean을 사용하여 만들어 줬었는데 이제는 그런 일을 안해도 된다는 의미 인듯 합니다.[/footnote] 프록시를 만들 수 있습니다.
Weaving : Aspect를 target 객체에 적용하는 걸 말하며, 컴파일, 클래스 로드, 런타임 때 할 수 있으나 Spring AOP는 런타임 때 합니다.

Advice Type
Before advice : 해당 join point 전에 실행 할 adive.
After returning advice : 해당 join point가 정상적으로 종료 된 뒤에 실행 할 advice
After throwing advice : 해당 join point에서 예외가 발생했을 때 실행 할 advice
After (finally) advice :  해당 join point가 정상적으로 끝나든 예외가 발생하든 무조건 실행 할 advice
Around advice :  위에서 언급한 모든 adivce의 일을 할 수 있고 해당 join point의 실행 여부도 결정할 수 있으며 join point가 반환할 값을 조작할 수 도 있습니다.

Using
the most specific advice type provides a simpler programming model with less
potential for errors.

6.1.2. Spring AOP capabilities and goals

Spring AOP는 자바로 구현했기 때문에 별도의 컴파일 처리가 필요로 하지 않습니다.

Spring AOP는 위에서도 잠시 언급했지만 메소드 실행 join point만 제공합니다.

완벽한 AOP구현이 목적이 아니라 다른 AOP 구현체와의 통합이 목표입니다. 하지만 대부분의경우 Spring AOP만으로도 충분합니다.

AspectJ와 경쟁을 하려는 것이 아니고 프록시 기반의 Spring AOP와 완전한 AOP 프레임워크인 AspectJ는 서로 상호 보완의 관계입니다.

6.1.3. AOP Proxies

6.6 에서 더 자세히 살펴 보겠지만 기본적으로 J2SE의 dynamic proxy[footnote]인터페이스를 사용하여 프록시를 만듭니다.[/footnote]를 사용합니다.

그밖에 CGLIB proxy를 사용하게 될 경우는 다음과 같습니다.
인터페이스를 구현하지 않은 클래스의 프록시를 만들 때
인터페이스에 없는 메소드를 가진 클래스의 프록시를 만들고 싶을 때
메소드의 인자로 인터페이스 타입이 아닌 특정 클래스 타입의 프록시를 넘겨주고 싶을 때