Spring에서 AOP 구현 방법
● AOP 구현
-POJO Class를 이용한 AOP구현
*Spring 설정 파일을 이용한 설정
*어노테이션(Annotation)을 이용한 설정
-스프링 API를 이용한 AOP구현
요번엔 어노테이션(annotation)을 이용한 설정방법 예제를 보겠다.
http://smjava.tistory.com/68 ← 여기서 다뤘던 예제를 활용해서 annotation을 이용해 AOP를 구현해보자
위 글에서 Animal 인터페이스, Cat, Dog, MyAspect 클래스만 복사 붙혀놓기 해서 해보자.
(위글에서는 스프링 설정파일을 이용해 AOP를 구현해보았던 예제 이다.)
위 클래스들을 긁어와서 우선 스프링 설정파일을 만들어 준다.
스프링 설정 파일을 만들고 namespaces 에서 aop, context 채크해주고
다음과 같이 태그달아준다.
<?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"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd">
<context:component-scan base-package="aop6"></context:component-scan>
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
</beans>
Dog, Cat, MyAspect 클래스 위에 Component 를 박아줌으로써 빈객체에 등록해준다.
Dog
package aop6;
import org.springframework.stereotype.Component;
@Component
public class Dog implements Animal{
public void doSomething(){
System.out.println("꼬리를 흔들며 반긴다");
}
}
Cat
package aop6;
import org.springframework.stereotype.Component;
@Component
public class Cat implements Animal{
public void doSomething(){
System.out.println("들어오던지 말던지 신경안쓴다");
}
}
MyAspect클래스에서는 Component 등록 후 이쪽에 공통관심사항 메소드들이 들어있으니 여기서 Aspect 해주자.
MyAspect
package aop6;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
@Component
@Aspect
public class MyAspect {
@Pointcut("execution (public void aop6.*.doSomething())")
public void pt(){
}
@Before("pt()")
public void before(){
System.out.println("주인을 기다린다");
System.out.println("주인이 집에 들어온다");
}
@After("pt()")
public void after(){
System.out.println("밥을 맛있게 먹는다");
}
@AfterReturning(pointcut="pt()")
public void after_returning(){
System.out.println("밥을 준다");
}
@AfterThrowing(pointcut="pt()")
public void after_throwing(){
System.out.println("밤새 운다");
}
}
Aspect는 pointcut + advice 니까 여기서 pointcut 메소드를 만들어서 위와 같이 등록해주고
advice들에 대해서 pointcut을 지정한 메소드 pt()를 지정해준다.
AfterReturning과 AfterThrowing에서 는 pointcut 이라고 지정해주고 pt() 를달아준 이유는
저둘은 반환할 수 있는 다른것 들이 있을 수 있기때문에.
여기서 Around advice를 사용해보면
around advice는 JoinPoint의 하위클래스인 ProceedingJoinPoint 타입의 파라미터를 필수적으로 첫 파라미터로 선언해야 한다.
MyAspect 클래스에서 수정해주자.
package aop6;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
@Component
@Aspect
public class MyAspect {
@Pointcut("execution (public void aop6.*.doSomething())")
public void pt(){
}
@Around("pt()")
public void around(ProceedingJoinPoint pj){
System.out.println("주인을 기다린다");
System.out.println("주인이 집에 들어온다");
try{
pj.proceed();
System.out.println("밥을 준다");
}
catch(Throwable e)
{
System.out.println("밤새 운다");
}
System.out.println("밥을 맛있게 먹는다");
}
}
이제 테스트 해볼 테스트 클래스를 만들어서 돌려보자
스프링 컨테이너 빌드하고~ 빈(bean)객체 받아와서~
package aop6;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
public class Test {
public static void main(String[] args) {
ApplicationContext context
= new FileSystemXmlApplicationContext("src/aop6/applicationContext.xml");
Animal a = context.getBean("dog", Animal.class);
a.doSomething();
}
}
출처 : 삼성SDS멀티캠퍼스
강사 : 홍승길
Email : iccack70@gmail.com
'[Spring]' 카테고리의 다른 글
[Spring]11월 16일 Spring-jdbc 어노테이션(annotation)을 이용해 연동 예제 (0) | 2015.11.24 |
---|---|
[Spring]11월 13일 Spring-jdbc 스프링 설정파일을 이용해 연동 예제(JdbcTemplate) (0) | 2015.11.24 |
[Spring]11월 11일 Spring 설정 파일(xml) 기반 AOP 설정 예제 (0) | 2015.11.11 |
[Spring]11월 11일 Spring AOP용어, AOP 구현 방법, AOP 설정 태그 (0) | 2015.11.11 |
[Spring]11월 10일 Spring AOP 프록시패턴(Proxy pattern) 적용 예제 (0) | 2015.11.10 |