guice가 참 좋은데.. 정말 좋은데
이런 어노테이션이 있다고 하자.
1 2 3 4 5 6 7 8 9 
  | @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface Authorized {     Type to();     enum Type {         PUBLIC, ADMIN     } } 
  | 
 
이런 쥬스 모듈에 의해 바인딩되고,
1 2 3 4 5 6 7 8 
  | public class AuthorizeModule extends AbstractModule {     @Override     protected void configure() {         AuthorizeInterceptor authorizeInterceptor = new AuthorizeInterceptor();         requestInjection(authorizeInterceptor);         bindInterceptor(Matchers.inSubpackage("com.foo.example"), Matchers.any(), authorizeInterceptor);     } } 
  | 
 
이런 인터셉터를 호출한다 ㅎㅎ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 
  | public class AuthorizeInterceptor implements MethodInterceptor {     private static final Logger logger = LoggerFactory.getLogger(AuthorizeInterceptor.class);     @Override     public Object invoke(MethodInvocation invocation) throws Throwable {        Authorized authorized = invocation.getMethod().getAnnotation(Authorized.class);         if(authorized != null && authorized.to() == Authorized.Type.PUBLIC)             return invocation.proceed();                  logger.info("authorizing . . . ");         return invocation.proceed();     } } 
  | 
 
놀랍게도, 이게 다다. 아오.. 너무 좋다..
하지만 쥬스는 돈이 안 된다. 따라서 이걸 스프링으로 해 보자.
스프링에서의 aop
먼저 advice 를 만든다.
1 2 3 4 5 6 7 8 
  | public class FooAdvice implements MethodBeforeAdvice {     private static final Logger LOGGER = LoggerFactory.getLogger(FooAdvice.class);     @Override     public void before(Method method, Object[] args, Object target) throws Throwable {         LOGGER.warn("Capitalism, ho!");     } } 
  | 
 
그 다음 pointcut 을 만든다.
1 2 3 4 5 6 7 8 9 
  | @Bean Pointcut pointcut(){     return new ComposablePointcut().union(             clazz -> clazz.getPackage().getName().equals("com.foo.example.controller") &&                     clazz.getAnnotation(Controller.class) != null     ).intersection(             new AnnotationMethodMatcher(FooAnnotation.class)     ); } 
  | 
 
위에서 ComposablePointcut 이 쥬스에서 하던 바인딩과 유사하여 꽤나 쓸만하다. jdk8 과 만나 드디어 사람이 읽을 수 있는 표현이 되었다!!
다음 pointcut advisor 를 만든다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 
  |     @Bean     PointcutAdvisor pointcutAdvisor(){         return new DefaultPointcutAdvisor(pointcut(),advice());     } ```				 위에서 만든 `pointcut` , `adivce` , `pointcut advisor` 는 반드시 다음 `DefaultAdvisorAutoProxyCreator` 를 통해야만 프록시가 생성된다. ```java     @Bean     DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator(){         DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator = new DefaultAdvisorAutoProxyCreator();         defaultAdvisorAutoProxyCreator.setProxyTargetClass(true);         return defaultAdvisorAutoProxyCreator;     } 
  | 
 
이렇게 하면 쥬스로 했던거랑 딱히 다를것도 없다. 우왕!