donaricano-btn

AOP_2


1. 애노테이션을 이용한 AOP

1_1 Advice

getProduct() 이용 할떄 마다 어드바이스 동작

- 애노테이션이 붙어있는 것을 어드바이스라한다

- execution포인트컷이며 필터링 조건이다


1_2. Bean


1_3. Annotation Advice

a. @Before, @After

1) 기본형태

@Before("primitivePointCut"), @After("primitivePointCut")

메소드명은 임의

메소드의 인수는 없는게 기본

메소드의 반환값은 void가 기본

2) 메소드 명을 출력하도록 변경

- org.aspectj.lang.JoinPoint설정


b. @AfterReturning

1) 기본형태
@AfterReturning(value="primitivePointcut", returning="반환값의 변수명")
메소드 호출이 예외를 내보내지 않고 종료했을때
메소드명은 임의
메소드인수는 AOP 적용대상이 된 메소드의 반환형과 매노테이션의 returning속성에서 지정한 변수명으로 해야함
반환값은 void가 기본

c. @Around
1) 기본형태
@Around("primitivePointcut")
메소드 호출 전후
메소드명은 임의
메소드의 파라미터에는 반드시 org.aspectj.lang.ProceedinJoinPoint를 기술
반환값은 AOP의 대상이 된 메소드의 반환값의 형과 호환성이 있어야한다. 예를 들어 반환값의 형을 object로 해두면좋다

2) proceed()
AOP 대상이 되는 메소드 호출은 인수로 기술된 org.aspectj.lang.ProceedingJoinPoin 클래스의 proceed메소드를 통해 이루어진다

3) 메소드명 출력하도록 변경

4) 다른 어드바이스 처럼 사용
- proceed() 앞에 처리를 기술하면 @before
- proceed()를 trey-catch로 묶으면 @AfterThrowing

d. @AfterThrowing

1) 기본형태
@AfterThrowing(value="primitivePointcut", throwing="예외변수명")
AOP의 대상이 되는 메소드에서 예외가 발생 했을때만 동작
메소드명은 임의
메소드의 인수에는 캐치하고 싶은 예외를 기술하고 그변수명은 애노테이션의 throwing 속성으로 지정한 "예외늬 변수명"과같다
메소드의 반환값은 기본 void

2. Bean 정의 파일을 이용한 AOP

3. 포인트컷 기술 방법

- AspectJ 라는 AOP제품 사용

- 호출하는 쪽의 메소드나 클래스, 호출되는 쪽의 메소드나 클래스를 조건으로 지정할 수 있는 Primitive Pointcut이라 불리는 포인트컷이 준비됨

- 자주사용하는 포인트컷은 execution 이다


3_1. execution기본 문구

execution(메소드 수식자^메소드의 반환값^패키기.클래스 또는 인터페이스.메소드명(인수의 형|. 인수의형...| ^throws^에외)

^:공백을 의미함 

Example

- public String getMethod() 메소드에서 에스펙트를 실행할 수 있는 포인트컷 기술방법은?

a : execution(public String com.kyle.service.ProductDaoImpl.getProduct())

b : execution(* *..*getMethod())

c : execution(* *..ProductDaoImpl.*())

d : execution(public String get*(..))

e : execution(* com.kyle.service.*.*(..))


3_2. 논리연산자 이용

- 포인트컷은 몇가지 포인트컷을 조합해서 사용가능

1) || 또는 OR

Example

execution(* *..ProductServiceImpl.findProduct()) or

execution(* *..ProductDaoImpl.getProduct())

Define

findProduct() 또는 getProduct()를 지정


2) && 또는 and

Example

execution(* * ProductServiceImpl.findProduct())&&

execution(* *..ProductDaoImpl.getProduct())

Define

findProduct() 와 getProduct()를 지정


3) !또는 not    

Example

execution(* findProduct()) and not

execution(* *..ProductDaoImpl.*())

Define

ProductDaoImpl이외의 클래스의 메소드 findProduct() 를 지정


'Back-End > SpringFrame_1' 카테고리의 다른 글

[Spring] DataAccessLayer_2  (0) 2016.07.31
[Spring] DataAccessLayer_1  (0) 2016.07.25
[Spring] DI_2  (0) 2016.07.17
[Spring] DI_1  (0) 2016.07.16
[Spring] AOP_1  (0) 2016.07.04
블로그 이미지

리딩리드

,