在 Guice 绑定过程中注入自定义逻辑
Inject custom logic in Guice binding process
有没有办法在 Guice 绑定中实现前后挂钩?例如。在 Guice 调用构造函数以将实例注入方法之前,我是否可以提供逻辑检查该实例是否已经存在于某处,如果我能找到该实例,那么我直接 return 它而不调用构造函数;另一方面,一旦在 Guice 绑定过程中构造了一个实例,我能否在它 returned 到原始调用者之前注入处理该实例的逻辑?
使用前一段时间写的自定义 Typelistener should do the trick. From what I understand your problem is similar to the "postConstruct" problem, executing code of an instance while guice is creating it. Maybe this(德语)博客文章将您推向正确的方向。
- 使用匹配器定义侦听器应在哪些实例上做出反应。
使用 afterInjection 挂钩处理实例
@Override
public void configure(final Binder 活页夹){
binder.bindListener(Matchers.any(), 这个);
}
@Override
public void hear(final TypeLiteral type, final TypeEncounter encounter) {
encounter.register(新的 InjectionListener() {
@Override
public void afterInjection(final I injectee) {
// alle postconstruct Methoden (nie null) ausführen.
for (final Method postConstructMethod : filter(asList(injectee.getClass().getMethods()), MethodPredicate.VALID_POSTCONSTRUCT)) {
try {
postConstructMethod.invoke(injectee);
} catch (final Exception e) {
throw new RuntimeException(format("@PostConstruct %s", postConstructMethod), e);
}
}
}
});
}
有没有办法在 Guice 绑定中实现前后挂钩?例如。在 Guice 调用构造函数以将实例注入方法之前,我是否可以提供逻辑检查该实例是否已经存在于某处,如果我能找到该实例,那么我直接 return 它而不调用构造函数;另一方面,一旦在 Guice 绑定过程中构造了一个实例,我能否在它 returned 到原始调用者之前注入处理该实例的逻辑?
使用前一段时间写的自定义 Typelistener should do the trick. From what I understand your problem is similar to the "postConstruct" problem, executing code of an instance while guice is creating it. Maybe this(德语)博客文章将您推向正确的方向。
- 使用匹配器定义侦听器应在哪些实例上做出反应。
使用 afterInjection 挂钩处理实例
@Override public void configure(final Binder 活页夹){ binder.bindListener(Matchers.any(), 这个); }
@Override public void hear(final TypeLiteral type, final TypeEncounter encounter) { encounter.register(新的 InjectionListener() {
@Override public void afterInjection(final I injectee) { // alle postconstruct Methoden (nie null) ausführen. for (final Method postConstructMethod : filter(asList(injectee.getClass().getMethods()), MethodPredicate.VALID_POSTCONSTRUCT)) { try { postConstructMethod.invoke(injectee); } catch (final Exception e) { throw new RuntimeException(format("@PostConstruct %s", postConstructMethod), e); } } } });
}