mga*_*mer 62 init guice postconstruct
是否有可能告诉Guice在定时给定类型的对象后调用某个方法(即init())?
我在EJB 3中寻找类似于@PostConstruct注释的功能.
Sim*_*son 61
您只需将@Inject
注释添加到init()
方法中即可.在实例化对象后它将自动运行.
gpa*_*ara 37
实际上,这是可能的.
您需要定义一个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();
}
});
}
});
Run Code Online (Sandbox Code Playgroud)
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);
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
27142 次 |
最近记录: |