【发布时间】:2013-08-07 07:42:08
【问题描述】:
我有一些业务类被注入了一些使用 servlet 请求范围提供的依赖项。
问题是我想在一些比 servlet 请求寿命更长的线程中使用该业务类。 最透明的方法是什么?
【问题讨论】:
-
单例不是一个选项。在某种程度上,我使用 GUICE 来避免单例。
标签: java guice guice-servlet
我有一些业务类被注入了一些使用 servlet 请求范围提供的依赖项。
问题是我想在一些比 servlet 请求寿命更长的线程中使用该业务类。 最透明的方法是什么?
【问题讨论】:
标签: java guice guice-servlet
如果您使用 Spring(根据您用来描述问题的术语,您似乎正在使用 Spring),您可以为您的请求范围对象使用 AOP 范围代理,并将此代理注入到对象中这比 servlet 请求的寿命更长。作用域代理会在您每次访问时使用正确的实例。
【讨论】:
嗯, 我不确定我是否得到你的问题。我认为架构本身存在问题,但这可以帮助您:
Guice 模块
bind(Bussines.class).annotatedWith(Names.named("request")).to(Bussines.class).in(RequestScoped.class);
bind(Bussines.class).annotatedWith(Names.named("session")).to(Bussines.class).in(SessionScoped.class);
bind(Bussines.class).annotatedWith(Names.named("application")).to(Bussines.class).asEagerSingleton();
用法
@Inject @Named("request")
private Bussines bussines; //inject a new bussines class every request
@Inject @Named("session")
private Bussines bussines; //inject a new bussines class each session
//This is little bit tricky, cuz Bussines is stored in session. In Stage.PRODUCTION are all injection created eagerly and there is no session at injection time. Session binding should be done in lazy way - inject provider and call bussinesProvider.get() when em is needed;
@Inject @Named("application")
private Bussines bussines; //inject singleton
您还可以使用Private modules 将不同范围的对象绑定到一个类。不要忘记暴露它。
【讨论】:
我看到了 3 个选项:
【讨论】:
我可能不建议您在不在请求范围内的业务 bean 上直接使用或注入 HttpServletRequest。因为这会分解应用层。如果您想要请求或请求标头中的值,那么您可以将值传递给对象以传递给业务层,否则,它是不安全的,通常,应用程序会在该请求范围内应用一些安全拦截器,但是如果你直接注入到其他层,然后它跳过,拦截器可能会被跳过......这种方式也打破了封装,显然是反模式。
【讨论】: