[WEB:] XML 파일로 AOP 환경 설정하기
2019. 09. 05
상속은 is A, 포함은 has A의 관계이다.
횡단관심모듈이 선언된 클래스(Advice)로 Spring Bean 등록\
XML 파일로 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.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
<!-- 핵심관심모듈로 사용하기 위한 메소드가 선언된 클래스를 Spring Bean으로 등록 -->
<bean id="studentDAO" class="site.itwill07.aop.StudentDAOImpl"/>
<bean id="studentService" class="site.itwill07.aop.StudentServiceImpl">
<property name="studentDAO" ref="studentDAO"/>
</bean>
<!-- 횡단관심모듈이 선언된 클래스(Advice)로 Spring Bean 등록 -->
<bean id="loggingBeforeAdvice" class="site.itwill07.aop.LoggingBeforeAdvice"/>
<!-- config : Spring AOP(AspectJ) 설정을 위한 상위 엘리먼트 -->
<aop:config>
<!-- pointcut : Pointcut 설정을 위한 엘리먼트 -->
<!-- => Pointcut : 횡단관심코드가 삽입되기 위한 핵심관심모듈을 등록하는 기능 -->
<!-- => Spring Bean으로 등록된 클래스의 메소드를 핵심관심모듈로 등록 -->
<!-- => aspect 엘리먼트에서 Pointcut 재사용을 위해 설정 - 생략 가능 -->
<!-- id 속성 : pointcut 엘리먼트의 고유값을 속성값으로 설정 -->
<!-- expression 속성 : execution 또는 within 중 하나를 속성값으로 설정 -->
<!-- execution 속성값 : Spring Bean으로 등록된 클래스의 메소드를 Pointcut 표현식을 이용하여 핵심관심모듈로 등록 -->
<!-- 형식) execution([접근지정자] 반환형 [패키지명.클래스명.]메소드명(자료형,자료형,...)) -->
<!-- Pointcut 표현식에서는 와일드카드와 연산자를 이용하여 설정 가능 -->
<!-- => 와일드카드 : ..(0개 이상), *(1개 이상), +(0개 또는 1개) -->
<!-- => 연산자 : !(NOT), &&(AND), ||(OR) -->
<aop:pointcut expression="execution(* *(..))" id="loggingBeforePointcut"/>
<!-- within : Spring Bean으로 등록된 클래스에 존재하는 모든 메소드를 핵심관심모듈로 등록 -->
<!-- 형식) within([패키지명.]클래스명) -->
<!-- => 클래스 대신 인터페이스를 선언하여 자식클래스의 메소드를 핵심관심모듈로 등록 가능 -->
<!-- aspect : 핵심관심모듈(Pointcut)에 횡단관심모듈(Advice)을 원하는 위치(JoinPoint)에 삽입되도록 설정하는 엘리먼트 -->
<!-- => ApsectJ Weaver를 이용하여 Apsect(Proxy) 클래스를 생성해 실행되도록 지원 -->
<!-- ref 속성 : Advice 클래스로 등록된 Spring Bean의 beanName를 속성값으로 설정 -->
<aop:aspect ref="loggingBeforeAdvice">
<!-- before : 핵심관심모듈의 코드 전에 횡단관심모듈의 코드가 삽입되도록 설정하는 엘리먼트 - JoinPoint -->
<!-- method 속성 : 횡단관심모듈의 메소드명을 속성값으로 설정 -->
<!-- pointcut-ref 속성 : pointcut 엘리먼트의 고유값을 속성값으로 설정 -->
<!-- => 핵심관심모듈의 메소드가 호출될 경우 횡단관심모듈이 삽입된 메소드 실행 -->
<aop:before method="beforeLog" pointcut-ref="loggingBeforePointcut"/>
</aop:aspect>
</aop:config>
</beans>
aop:pointcut 태그의 속성 중
expression="execution()" 괄호 안에는
execution([접근지정자] 반환형 [패키지명.클래스명.]메소드명(자료형,자료형,...)) 형식으로 작성해준다.
[접근지정자]와 [패키지명.클래스명.]은 생략해도 되지만 작성해야할 경우 정확히 입력해준다.
하지만 반환형, 메소드형, (자료형)은 생략할 수 없는 대신, 와일드카드로 간략히 나타낼 수 있다.
다양한 예시>>
execution(* *(..)) 일 경우 : 모든 메소드가 대상
execution(* *(int))일 경우 : 매개변수가 int만 되는 핵심모듈
execution(* select*(..))일 경우 : select로 시작하는 모든 메소드
execution(* select*(..)) || execution(* insert*(..)) 일 경우 :
참고로 !execution()은 괄호 안의 지정된 메소드 빼고 모두 라는 뜻
;