쿨해머
83
2020-05-15 21:06:55
3
117

Spring AOP @Aspect 컴포넌트들은 어떻게 메인 함수에서 실행시켜볼 수 있나요?



public class App 
{
    public static void main( String[] args )
    {
    	ApplicationContext ac = new AnnotationConfigApplicationContext(ApplicationConfig.class);
    	
    	UserDao userDao = ac.getBean(UserDao.class);
    	UserVO userVo = ac.getBean(UserVO.class);
    	
    	userDao.print();
    }
}

메인 이구요 userDao의 print 함수에서 advice의 수행을 보고싶습니다.


@Aspect
@Component
public class MeasureExecutionTimeAspect {
	
	@Around("execution(* *(..)")
	public Object measuere(ProceedingJoinPoint jointPoint) throws Throwable {
		
		StopWatch sw = new StopWatch();
		sw.start();
		
		//Object result = jointPoint.proceed();
		
		sw.stop();
		long total = sw.getTotalTimeMillis();
		
		String className = jointPoint.getTarget().getClass().getName();
		String methodName = jointPoint.getSignature().getName();
		String taskName = className + "." + methodName;
		
		System.out.println("[ExecutionTime] " + taskName + ", " + total + "(ms)");
		return total;
	}
}

@Aspect 컴포넌트입니다.  @component 어노테이션으로 ApplicationContext에 등록 되있습니다.

얘는 어떻게 메인 함수에서 실행시켜 볼 수 있는 거죠? 모든 함수에 around advice 붙여서 

0
0
  • 답변 3

  • 쿨해머
    83
    2020-05-16 07:50:43

    수행 시키는 방법은 알았는데
    @Aspect 를 xml파일이 아닌 어노테이션으로만 읽을 수 있는 방법이 있나요?

    예를 들어 <bean> 태그는 해당 클래스에 @Component 를 붙이고 @Configuration에서 @ComponentScan으로 읽어들일 수 있는데 @Aspect는 읽어들이는 방법이 없을까요?

    0
  • John Suhr
    2k
    2020-05-16 08:28:29 작성 2020-05-16 15:14:26 수정됨

    @EnableAspectJAutoProxy 애노테이션이 @Aspect 애노테이션 클래스를 위빙할 수 있게 해 주는 메타 애노테이션입니다.


    public static void main(String[] args) {
    
    	AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
    	ctx.register(RootConfig.class);
    	ctx.refresh();
    
    	ExampleService service = ctx.getBean(ExampleService.class);
    	service.sayHello();
    
    }
    
    @Configuration
    @EnableAspectJAutoProxy // @Aspect클래스를 위빙할 수 있게
    @ComponentScan("com.spring")
    static class RootConfig {}
    
    @Service
    static class ExampleService {
    
    	public void sayHello() {
    		System.out.println("hello~");
    	}
    
    }
    
    @Component
    @Aspect
    static class LoggingAdvice {
    
    	@Around("execution(* *(..))")
    	public Object exec(ProceedingJoinPoint pjp) throws Throwable {
    		Object result;
    
    		System.out.println("before execution");
    
    		result = pjp.proceed();
    
    		System.out.println("after execution");
    
    		return result;
    
    	}
    
    }

    해봤는데 잘 되네요

    0
  • 쿨해머
    83
    2020-05-17 00:39:24

    john suhr 너무 잘 되요 사랑합니다 ㅠㅜ

    1
  • 로그인을 하시면 답변을 등록할 수 있습니다.