2011-02-24 5 views
0

ServletScopes.SESSION과 같은 세션 범위 공급자를 만들 필요가 있지만 개체를 ​​추가 한 후 추가 동작 (예 : 수신기 추가)이 필요합니다. 첫 번째 아이디어 - ServletScopes.SESSION을 확장하고 일부 메서드를 재정의하지만 불행히도 ServletScopes.SESSION은 클래스가 아니라 객체입니다. 그렇다면 ServletScopes의 코드를 복사하여 붙여 넣지 않고 어떻게 공급자를 얻을 수 있습니까? 주석, 그리고 주석과 방법`afterInjection을() '를 구현하는 모든 클래스를공급자 확장

import java.lang.annotation.Retention; 
import java.lang.annotation.Target; 

import static java.lang.annotation.ElementType.METHOD; 
import static java.lang.annotation.ElementType.TYPE; 
import static java.lang.annotation.RetentionPolicy.RUNTIME; 

@Target({TYPE, METHOD}) 
@Retention(RUNTIME) 
public @interface AfterInjectionListener 
{ 
} 

과 Guice 모듈 중 하나에이 바인딩을 추가합니다 :

답변

1

먼저 주석을 만들

bindListener(Matchers.any(), new TypeListener() 
{ 
    @Override 
    public <I> void hear(TypeLiteral<I> typeLiteral, TypeEncounter<I> iTypeEncounter) 
    { 
    if (typeLiteral.getRawType().isAnnotationPresent(AfterInjectionListener.class)) 
    { 
     logger.debug("adding injection listener {}", typeLiteral); 
     iTypeEncounter.register(new InjectionListener<I>() 
     { 
     @Override 
     public void afterInjection(I i) 
     { 
      try 
      { 
      logger.debug("after injection {}", i); 
      i.getClass().getMethod("afterInjection").invoke(i); 
      } catch (NoSuchMethodException e) 
      { 
      logger.trace("no such method", e); 
      } catch (Exception e) 
      { 
      logger.debug("error after guice injection", e); 
      } 
     } 
     }); 
    } 
    } 
}); 

afterInjection() 메서드 내에 중단 점을 배치하고 디버깅 모드에서 응용 프로그램을 실행 한 다음 주입 후 메서드가 호출되는지 확인합니다.

+0

확인. 감사. 그러나이 간단한 액션 당 많은 코드로 보입니다.) –

+0

Guice가 Java의 표준 주석 @AfterInjection을 구현할 때까지이 많은 코드로 살아야합니다. 아마도 Guice 3.0 일 것입니다. 우리가 볼거야. –