Enabling @AspectJ Support

@AsprctJ 사용을 위한 XML 스키마

<?xml version=”1.0″ encoding=”UTF-8″?>
<beans xmlns=”http://www.springframework.org/schema/beans”
    xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”
    xmlns:aop=”http://www.springframework.org/schema/aop
    xsi:schemaLocation=”
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd“>

    <!– @Aspect 시작 –>
    <aop:aspectj-autoproxy/>

</beans>

찐한 색에 해당하는 부분이 기본적인 XML 설정에 추가 되는 부분입니다.

그리고 두개의 jar파일을 추가해 주면 준비가 끝납니다.
사용자 삽입 이미지

6.3. Schema-based AOP support

Java 5 를 사용하지 못하거나 단순히 XML 설정을 좋아하는 분들은 스키마 기반의 AOP 설정을 사용하여 @AspectJ에서 했던 모든 것을 할 수 있습니다.

단 aop 네임스페이스를 사용하기 위해서는 설정 파일로 스키마 기반의 XML 파일을 사용해야 합니다.

<!– XML Schema-style –>
<?xml version=”1.0″ encoding=”UTF-8″?>
<beans xmlns=”http://www.springframework.org/schema/beans”
       xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”
       xsi:schemaLocation=”
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd”>

<!– <bean/> definitions here –>

</beans>

aop 설정은 모두 <aop:config> </aop:config> 안에 들어가야 하며 이 태그는 <beans> </beans> 내부에서 여러 번 사용할 수 있습니다.

초간단 Schema 기반 Spring AOP

6.3.1. Declaring an aspect

aspect는 일반 클래스로써 그냥 bean으로 등록을 해둡니다. 포인트컷과 어드바이스에 대한 정보는 XML로 나타낼 수 있습니다.

포인트 컷은 @Pointcut의 표현식을 그대로 xml 설정에 적어 주면 되고, advice로 사용할 메소드의 이름을 역시 xml에 적어 주면 될 것 같습니다.

어찌됐든 aspect 역할을 할 bean을 <aop:config> 안에 <aop:aspect> 태그의 ref 속성으로 정의합니다.

Schema 기반 Spring AOP 희한한 것
Schema 기반 Spring AOP 포인트컷 만들 때 주의 할 것

6.3.2. Declaring a pointcut

pointcut은 <aop:config> 또는 <aop:aspect> 태그 안에 <aop:pointcut> 태그를 사용하여 정의할 수 있습니다.

<aop:aspect> 로 정의하면 그 aspect 내에서만 사용할 수 있으며 <aop:config> 바로 하위에 정의하면 여러 aspect에서 사용할 수 있습니다.

6.3.3. Declaring advice

@AspectJ 에서 사용 할 수 있었던 다섯 가지의 Advice 모두 정의할 수 있습니다.
[#M_more..|less..|

 <aop:before
     pointcut-ref=”dataAccessOperation”
     method=”doAccessCheck”/>

<aop:after-returning
     pointcut-ref=”dataAccessOperation”
     method=”doAccessCheck”/>

<aop:after-throwing
     pointcut-ref=”dataAccessOperation”
     method=”doRecoveryActions”/>

<aop:after
     pointcut-ref=”dataAccessOperation”
     method=”doReleaseLock”/>

<aop:around
     pointcut-ref=”businessService”
     method=”doBasicProfiling”/>

_M#]<aop:after-returning> 어드바이스에서 리턴값 받아오기
<aop:around> 어드바이스 예제
Schema 기반 Advice parameters

6.3.4. Introductions

<aop:declare-parents> 를 사용합니다.

<aop:declare-parents
      types-matching=”com.xzy.myapp.service.*+”,
      implement-interface=”UsageTracked”
      default-impl=”com.xyz.myapp.service.tracking.DefaultUsageTracked”/>
 
  <aop:before
    pointcut=”com.xyz.myapp.SystemArchitecture.businessService()
              and this(usageTracked)”
    method=”recordUsage”/>

Schema 기반 Introduction

6.3.5. Aspect instantiation models

스키마 기반에서 제공되는 건 singleton 모델 뿐이고 차후에 나머지도 제공될 예정입니다. 앞에서 살펴봤던 @Aspect 기반에서는 perTarget(singleton) 또는 perThis(peototype) 속성을 사용하여 선택할 수 있었습니다.

6.3.6. Advisors

Advisor 컨셉은 Spring 1.2에서 왔으며 AspectJ에 있는 개념은 아닙니다. AspectJ 스타일의 Pointcut 표현식을 사용할 수 있다는 장점이 있으며 Advisor에서 합 칠 Advice bean은 반드시 이전 유형의 Advice들이 구현해야 했던 인터페이스들을 구현하고 있어야 합니다.

6.3.7. Example

이전 글
의 예제를 스키마 기반으로 다시 작성합니다.

6.1. Introduction

선언적 트랜잭선 관리(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를 사용하게 될 경우는 다음과 같습니다.
인터페이스를 구현하지 않은 클래스의 프록시를 만들 때
인터페이스에 없는 메소드를 가진 클래스의 프록시를 만들고 싶을 때
메소드의 인자로 인터페이스 타입이 아닌 특정 클래스 타입의 프록시를 넘겨주고 싶을 때

Spring 2.0 AOP

참조 : 3월달 마소 AOP 특집 중 토비님의 Spring 2.0 AOP

AOP를 구현 하는 방법.
1. AOP 언어 자체를 확장하는 방법 – AspectJ – 전용 컴파일러 필요함.
2. 그냥 자바 클래스에 설정파일이나 어노테이션을 사용하는 방법
    2-1. 컴파일 된 클래스를 변환하는 방법
    2-2. 클래스 로딩 시 바이트 코드를 조작하는 방법
    2-3. 순수한 자바 언어와 API만을 사용하는 방법 – Spring AOP

Spring AOP는 프록시 기반의 AOP 구현 방법을 사용.
1. 인터페이스에 대한 프록시 만들 때 – JDK의 Dynamic Proxy사용
2. 클래스에 대한 프록시 만들 때 – CGLib 사용

기존 Spring AOP.
1. 포인트컷(Pointcut)
    조인 포인트-Spring AOP는 메소드 실행 시점만 지원-의 묶음
    Spring 1.X 버전에서는 스태틱 포인트컷과 다이내믹 포인트컷 방식이 있다.

2. 어드바이스(Advice)
    Interception arount 어드바이스 : 메소드 실행 전 후 모두, 대상이 되는 메소드의 실행 여부 결정 가능 (ex, MethodInterceptor)
    Before 어드바이스 : 메소드 실행 전에
    Throws 어드바이스 : 메소드에서 예외 발생 했을 때
    After Return 어드바이스 : 메소드 실행 후에
    Introduction 어드바이스 : 기본의 클래스에 동적으로 필드나 메소드 추가

3. 어드바이저(Advisor)
    Advice + Pointcut = Aspect = 어드바이져(ex. DefaultPointcutAdvisor)

4. 프록시
    ProxyFactoryBean : target, proxyIntergace, interceptorNames 속성을 주입하여 사용.
    AutoProxyCreator(ex. BeanNameAutoProxyCreator) : BeanPostProcessor를 사용하여 임의의 빈에 다이내믹하게 프록시 설정 부여함.

5. 한계와 단점
    5-1. Pointcut 인터페이스 구현해야함. 포인트컷 표현, 적용이 어렵다.
    5-2. XML 설정이 복잡해 진다.
    5-3. IoC 컨테이너에 빈으로 등록되지 않은 객체는 적용할 수 없다.
    5-4. 약간의 성능저하
    5-5. 타깃 객체와 프록시가 분리되어 있다,

Spring 2.0 AOP.
1. AspectJ의 애스펙트 선언과 포인트컷 언어 도입
    한계와 단점에서 첫 번째와 두 번째 문제 해결

2. AspectJ AOP 이용방법
    AspectJ를 사용하여 세번째 문제 해결 가능.(@Configurable 사용)
    2-1. Spring 설정과 무관하게 사용.
    2-2. 에스팩트 정의를 빈으로 등록.(factory-method=”aspectOf” 사용)

Aspect Oriented Programming with Spring

6.1. Introduction
AOP의 기본 개념과 Spring AOP의 기능과 목표를 이야기 합니다.
Spring AOP는 Proxy 기반입니다.

6.1. Introduction

6.2. @AspectJ support
어노테이션을 사용하여 AspectJ를 사용하는 방법입니다.
Spring AOP가 지원하는 포인트컷은 method 실행 시점뿐입니다.

6.2. @AspectJ support


6.3. Schema-based AOP support
6.2에서 한 내용을 어노테이션 기반이 아닌 XML에 설정을 사용하는 방법 도 있습니다.

6.3. Schema-based AOP support

6.4. Choosing which AOP declaration style to use
어노테이션을 사용할 것인가? XML 설정을 사용할 것인가?
Spring AOP를 사용할 것인가? AspectJ를 사용할 것인가?

6.4. Choosing which AOP declaration style to use

6.5. Mixing aspect types

어노테이션을 사용하는 방법과 XML 설정을 사용하는 방법을 섞어서 사용할 수 있습니다. 심지어 Spring 1.2 버젼 스타일의 프록시와도 같이 사용할 수 있습니다.

6.6. Proxying mechanisms
JDK 프록시 또는 CGLIB을 사용하는데요. 어떤 인터페이스도 구현하지 않았다면 CGLIB 프록시를 사용하고 그렇지 않은 경우에는 JDK 프록시를 사용합니다.

6.6. Proxying mechanisms

6.7. Programmatic creation of @AspectJ Proxies

AspectJProxyFactory를 사용하여 직접 프록시 클래스를 만들 수 있습니다.

6.8. Using AspectJ with Spring applications

AspectJ의 위버와 컴파일러를 사용할 수 있습니다.

6.9. Further Resources


AspectJ home page
여기서 더 많은 내용을 참조 할 수 있습니다.