2010-05-26 4 views
2

누군가 Guice에서 봄에 'afterPropertiesSet'인터페이스와 동일한 기능을 수행 할 수있는 방법을 알고 있습니까? (포스트 구조 후크)Guice, afterPropertiesSet

+1

당신이 참조하는 인터페이스는'InitializingBean'입니다. – skaffman

+0

그래, 링크는 – Roman

답변

3

것 같다를 아직 지원되지 않으므로 모든 사람에게이 작업이 어떻게 이루어 지길 원하십니까? 여기에 작은 해결책이 있습니다.

public class PostConstructListener implements TypeListener{ 

    private static Logger logger = Logger.getLogger(PostConstructListener.class); 

    @Override 
    public <I> void hear(TypeLiteral<I> iTypeLiteral,final TypeEncounter<I> iTypeEncounter) { 

     Class<? super I> type = iTypeLiteral.getRawType(); 

     ReflectionUtils.MethodFilter mf = new ReflectionUtils.MethodFilter() { 
      @Override 
      public boolean matches(Method method) { 
       return method.isAnnotationPresent(PostConstruct.class); 
      } 
     }; 

     ReflectionUtils.MethodCallback mc = new ReflectionUtils.MethodCallback() { 
      @Override 
      public void doWith(Method method) throws IllegalArgumentException, IllegalAccessException { 
       if (!(method.getReturnType().equals(Void.TYPE) && method.getParameterTypes().length == 0)) 
       { 
        logger.warn("Only VOID methods having 0 parameters are supported by the PostConstruct annotation!" + 
          "method " + method.getName() + " skipped!"); 
        return; 

       } 
       iTypeEncounter.register(new PostConstructInvoker<I>(method)); 
      } 
     }; 

     ReflectionUtils.doWithMethods(type,mc,mf); 
    } 

    class PostConstructInvoker<I> implements InjectionListener<I>{ 

     private Method method; 

     public PostConstructInvoker(Method method) { 
      this.method = method; 
     } 

     @Override 
     public void afterInjection(I o) { 
      try { 
       method.invoke(o); 
      } catch (Throwable e) { 
       logger.error(e); 
      } 
     } 
    } 
} 

ReflectionUtils 패키지는 스프링에 한정된다.

바인드 어떤 이벤트에 청취자 : 당신의 guice 모듈

bindListener(Matchers.any(),new PostConstructListener()); 

. 재밌게

5

@PostConstruct를 사용하는 것이 좋습니다. 여기

은 관련 블로그 게시물입니다 : http://macstrac.blogspot.com/2008/10/adding-support-for-postconstruct.html

그리고 여기에 지원을 제공하는 부가 기능 라이브러리입니다 : Guiceyfruit을 통해 라이프 사이클 지원을 추가 http://code.google.com/p/guiceyfruit/

여기에 설명되어 있습니다 : http://code.google.com/p/guiceyfruit/wiki/Lifecycle

+0

입니다. @ @ PostConstruct'는 스프링의 선호 된 접근법입니다. 또한 – skaffman

+0

그냥 이해하지 못합니다. 추가 할 패치를 다운로드해야합니까? 이 JRS 주석을 지원합니까? – Roman

3

당신은 Guice 위키에 CustomInjections 페이지를 참조 할 것 : 표준 @Inject 구동 형 주사 외에도

는, Guice는 사용자 정의 주사에 대한 후크를 포함한다. 이를 통해 Guice는 자체 주입 의미 또는 주석이있는 다른 프레임 워크를 호스팅 할 수 있습니다. 대부분의 개발자는 맞춤 주입을 직접 사용하지 않습니다. 그러나 확장 프로그램 및 타사 라이브러리에서 해당 기능을 사용할 수 있습니다. 각 사용자 정의 주입에는 유형 수신기, 주입 수신기 및 각각의 등록이 필요합니다.

final class FooImpl implements Foo { 
    private final Bar bar; 

    @Inject 
    FooImpl(Bar bar) { 
    this.bar = bar; 

    ... 
    } 

    @Inject 
    void init() { 
    // Post-construction code goes here! 
    } 
} 

을 Guice 제공하는 경우 : 당신은 생성자 주입을 사용하여 너무 미친 아무것도하지 않는 경우 가장 간단한 해결책 지금까지

8

은 후 시공 방법을 만들고 @Inject로 주석하는 것입니다 FooImpl, @Inject 생성자가 있고, 호출 한 다음 @Inject으로 주석을 붙인 메소드를 검색하여 호출합니다. 이것에 대한 의도 된 유스 케이스는 setter injection이지만, @Inject 메쏘드에 params가 없다고하더라도, Guice는 그것을 호출 할 것입니다.

Guice가 @Inject 메서드가 호출되는 순서 (즉, 사용자의 init() 메서드)에 대한 보장이 있는지 알지 못하기 때문에 setter 나 필드 주입을 사용하여 deps를 주입하는 경우이 방법을 사용하지 않는 것이 좋습니다 마지막으로 불리지 않을 수도 있습니다). 즉, 어쨌든 생성자 주입이 선호되는 접근 방식이므로 문제가되지 않아야합니다.