Spring - execution 사용법

2020. 8. 30. 21:11Java/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