XML을 이용한 AOP
aop-xml 예제 프로젝트 구성
aop-xml 예제 프로젝트 만들기
aop-xml 예제 프로젝트 환경
<pom.xml>
aop-xml 예제 프로젝트의 AOP 어플리케이션 구성
- DI, AOP를 이용한 인터페이스 기반의 컴포넌트화를 완성
- AOP를 통해 횡단 관심사와 이에 영향 받는 객체 간 결합도를 낮춘다.
aop-xml 예제 프로젝트
- 이전 xml예제 프로젝트에 있는 StudentVO.java, MemberDAO.java, MemberDAOImpl.java, MemberService.java, MemberService.java, MemberServiceImpl.java, MemberSampleMain.java 모두 동일하다
aspect 정의 클래스
- MemberAspect.java
- 각 메소드가 advice
- JoinPoint
- afterReturning
- 메서드 수행 후 반환한 값 접근 가능
- around
- 반환 값 반드시 리턴
- before와 after 처리 가능
- proceed 함수를 통해 메서드 수행을 반드시 처리
- Throwing
- AOP 대상이 되는 메서드에서 예외가 발생할 경우만 동작
applicationContext.xml 설정
Advice 코드 실행 흐름 (before Advice)
Pointcut 기술 방법 : execution() 표현식
- 대표적인 포인트컷 지시자
- ex) <aop:pointcut id = "readMethod" expression = "execution(* read(String))"/>
- 메서드의 수식자, throws 생략 가능
- 메서드의 반환값, 패키지와 클래스 명은 와일드 카드 '*' 를 이용
- 패키지, 클래스 명은 생략 가능
- 해당 패키지 및 하위 패키지를 포함하여 일치시키려면 '..' 를 이용
Pointcut 기술 방법 : execution() 표현식 예
- execution(* org.tukorea.di.persistence.MemberDAOImpl.write(..))
- 리턴 타입과 파라미터 상관없이, 클래스는 org.tukorea.di.persistence.MemberDAOImpl, 메소드명이 write인 메소드를 선정하는 포인트컷 표현식
- execution(* write(int, int))
- 리턴 타입 상관없이, 모든 패키지, 클래스 내, 메소드 이름이 write이며, 두개의 int 타입의 파라미터를 가진 모든 메소드를 선정하는 포인트컷 표현식
- execution(* *(..))
- 리턴 타입과 파라미터의 종류, 개수에 상관없이 모든 패키지, 클래스 내의 모든 메소드를 선정하는 포인트컷 표현식
Pointcut 기술 방법 : within() 표현식
- 특정 타입에 속하는 메소드를 포인트 컷으로 설정할 때 사용
- execution()의 여러 조건 중에서 타입 패턴 만을 적용하기 때문에 execution 표현식 문법 보다는 간단
- within(org.tukorea.aop..*)
- org.tukorea.aop 및 모든 서브패키지가 포함하고 있는 모든 메소드
- within(org.tukorea.aop.*)
- org.tukorea.aop 패키지 밑의 인터페이스와 클래스에 있는 모든 메소드
- within(org.tukorea.aop.xml)
- org.tukorea.aop 패키지의 xml 클래스의 모든 메소드
Pointcut 기술방법 : 와일드 카드
*
- 기본적으로 임의의 문자열 의미
- 패키지를 표현할 때는 패키지 1개 계층 의미
- 메소드의 매개변수를 표현할 때 임의의 인수 1개 의미
..
- 패키지를 표현할 때 패키지 0개 이상 계층 의미
- 매서드의 매개변수를 표현할 때 임의의 인수 0개 이상을 의미
+
- 클랫스 명 뒤에 붙여 씀
- 해당 클래스와 해당 클래스의 서브 클래스 or 구현 클래스 모두 의미