객체를 인스턴스화 한 후 Guice 호출 init 메서드
주어진 유형의 객체를 인스턴스화 한 후 Guice에게 일부 메서드 (예 : init ())를 호출하도록 지시 할 수 있습니까?
EJB 3에서 @PostConstruct 주석과 유사한 기능을 찾습니다.
실제로 가능합니다.
TypeListener
기능 을 사용하려면를 정의해야합니다 . 모듈 정의에서 다음과 같은 내용이 있습니다.
bindListener(Matchers.subclassesOf(MyInitClass.class), new TypeListener() {
@Override
public <I> void hear(final TypeLiteral<I> typeLiteral, TypeEncounter<I> typeEncounter) {
typeEncounter.register(new InjectionListener<I>() {
@Override
public void afterInjection(Object i) {
MyInitClass m = (MyInitClass) i;
m.init();
}
});
}
});
메서드에 @Inject
주석을 추가하기 만하면 init()
됩니다. 개체가 인스턴스화되면 자동으로 실행됩니다.
나는 http://code.google.com/p/mycila/wiki/MycilaGuice를 좋아 합니다. http://code.google.com/p/guiceyfruit 이외의 Guice 3을 지원합니다 .
guiceyfruit 는 @PostConstruct
spring의 InitializingBean
. 이를 위해 자신의 리스너를 작성할 수도 있습니다. 다음 init()
은 객체가 생성 된 후 공용 메서드 를 호출하는 예입니다 .
import com.google.inject.*;
import com.google.inject.matcher.*;
import com.google.inject.spi.*;
public class MyModule extends AbstractModule {
static class HasInitMethod extends AbstractMatcher<TypeLiteral<?>> {
public boolean matches(TypeLiteral<?> tpe) {
try {
return tpe.getRawType().getMethod("init") != null;
} catch (Exception e) {
return false;
}
}
public static final HasInitMethod INSTANCE = new HasInitMethod();
}
static class InitInvoker implements InjectionListener {
public void afterInjection(Object injectee) {
try {
injectee.getClass().getMethod("init").invoke(injectee);
} catch (Exception e) {
/* do something to handle errors here */
}
}
public static final InitInvoker INSTANCE = new InitInvoker();
}
public void configure() {
bindListener(HasInitMethod.INSTANCE, new TypeListener() {
public <I> void hear(TypeLiteral<I> type, TypeEncounter<I> encounter) {
encounter.register(InitInvoker.INSTANCE);
}
});
}
}
GWizard에는 gwizard-services
Guice 친화적 인 형식으로 Guava 서비스를 제공 하는 모듈 ( )이 포함되어 있습니다 . Guava 서비스는 병렬 스레드에서 수명주기 관리를 제공합니다.
https://github.com/stickfigure/gwizard
인스턴스 생성 후 메서드를 호출하려면 생성 후 메서드 호출이 실제로 인스턴스 생성 단계임을 의미합니다. 이 경우이 문제를 해결하기 위해 추상적 인 공장 디자인 패턴을 추천합니다. 코드는 다음과 같습니다.
class A {
public A(Dependency1 d1, Dependency2 d2) {...}
public postConstruct(RuntimeDependency dr) {...}
}
interface AFactory {
A getInstance(RuntimeDependency dr);
}
class AFactoryImpl implements AFactory {
@Inject
public AFactoryImpl(Dependency1 d1, Dependency2 d2) {...}
A getInstance(RuntimeDependency dr) {
A a = new A(d1, d2);
a. postConstruct(dr);
return a;
}
}
// in guice module
bind(AFactory.class).to(AFactoryImpl.class)
In case you need to initialize an object using other objects and after both are ready (which is the case if you need to register one with the other and they also depend on each other) you can easily do it like this:
public final class ApplicationModule extends AbstractModule {
@Override
protected void configure() {
requestStaticInjection(ApplicationModule.class);
}
@Inject
static void injectApplication(
ReslSession reslSession,
Set<Saga> sagas,
Set<Reaction> reactions
) {
sagas.forEach(reslSession::registerSaga);
reactions.forEach(reslSession::registerReaction);
}
}
참고URL : https://stackoverflow.com/questions/2093344/guice-call-init-method-after-instantinating-an-object
'program tip' 카테고리의 다른 글
OS가 브라우저에서 다크 모드인지 감지하는 방법은 무엇입니까? (0) | 2020.12.01 |
---|---|
DEFINE 대 PHP의 변수 (0) | 2020.12.01 |
Android — View를 화면 밖으로 배치하는 방법은 무엇입니까? (0) | 2020.12.01 |
setUp / tearDown (@ Before / @ After) 왜 JUnit에서 필요한가요? (0) | 2020.12.01 |
Py_Initialize 실패-파일 시스템 코덱을로드 할 수 없음 (0) | 2020.12.01 |