핵심 관심 사항과 공통 관심 사항
Target : 핵심기능을 담고 있는 모듈
Advice : 어느시점에 공통 관심 기능을 적용할지 정의한 것
@Before @After @Around @AfterThrowing @AfterReturning 지원
joinPoint : Aspect가 적용될 수 있는 지점
Pointcut : 공통 관심 사항이 적용될 JoinPoint, Advice를 적용할 타겟의 메소드를 선별하는 정규표현식, execution으로 시작
Aspect : 여러 객체에서 공통으로 적용되는 공통 관심 사항, 싱글톤 형태의 객체로 존재
Aspect = advice + pointcut
advisor : advice + pointcut
weaving : 어떤 advice를 어떤 pointcut에 적용시킬 것인지 대한 설정
자바의 proxy 패턴이란?
<aop:config> //root태그(weaving들의 묶음)
<aop:aspect ref="myAdvice"> //공통 기능을 가지고 있는 bean연결
<aop:before method="login" pointcut="execution(* work())"/>
<aop:after method="logout" pointcut="execution(* work())"/>
</aop:aspect>
</aop:config>
<aop:aspectj-autoproxy/>
설정파일에 추가
@Aspect
public class AdviceEx {
//@Before("within(aop08.CoreEx)") // pointcut 주입
@Before("execution(* zeroMethod(..))")
public void before(){
System.out.println("Joinpoint앞에서 실행되는 Advice");
}
//@AfterThrowing(pointcut="within(aop08.CoreEx)", throwing="e" )
@AfterThrowing(pointcut="execution(* zeroMethod(..))", throwing="e" )
public void afterThrowing(Throwable e){
System.out.println("예외가 실행될때 호출되는 Advice");
System.out.println(e.getMessage());
}
//@AfterReturning(pointcut="within(aop08.CoreEx)", returning="ret" )
@AfterReturning(pointcut="execution(* zeroMethod(..))", returning="ret" )
public void afterReturing(Object ret){
System.out.println("Joinpoint가 정상 종료후 실행되는 Advice");
}
//@After("within(aop08.CoreEx)")
@After("execution(* zeroMethod(..))")
public void after(){
System.out.println("Joinpoint뒤에서 실행되는 Advice");
}
//@Around("within(aop08.CoreEx)")
@Around("execution(* zeroMethod(..))")
public Object around(ProceedingJoinPoint jp) throws Throwable{
System.out.println("Joinpoint 전역에서 실행되는 Advice");
return jp.proceed();
}
}