Spring Framework
Spring AOP
포인트 컷(Pointcut)
Spring Framework_포인트 컷(Pointcut)
Spring AOP
5. 포인트 컷
 Pointcut은 모든 Join Point중 Advice가 Weaving 되어야 할 Join Point의 집합을 정의한 것이다.
 교차점(PointCut)은 특정한 클래스의 특정한 메소드가 특정한 기준과 일치하는지를 판단한다. 만약
그메소드가 실제로 일치한다면 충고가 적용된다.
 스프링은 충고를 받으려고 하는 클래스와 메소드의 관점에서 교차점을 정의하며 충고는 클래스의
이름과 메소드 시그네처(Method Signature)와 같은 특징에 기초하여 대상클래스와 메소드에 엮인다.
 스프링의 교차점 프레임워크를 위한 핵심 인터페이스는 PointCut, PointCut은 메소드와 클래스에
기초하여 충고를 어디에 엮을지 결정한다.
 Pointcut 구현체를 사용하려면 먼저 Advisor 인터페이스의 인스턴스를 생성하거나 좀 더 구체적으로
PointcutAdvisor 인터페이스의 인스턴스를 생성해야 한다.
Spring Framework_포인트 컷(Pointcut)
Spring Framework_포인트 컷(Pointcut)
public interface PointCut {
ClassFilter getClassFilter(); //클래스의 특정 메소드에 pointcut 적용여부 판단
MethodMatcher getMethodMatcher();
}
[PointCut Interface]
public interface ClassFilter {
boolean matches(Class class);
}
[ClassFilter Interface] : 인자로 넘어온 Class가 충고를 받아야하는지를 판단해야 한다.
public interface MethodMatcher {
boolean matches(Method m, Class targetClass);
public boolean isRuntime();
public boolean matches(Method m, Class target, Object[] args);
}
[MethodMatcher]
matches(Method ,Class) 메소드는 대상Class와 Method를 기초로 메소드가 충고를 받을 수 있는지의 여부를
판단한다. True가 리턴되면 어떤 유형의 MethodMatcher인지 판단하기 위해 isRuntime()이 호출된다. Static
교차점(pointcut)은 항상 실행되는 교차점을 정의하며 이 경우 isRuntime()은 false를 return하며 동적교차점
(Dynamic Pointcut)은 런타임시의 메소드인자를 확인하여 충고가 실행되어야 하는지를 결정한다. matches
메소드와 마찬가지로 isRuntime()은 프록시 객체가 생성될 때 오직 한 번만 호출된다.
Spring Framework_포인트 컷(Pointcut)
public interface PointcutAdvisor {
Pointcut getPointcut();
Advice getAdvice();
}
[충고자]
Aspect는 행동을 정의한 충고와 실행돼야 할 위치를 정의한 교차점(Pointcut)의 조합으로
이루어진다. 스프링에서는 이를 위해 충고자라는 것을 제공한다. 충고자는 충고(Advice)와
교차점(Pointcut)을 하나의 객체로 합친 것이다.
Spring Framework_포인트 컷(Pointcut)
File -> New -> Spring LegacyProject
Project name : springonj
Simple Spring Maven 선택
[pom.xml에 아래 의존성 추가]
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${org.springframework-version}</version>
</dependency>
StaticMethodMatcherPointcut을 상속할 때는 matches 메소드만 구현하면 되지만 올바른
타입의 메소드만 어드바이스가 적용되도록 할려면 getClassFilter() 메소드를 오버라이드 하는
것이 좋다.
5.1 포인트 컷 - StaticMethodMatcherPointCut
Spring Framework_포인트 컷(Pointcut)
package onj.edu.aop1;
public class First {
public void one() {
System.out.println("First One...");
}
public void two() {
System.out.println("First Two...");
}
}
[First.java]
package onj.edu.aop1;
public class Second {
public void one() {
System.out.println("Second One...");
}
public void two() {
System.out.println("Second Two...");
}
}
[Second.java]
Spring Framework_포인트 컷(Pointcut)
package onj.edu.aop1;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
public class SimpleAdvice implements MethodInterceptor{
public Object invoke(MethodInvocation invocation) throws Throwable {
System.out.println(invocation.getMethod().getName());
Object o = invocation.proceed();
System.out.println("... SimpleAdvice의충고가적용됨...");
return o;
}
}
[SimpleAdvice.java]
Spring Framework_포인트 컷(Pointcut)
package onj.edu.aop1;
import java.lang.reflect.Method;
import org.springframework.aop.support.StaticMethodMatcherPointcut;
public class SimpleStaticPointcut extends StaticMethodMatcherPointcut {
// 아래는 First.class의 one()의 실행 전/후 충고가 적용된다.
public boolean matches(Method method, Class<?> cls) {
return ("one".equals(method.getName()) && cls == First.class);
}
}
[SimpleStaticPointcut.java]
Spring Framework_포인트 컷(Pointcut)
public class StaticPointcutExam {
public static void main(String[] args) {
First f = new First();
Second s = new Second();
First proxyFirst;
Second proxySecond;
//pointcut, advice, advisor 생성
Pointcut pc = new SimpleStaticPointcut();
Advice advice = new SimpleAdvice();
Advisor advisor = new DefaultPointcutAdvisor(pc, advice);
//First 프록시생성
ProxyFactory pf = new ProxyFactory();
pf.addAdvisor(advisor);
pf.setTarget(f); //First.class를 타겟으로
proxyFirst = (First)pf.getProxy();
proxyFirst.one();
proxyFirst.two();
[StaticPointcutExam.java]
Spring Framework_포인트 컷(Pointcut)
//Second 프록시 생성
pf = new ProxyFactory();
pf.addAdvisor(advisor);
pf.setTarget(s); //Second.class를 타겟으로
proxySecond = (Second)pf.getProxy();
proxySecond.one();
proxySecond.two();
}
}
[결과]
one
First One...
... SimpleAdvice의충고가적용됨...
First Two...
Second One...
Second Two...
[StaticPointcutExam.java]
Spring Framework_포인트 컷(Pointcut)

13.포인트컷(pointcut)

  • 1.
  • 2.
    Spring Framework_포인트 컷(Pointcut) SpringAOP 5. 포인트 컷  Pointcut은 모든 Join Point중 Advice가 Weaving 되어야 할 Join Point의 집합을 정의한 것이다.  교차점(PointCut)은 특정한 클래스의 특정한 메소드가 특정한 기준과 일치하는지를 판단한다. 만약 그메소드가 실제로 일치한다면 충고가 적용된다.  스프링은 충고를 받으려고 하는 클래스와 메소드의 관점에서 교차점을 정의하며 충고는 클래스의 이름과 메소드 시그네처(Method Signature)와 같은 특징에 기초하여 대상클래스와 메소드에 엮인다.  스프링의 교차점 프레임워크를 위한 핵심 인터페이스는 PointCut, PointCut은 메소드와 클래스에 기초하여 충고를 어디에 엮을지 결정한다.  Pointcut 구현체를 사용하려면 먼저 Advisor 인터페이스의 인스턴스를 생성하거나 좀 더 구체적으로 PointcutAdvisor 인터페이스의 인스턴스를 생성해야 한다.
  • 3.
  • 4.
    Spring Framework_포인트 컷(Pointcut) publicinterface PointCut { ClassFilter getClassFilter(); //클래스의 특정 메소드에 pointcut 적용여부 판단 MethodMatcher getMethodMatcher(); } [PointCut Interface] public interface ClassFilter { boolean matches(Class class); } [ClassFilter Interface] : 인자로 넘어온 Class가 충고를 받아야하는지를 판단해야 한다. public interface MethodMatcher { boolean matches(Method m, Class targetClass); public boolean isRuntime(); public boolean matches(Method m, Class target, Object[] args); } [MethodMatcher] matches(Method ,Class) 메소드는 대상Class와 Method를 기초로 메소드가 충고를 받을 수 있는지의 여부를 판단한다. True가 리턴되면 어떤 유형의 MethodMatcher인지 판단하기 위해 isRuntime()이 호출된다. Static 교차점(pointcut)은 항상 실행되는 교차점을 정의하며 이 경우 isRuntime()은 false를 return하며 동적교차점 (Dynamic Pointcut)은 런타임시의 메소드인자를 확인하여 충고가 실행되어야 하는지를 결정한다. matches 메소드와 마찬가지로 isRuntime()은 프록시 객체가 생성될 때 오직 한 번만 호출된다.
  • 5.
    Spring Framework_포인트 컷(Pointcut) publicinterface PointcutAdvisor { Pointcut getPointcut(); Advice getAdvice(); } [충고자] Aspect는 행동을 정의한 충고와 실행돼야 할 위치를 정의한 교차점(Pointcut)의 조합으로 이루어진다. 스프링에서는 이를 위해 충고자라는 것을 제공한다. 충고자는 충고(Advice)와 교차점(Pointcut)을 하나의 객체로 합친 것이다.
  • 6.
    Spring Framework_포인트 컷(Pointcut) File-> New -> Spring LegacyProject Project name : springonj Simple Spring Maven 선택 [pom.xml에 아래 의존성 추가] <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${org.springframework-version}</version> </dependency> StaticMethodMatcherPointcut을 상속할 때는 matches 메소드만 구현하면 되지만 올바른 타입의 메소드만 어드바이스가 적용되도록 할려면 getClassFilter() 메소드를 오버라이드 하는 것이 좋다. 5.1 포인트 컷 - StaticMethodMatcherPointCut
  • 7.
    Spring Framework_포인트 컷(Pointcut) packageonj.edu.aop1; public class First { public void one() { System.out.println("First One..."); } public void two() { System.out.println("First Two..."); } } [First.java] package onj.edu.aop1; public class Second { public void one() { System.out.println("Second One..."); } public void two() { System.out.println("Second Two..."); } } [Second.java]
  • 8.
    Spring Framework_포인트 컷(Pointcut) packageonj.edu.aop1; import org.aopalliance.intercept.MethodInterceptor; import org.aopalliance.intercept.MethodInvocation; public class SimpleAdvice implements MethodInterceptor{ public Object invoke(MethodInvocation invocation) throws Throwable { System.out.println(invocation.getMethod().getName()); Object o = invocation.proceed(); System.out.println("... SimpleAdvice의충고가적용됨..."); return o; } } [SimpleAdvice.java]
  • 9.
    Spring Framework_포인트 컷(Pointcut) packageonj.edu.aop1; import java.lang.reflect.Method; import org.springframework.aop.support.StaticMethodMatcherPointcut; public class SimpleStaticPointcut extends StaticMethodMatcherPointcut { // 아래는 First.class의 one()의 실행 전/후 충고가 적용된다. public boolean matches(Method method, Class<?> cls) { return ("one".equals(method.getName()) && cls == First.class); } } [SimpleStaticPointcut.java]
  • 10.
    Spring Framework_포인트 컷(Pointcut) publicclass StaticPointcutExam { public static void main(String[] args) { First f = new First(); Second s = new Second(); First proxyFirst; Second proxySecond; //pointcut, advice, advisor 생성 Pointcut pc = new SimpleStaticPointcut(); Advice advice = new SimpleAdvice(); Advisor advisor = new DefaultPointcutAdvisor(pc, advice); //First 프록시생성 ProxyFactory pf = new ProxyFactory(); pf.addAdvisor(advisor); pf.setTarget(f); //First.class를 타겟으로 proxyFirst = (First)pf.getProxy(); proxyFirst.one(); proxyFirst.two(); [StaticPointcutExam.java]
  • 11.
    Spring Framework_포인트 컷(Pointcut) //Second프록시 생성 pf = new ProxyFactory(); pf.addAdvisor(advisor); pf.setTarget(s); //Second.class를 타겟으로 proxySecond = (Second)pf.getProxy(); proxySecond.one(); proxySecond.two(); } } [결과] one First One... ... SimpleAdvice의충고가적용됨... First Two... Second One... Second Two... [StaticPointcutExam.java]
  • 12.