최범균님의 스프링과 인터넷검색을 기반으로 제가 볼 용도의 글을 쓰는것입니다.

흐음.. 기본적으로 스프링AOP는 스프링의 빈 객체에 대해서만 적용된다.
즉 스프링을 이용하지 않는 객체에 AOP를 적용하고 싶다면...?

스프링의 xml 설정을 바꾸어서 AspectJ를 적용할 수 있다.

AspectJ 를 이용해서 그냥 new 등을 통해 생성된 객체에도 AOP 기능을 쓸 수 있다는 의미이다!!

예제 결과를 보기 전 까지는 이게 뭐지였음; 근데 실행문을 보고 나서야 의미를 알았음;
아마 AspectJ를 몰라서 그런거였겠지;?


객체와 Advice 를 weaving 할 설정은
<?xml version="1.0" encoding="utf-8" ?>

<!DOCTYPE aspectj PUBLIC 
"-//AspectJ//DTD//EN"
"http://www.eclipse.org/aspectj/dtd/aspectj.dtd">

<aspectj>
// Aspect 의 설정 및 적용할 범위를 정의함 
<weaver>
<include within="madvirus.spring.chap05.board.service.*" />
<include within="madvirus.spring.chap05.board.Article" />
</weaver>
// 어떤 Aspect를 적용할지 정의함
<aspects>
<aspect name="madvirus.spring.chap05.aop.annot.ProfilingAspect"/>
</aspects>
</aspectj>

이렇게 어떤 패키지에 어떤 Aspect를 적용할지 설정 한다.  

 그 다음 스프링 설정 xml 에 <context:load-time-weaver /> 를 추가함

==============================================

AspectJ를 이용한 객체의 DI 처리..
 
스프링 컨테이너를 통해서 생성되는 빈객체는 의존관계처리가 가능하고, 결과 의존성도 줄이고 결합도도 낮출 수 있다.
허나 역시,  스프링 컨테이너를 통하지 않은 생성에서는 제어할 수 없다.

 이를 스프링의 AspectJ 지원기능을 이용하면 스프링 컨테이너밖에서 생성되는 객체에 대해서도 DI를 적용할 수 있게 된다.

해당 클래스에 
 @Configurable 어노테이션을 적용한다.
역시 설정에 weaving을 해야하고,  


'IT > 스프링' 카테고리의 다른 글

DispatcherServlet... more  (0) 2012.01.10
Spring 3.0 MVC 정리  (0) 2012.01.10
weaving??  (0) 2012.01.09
Pointcut 표현식... execution , within  (0) 2012.01.06
JointPoint ..?  (0) 2012.01.06


aop 설정을 자주 잊어버리는데 잊지 않기 위한...


1. 우선 aspect 를 정의 한다. 그리고 정의할때 기능이 담긴 advice를 ref 로 둔다.

<aop:aspect id="traceAspect1" ref="performanceTraceAdvice"> .... </aop:aspect>  .... 부분의 내용을 채우면된다.

2. 두번째로는 pointcut을 정의 한다. express 에는 포인터컷의 대상이될 대상들을 AspectJ의 표현식으로 정의한다.

         <aop:pointcut id="publicMethod" expression="execution(public * madvirus.spring.chap05.board..*(..))"/>

3. 세번째로는 2번에서 선언한 포인트컷을 적용할 차례이다. 이때 적용할 .. 선언되어있는 포인트컷을 pointcut-ref 에 대입한다.
method는 pointcut 대상 메소드가 호출될때 실행될 공통기능으로, 정의된 빈 .. advice 클래스의 어떤 메소드가 호출될지를 정의한다.
즉 performanceTraceAdvice 로 선언된 bean id의 클래스에 trace 라는 메소드가 있어야 한다.

        <aop:around pointcut-ref="publicMethod" method="trace"/>



XML 설정을 통한 AOP 설정

최범균님의 스프링과 인터넷검색을 기반으로 제가 볼 용도의 글을 쓰는것입니다.

<aop:config>
 // Aspect 설정에서 <aop:aspect> 태그는 한 개의 Aspect를 설정함 , 
// ref 는 적용할 공통기능을 구현한 빈을 설정함 즉, 어드바이스? advice
<aop:aspect id="traceAspect1" ref="performanceTraceAdvice">  (1. 어스팩트 선언)
// Advice를 적용할 pointcut은 <aop:pointcut> 태그를 이용하여 설정한다.id는 식별값, expression 은 포인트컷을 정의하는 AspectJ의 표현식 ( 2. 포인트컷 정의)
<aop:pointcut id="publicMethod"
expression="execution(public * madvirus.spring.chap05.board..*(..))" />
// 아래는 Advice가 적용될 포인트컷의 정의중하나이다.  pointcut or pointcut-ref 속성으로 Advice가 적용될 포인트컷을 지정하는것이다.
//pointcut-ref는 <aop:pointcut> 태그를 이용하여 설정한 Pointcut을 참조할때 사용되고, pointcut 속성은 직접 AspectJ 표현식을 이용하여 
//Pointcut을 지정할때 사용된다.  ( 3. 포인트컷 적용 )

// 즉 aop:around pointcut  또는  aop:around pointcut-ref  둘중하나인데 포인트컷을 선언하고 그걸 쓰는건 아래 
<aop:around pointcut-ref="publicMethod" method="trace" />
</aop:aspect>


/////////////////////////////////////////////////////////////////////////////////////////////////////////////


// 아래는 포인트컷을 안만들고 aop:around pointcut 으로 해서 표현식으로 대상을 정하는 방식
<aop:aspect id="traceAspect2" ref="performanceTraceAdvice">
<aop:around pointcut="execution(public * madvirus.spring.chap05.member..*(..))" 
// method 는 Pointcut 대상메소드가 호출될때 실행될 공통기능으로 정의된 빈클래스의 어떤 메소드가 호출될지를 정의함 
method="trace" />
</aop:aspect>
</aop:config>

위 내용을 간단히 풀어보자면....

난 performanceTraceAdvice 메소드에 대한 aspect를 만들건데, 그 대상은 포인트컷 publicMethod 에 정의했어.
그리고 그 포인트컷을 사용하도록 aop:around 를 선언할거야. 

==========================================

Before Advice 는 대상객체가 실행되기 전에 호출된다.
즉, 만약 Before Advice 에서 에러가 나면 원래 실행되어야 할 객체가 실행되지 않을 수 도 있게 된다.
이를 잘 이용하면, 권한 검사이 접근권한이 없으면 예외를 발생시켜서 호출을 막는 형태의 구현도 가능하다나 뭐라나...

After Advice 는... try catch finally 에서 finally랑 비슷하다. 즉 메서드 실행됐는지, 예외를 발생시켰는지의 여부에 상관없이 메서드 실행이
종료된 이후에 적용된다.


Around Advice 는 다른 모든 어드바이스를 한번에 구현할 수 있는 Advice 라고 보면된다. 
(즉 실행될 객체를 조인트포인트로 가져오므로 원하는 내용을 실행될 객체 앞뒤에 쉽게 배치할 수 있다)

 
혹은
<bean id="logging" class="madvirus.... LoggingAspect"/>

<aop:config>
    <aop:pointcut id="servicePointcut"
        expression="execute(* *..*Service.*(..))" />

    <aop:aspect id="logginAspect" ref="logging">
        <aop:around pointcut-ref="servicePointcut" method="logging"/>
    </aop>
</aop:config>

처럼 포인트컷 만들고 (express 설정) 그 포인트컷을 쓰는 aspect를 만든다고 생각해도 간단하다

Service로 끝나는 인터페이스를 구현한 모든 클래스의 모든 메소드에 LoggingAspect 가 적용된다는의미이다.



'IT > 스프링' 카테고리의 다른 글

Advice..?  (0) 2012.01.06
@Aspect 어노테이션을 이용한 AOP 설정  (0) 2012.01.05
registerShutdownHook ?  (0) 2011.12.29
스프링3.0 어노테이션 .. annotation  (0) 2011.12.28
Spring Filter components in auto scanning  (0) 2011.12.28

+ Recent posts