我需要为会话范围创建提供程序,例如ServletScopes.SESSION
,但在对象构造之后有一个额外的操作(例如添加侦听器)。第一个想法 - 扩展ServletScopes.SESSION
和覆盖一些方法,但不幸ServletScopes.SESSION
的是对象,而不是类。那么,如何在不从 ServletScopes 复制粘贴代码的情况下获得这样的提供程序呢?
问问题
136 次
1 回答
1
首先创建一个注解:
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
{
}
然后,用注释注释每个实现方法 `afterInjection()' 的类,并将此绑定添加到您的 Guice 模块之一:
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()
,在调试模式下运行应用程序并检查注入后是否调用了该方法。
于 2011-02-24T14:26:28.183 回答