2020. 8. 30. 21:11ㆍJava/Spring
AOP 적용시 다양한 상황에 대응할 수 있도록 명시자를 제공하고 있다.
- Pointcut을 저정할 때 사용하는 문법
- execution(접근제한자 리턴타입 클래스이름 메서드이름(매개변수))
- 접근 제한자 : public만 지원된다.
- 리턴타입 : 메서드의 매개변수 타입
- 클래스 이름 : 패키지를 포함한 클래스 이름
- 메서드 이름 : 메서드의 이름
- 매개변수 : 매개변수의 형태
- * : 하나의 모든 것을 의미한다.
- .. : 개수 상관없이 모든 것을 의미한다.
<bean id="advisor1" class="cookingcoding.advisor.AdvisorClass"/>
<aop:config>
<aop:aspect ref="advisor1">
<aop:pointcut expression="execution(* method1())" id="point1"/>
<aop:before method="beforeMethod" pointcut-ref="point1"/>
</aop:aspect>
</aop:config>
위 xml 태그에서 aop는 method1 메서드가 실행시 AdvisorClass의 beforeMethod를 실행시킨다.
이때 메소드의 매개변수, 자료형, 패키지에 따라서 원하는 메서드를 지정 가능하다.
1. 매개변수
public class TestBean1 {
public void method1() {
System.out.println("void method1 호출");
}
public void method1(int a) {
System.out.println("매개변수 1개 void method1 호출");
}
}
위와 같이 메서드가 매개변수로 오버로딩 되어있을때, aop는 method1()만 인지하고 method1(int a)는 인지하지 못한다.
<aop:config>
<aop:aspect ref="advisor1">
<aop:pointcut expression="execution(* method1(int))" id="point1"/>
<aop:before method="beforeMethod" pointcut-ref="point1"/>
</aop:aspect>
</aop:config>
xml 파일의 pointcut에 method(int)로 설정하면 매개변수가 int 하나인 메서드가 실행 될 시 beforemethod를 실행시킨다.
만약 메서드의 매개변수가 하나인 method1 메서드에 모두 적용 시키려면 아래와 같이 작성한다.
<aop:config>
<aop:aspect ref="advisor1">
<aop:pointcut expression="execution(* method1(*))" id="point1"/>
<aop:before method="beforeMethod" pointcut-ref="point1"/>
</aop:aspect>
</aop:config>
매개변수에 *을 줌으로써 매개변수가 하나인 경우 모두 적용 대상이 된다.
매개변수 2개인 경우에 적용 시키려면 method1(*,*)로 설정하면 된다.
매개변수의 갯수에 상관없이 적용시키려면 method1(..)으로 설정한다.
2. 반환형
메서드의 반환형은 void, 자료형이 있다.
<aop:config>
<aop:aspect ref="advisor1">
<aop:pointcut expression="execution(void method1(..))" id="point1"/>
<aop:before method="beforeMethod" pointcut-ref="point1"/>
</aop:aspect>
</aop:config>
위에서는 method1() 메서드의 매개변수 구분 없이 적용되지만 아래와 같이 반환 자료형이 있는 경우에는 적용이 안된다.
public int method1() {
return 100;
}
위와 같은 경우에는 AOP의 자료형을 *로 바꿔주면 된다.
<aop:config>
<aop:aspect ref="advisor1">
<aop:pointcut expression="execution(* method1(..))" id="point1"/>
<aop:before method="beforeMethod" pointcut-ref="point1"/>
</aop:aspect>
</aop:config>
위 코드는 자료형, 매개변수에 관계없이 모든 method1이 실행시 beforeMethod를 실행시킨다.
3. 패키지
pointcut의 패키지의 범위를 설정해주는 것도 가능하다.
<aop:config>
<aop:aspect ref="advisor1">
<aop:pointcut expression="execution(void cookingcoding.beans.TestBean1.method1(int))" id="point1"/>
<aop:before method="beforeMethod" pointcut-ref="point1"/>
</aop:aspect>
</aop:config>
위와 같이 메서드 이름 앞에 경로를 지정하면 해당 경로에 있는 method1에게만 적용이 된다.
해당 경로에 없는 TestBean2 클래스에 있는 method1은 적용대상이 아니다.
<aop:config>
<aop:aspect ref="advisor1">
<aop:pointcut expression="execution(void cookingcoding.beans.*.method1(int))" id="point1"/>
<aop:before method="beforeMethod" pointcut-ref="point1"/>
</aop:aspect>
</aop:config>
중간에 *을 넣게 되면 beans 패키지에 있는 모든 클래스의 method1에 적용이 된다.
패키지에 상관없이 method1에 적용하려면 앞을 생략하고 맨 위에서와 같이 메서드의 이름으로만 설정하면 된다.
<aop:config>
<aop:aspect ref="advisor1">
<aop:pointcut expression="execution(void method1(int))" id="point1"/>
<aop:before method="beforeMethod" pointcut-ref="point1"/>
</aop:aspect>
</aop:config>
'Java > Spring' 카테고리의 다른 글
Spring - JDBC(mysql) (0) | 2020.09.01 |
---|---|
Spring - @AspectJ (0) | 2020.08.31 |
Spring - AOP (0) | 2020.08.29 |
Spring - Component 자동주입 (0) | 2020.08.27 |
Spring- Component Bean 기본 설정 (0) | 2020.08.27 |