Spring Framework
Spring AOP
AOP Helloworld
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() 메소드 실행
전/후 필요한 기능 ("메소드실행전안녕...", "메소드실행후안녕...")을 출력하고자 한다.
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]
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]
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...
메소드 실행후 안녕...
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() 메소드만 주변충고가 적용되도록 구성한 예제이다.
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를 위한 라이브러리 추가
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]
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]
Spring Framework_Spring AOP
<?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-4.1.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.1.xsd ">
<aop:config>
<aop:aspect id="helloAspect" ref="logging"> <!--ref에는 충고를 담고 있는Aspect 가온다
<aop:pointcut id="selectSayHello1"
expression="execution(* aophello1.PrintMsg.sayHello1(..))"/>
<!—myAdvice는 Aspect 클래스(logging)의 충고용 메소드-->
<aop:around pointcut-ref="selectSayHello1" method="myAdvice"/>
</aop:aspect>
</aop:config>
<!--Definition for printMsg bean, 타겟클래스-->
<bean id="printMsg" class="aophello1.PrintMsg" />
<!--Definition for logging aspect 충고들이오여있는Aspect클래스-->
<bean id="logging" class="aophello1.LoggingAspect"/>
</beans>
[Src/main/resources/aophello1.xml]
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]
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() 메소드만 주변충고가 적용되도록 구성한 예제이다.
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를 위한 라이브러리 추가
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]
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]
Spring Framework_Spring AOP
<?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-4.1.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.1.xsd ">
<aop:aspectj-autoproxy />
<!--Definition for printMsg bean, 타겟클래스-->
<bean id="printMsg" class="aophello1.PrintMsg" />
<!--Definition for logging aspect 충고들이 모여있는 Aspect클래스-->
<bean id="logging" class="aophello1.LoggingAspect"/>
</beans>
[Src/main/resources/aophello1.xml]
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();
}
}
[결과]
메소드실행전안녕...
Hello AOP1...
메소드실행후안녕...
Hello AOP2...
[HelloMain.java]

11.AOP helloworld

  • 1.
  • 2.
    Spring Framework_Spring AOP SpringAOP 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 packageaophello1; 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 packageaophello1; 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]
  • 10.
    Spring Framework_Spring AOP <?xmlversion="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-4.1.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.1.xsd "> <aop:config> <aop:aspect id="helloAspect" ref="logging"> <!--ref에는 충고를 담고 있는Aspect 가온다 <aop:pointcut id="selectSayHello1" expression="execution(* aophello1.PrintMsg.sayHello1(..))"/> <!—myAdvice는 Aspect 클래스(logging)의 충고용 메소드--> <aop:around pointcut-ref="selectSayHello1" method="myAdvice"/> </aop:aspect> </aop:config> <!--Definition for printMsg bean, 타겟클래스--> <bean id="printMsg" class="aophello1.PrintMsg" /> <!--Definition for logging aspect 충고들이오여있는Aspect클래스--> <bean id="logging" class="aophello1.LoggingAspect"/> </beans> [Src/main/resources/aophello1.xml]
  • 11.
    Spring Framework_Spring AOP packageaophello1; 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 packageaophello1; 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]
  • 16.
    Spring Framework_Spring AOP <?xmlversion="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-4.1.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.1.xsd "> <aop:aspectj-autoproxy /> <!--Definition for printMsg bean, 타겟클래스--> <bean id="printMsg" class="aophello1.PrintMsg" /> <!--Definition for logging aspect 충고들이 모여있는 Aspect클래스--> <bean id="logging" class="aophello1.LoggingAspect"/> </beans> [Src/main/resources/aophello1.xml]
  • 17.
    Spring Framework_Spring AOP packageaophello1; 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(); } } [결과] 메소드실행전안녕... Hello AOP1... 메소드실행후안녕... Hello AOP2... [HelloMain.java]