File -> New -> Spring Legacy Project -> Simple Spring Maven 선택 후 프로젝트명을 “aophello1” 이라고 입력 후 “Finish” 클릭
단순히 "Hello AOP..." 이라고 출력하는 PrintMsg 클래스의 메소드 sayHello()가 있고 이 클래스에 주변충고(어라운드어드바이스, Around Advice)를 추가해 sayHello() 메소드 실행 전/후 필요한 기능 ("메소드실행전안녕...", "메소드실행후안녕...")을 출력하고자 한다.
2. Spring Framework_Spring AOP
Spring AOP
2. AOP HelloWorld
2.1 AOP HelloWorld(프로그래밍을 통한 AOP 구현)
File -> New -> Spring Legacy Project -> Simple Spring Maven 선택 후 프로젝트명을
“aophello1” 이라고 입력 후 “Finish” 클릭
단순히 "Hello AOP..." 이라고 출력하는 PrintMsg 클래스의 메소드 sayHello()가 있고 이
클래스에 주변충고(어라운드어드바이스, Around Advice)를 추가해 sayHello() 메소드 실행
전/후 필요한 기능 ("메소드실행전안녕...", "메소드실행후안녕...")을 출력하고자 한다.
3. Spring Framework_Spring AOP
package aophello1;
public interface IPrintMsg {
public void sayHello();
}
[IprintMsg.java]
타겟 클래스(충고가 적용될 클래스, 횡단관심사 기능을 구현한 클래스
본 예제에서는 간단히 로깅만 하기로 한다.
package aophello1;
public class PrintMsg implements IPrintMsg {
public void sayHello() {
System.out.println("Hello AOP...");
}
}
[PrintMsg.java]
4. Spring Framework_Spring AOP
어라운드 어드바이스(AroundAdvice)의 구현체, 충고
MethodInterceptor는메소드 호출용 어라운드 어드바이스의 표준 인터페이스이다.
MethodInvocation은 어드바이스를 추가하기 위한 메소드 호출을 나타내며 이 객체를 사용하면 메소드 호출
이 실행되는 시점(메소드실행전/ 후)을 제어할 수 있다.
package aophello1;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
public class MyAroundAdvice implements MethodInterceptor {
public Object invoke(MethodInvocation invocation)
throws Throwable {
System.out.println("메소드실행전안녕...");
Object ret = invocation.proceed();
System.out.println("메소드실행후안녕...");
return ret;
}
}
[MyAroundAdvice.java]
5. Spring Framework_Spring AOP
Proxt 빈 객체를 생성후 MyAroundAdvice 및 타겟 객체인 PrintMsg를 위빙하여 프록시 생성
package aophello1;
import org.springframework.aop.framework.ProxyFactory;
public class HelloMain {
public static void main(String[] args) {
IPrintMsg target = new PrintMsg();
//Proxy 빈껍데기 생성
ProxyFactory pf = new ProxyFactory();
pf.addAdvice(new MyAroundAdvice()); //충고 add
pf.setTarget(target); //타겟 add
PrintMsg proxy = (PrintMsg)pf.getProxy();
proxy.sayHello();
}
}
[HelloMain.java]
[실행결과]
메소드 실행전 안녕...
Hello AOP...
메소드 실행후 안녕...
6. Spring Framework_Spring AOP
2. AOP HelloWorld
2.2 AOP HelloWorld(XML Schema Based AOP 구현)
File -> New -> Spring Legacy Project -> Simple Spring Maven 선택 후 프로젝트명을
“aophello1” 이라고 입력 후 “Finish” 클릭
스프링에서 제공하는 aop Namespace를 이용하는 방법으로 타겟클래스의 sayHello1(),
sayHello2() 메소드 중 sayHello1() 메소드만 주변충고가 적용되도록 구성한 예제이다.
7. Spring Framework_Spring AOP
<!-- Spring AOP + AspectJ -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring-framework.version}</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.6.11</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.6.11</version>
</dependency>
[pom.xml] 에 AOP를 위한 라이브러리 추가
8. Spring Framework_Spring AOP
package aophello1;
public interface IPrintMsg {
public void sayHello1();
public void sayHello2();
}
[IprintMsg.java]
package aophello1;
public class PrintMsg implements IPrintMsg {
public void sayHello1() {
System.out.println("Hello AOP1...");
}
public void sayHello2() {
System.out.println("Hello AOP2...");
}
}
[PrintMsg.java]
9. Spring Framework_Spring AOP
// XML Schema Based AOP 구현에서는 Aspect 클래스에 충고용 메소드를 정의한다.
// 아래 myAdvice가 주변 충고용 메소드로 어떤 메소드에 이 충고가 내려갈지는 XML에서 설정을 한다.
// pjp.procees() 메소드를 통해 원래 타겟 클래스의 sayHello1() 메소드가 호출된다.
package aophello1;
import org.aspectj.lang.ProceedingJoinPoint;
public class LoggingAspect {
public void myAdvice(ProceedingJoinPoint pjp)
throws Throwable{
System.out.println("메소드실행전안녕..."); //메소드 실행 전
Object ret = pjp.proceed();
System.out.println("메소드실행후안녕..."); //메소드 실행 후
}
}
[LoggingAspect.java]
11. Spring Framework_Spring AOP
package aophello1;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class HelloMain {
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("aophello1.xml");
IPrintMsg printMsg = (IPrintMsg) ctx.getBean("printMsg");
//sayHello1만 충고가 내려가도록 되어 있다.
printMsg.sayHello1();
printMsg.sayHello2();
}
}
[HelloMain.java]
12. Spring Framework_Spring AOP
2. AOP HelloWorld
2.3 AOP HelloWorld(@AspectJ Annotation Based AOP 구현)
File -> New -> Spring Legacy Project -> Simple Spring Maven 선택 후 프로젝트명을
“aophello1” 이라고 입력 후 “Finish” 클릭
스프링에서 제공하는 aop Namespace를 이용하는 방법으로 타겟클래스의 sayHello1(),
sayHello2() 메소드 중 sayHello1() 메소드만 주변충고가 적용되도록 구성한 예제이다.
13. Spring Framework_Spring AOP
<!-- Spring AOP + AspectJ -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring-framework.version}</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.6.11</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.6.11</version>
</dependency>
[pom.xml] 에 AOP를 위한 라이브러리 추가
14. Spring Framework_Spring AOP
package aophello1;
public interface IPrintMsg {
public void sayHello1();
public void sayHello2();
}
[IprintMsg.java]
package aophello1;
public class PrintMsg implements IPrintMsg {
public void sayHello1() {
System.out.println("Hello AOP1...");
}
public void sayHello2() {
System.out.println("Hello AOP2...");
}
}
[PrintMsg.java]
15. Spring Framework_Spring AOP
// Aspect 클래스로 충고용 메소드 및 포인트 컷을 정의한다.
// 아래 myAdvice가 주변충고용 메소드로 메소드 상단에 포인트 컷을정의했다.
// pjp.procees() 메소드를 통해 원래 타겟클래스의 sayHello1() 메소드가 호출된다.
package aophello1;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
@Aspect
public class LoggingAspect {
@Around("execution(* aophello1.PrintMsg.sayHello1())")
public void myAdvice(ProceedingJoinPoint pjp)
throws Throwable{
System.out.println("메소드실행전안녕..."); //메소드 실행 전
Object ret = pjp.proceed();
System.out.println("메소드실행후안녕..."); //메소드 실행 후
}
}
[LoggingAspect.java]