본문 바로가기

spring/AOP

AOP 구현하는 방법2 : aop namespace를 이용한 방법

설정파일에서 


aop:pointcut 의 expression 속성에 명시되어 있는 표현식 조건에 맞는 메소드가 실행됬을 경우 loggingAspect 클래스의 logging 메소드가 실행된다.


인터셉터한 것이라고 생각하면된다.


loggingAspect 클래스의 logging 메소드의 리턴값은 Object 여야하고 ProceedingJoinPoint 타입의 인자를 하나가져야 한다.


Object object = joinPoint.proceed();


joinPoint는 logging 클래스의 인자인 ProceedingJoinPoint 타입의 변수이다.


위의 명령문으로 원래 실행될 메소드를 호출하며 이 명령문 전에 호출된 명령은 선처리되며 이 명령문 후에 호출된 명령은 후처리 된다.


===========================================================================================================================================================

설정파일


<?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-3.2.xsd

http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd">


<!-- Aspect(Advice) -->

<bean id="loggingAspect" class="aop1.LoggingAspect"/>


<!-- aop 설정 -->

<aop:config>

<!-- 인터셉터할 pointcut 위치를 지정(표현식을 이용) -->

<aop:pointcut id="pointcut" expression="execution(* *..*interface*.*(..))"/> 

<!-- 인터셉터할 aspect 생성 -->

<aop:aspect  ref="loggingAspect"> <!-- aspect : 인터셉터해서 실행할 클래스 명시 -->

<aop:around pointcut-ref="pointcut" method="logging"/> <!-- around : pointcut 조건에 맞는 메소드가 실행될때 실행될 메소드를 method 속성에 명시 -->

</aop:aspect>

</aop:config>


</beans>


===========================================================================================================================================================

aspect를 담당할 로직


package aop1;


import org.aspectj.lang.ProceedingJoinPoint;

import org.springframework.util.StopWatch;


public class LoggingAspect {

public Object logging(ProceedingJoinPoint joinPoint){

    // 핵심 메소드 수행 전

StopWatch stopWatch = new StopWatch();

stopWatch.start();

System.out.println("시간 측정 시작-----");

MyAspect.getInstance().myLogon(); 

Object object = null;

try {

object = joinPoint.proceed();// 핵심 메소드 수행

} catch (Throwable e) {

e.printStackTrace();

    // 핵심 메소드 수행 후

MyAspect.getInstance().myLogout();  

stopWatch.stop();

System.out.println("처리시간 : " + stopWatch.getTotalTimeMillis());

return object;

}

}


===========================================================================================================================================================


이외의 파일 생략..