관점지향 프로그래밍
공통 관심 사항(cross-cutting concern)과 핵심 관심 사항(core concern)을 분리하는 것이다. 원하는 곳에 공통 관심 사항을 적용할 수 있다.
@Aspect
@Component
public class TimeTraceAop {
@Around("execution(* hello.hellospring0629..*(..))")//패키지 하위에 다 적용해
public Object execute(ProceedingJoinPoint joinPoint) throws Throwable {
long start = System.currentTimeMillis();
System.out.println("START: "+joinPoint.toString());
try{
Object result = joinPoint.proceed();
return result;
}finally {
long finish = System.currentTimeMillis();
long timeMs=finish-start;
System.out.println("END: "+joinPoint.toString()+" "+timeMs+"ms");
}
}
}
가짜 스프링 빈을 앞에 세워두고 가짜 스프링 빈이 끝나면 이후에 진짜 스프링 빈이 동작한다.
실제로 proxy가 주입되는지 콘솔에서 출력해서 확인
@Autowired
public MemberController(MemberService memberService) {
this.memberService = memberService;
System.out.println("memberService="+memberService.getClass());
}
실행 결과
memberService=class hello.hellospring0629.service.MemberService$$EnhancerBySpringCGLIB$$52476d8c
DI를 해주니까 프록시가 가능 -> 객체를 주입받는 형태이기 때문에 프록시도 사용할 수 있는 것