0

我有一些业务类,它们注入了一些使用 servlet 请求范围提供的依赖项。

问题是我想在一些超过 servlet 请求的线程中使用该业务类。最透明的方法是什么?

4

4 回答 4

0

好吧,我不确定我是否得到你的问题。我认为架构本身存在问题,但这可以帮助您:

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

您还可以使用私有模块将不同范围的对象绑定到一个类。不要忘记暴露它。

于 2013-08-12T11:00:09.567 回答
0

如果您使用的是 Spring(根据您用来描述问题的术语,您似乎正在使用它),您可以为您的请求范围对象使用 AOP 范围代理,并将此代理注入到超过小服务程序请求。作用域代理将在您每次访问时使用正确的实例。

于 2013-08-07T07:56:31.260 回答
0

我看到 3 个选项:

于 2013-08-12T14:21:14.180 回答
0

我可能不建议您在不在请求范围内的业务 bean 上直接使用或注入 HttpServletRequest。因为这会分解应用层。如果您想要请求或请求标头中的值,那么您可以将值传递给对象以传递给业务层,否则,它是不安全的,通常,应用程序会在该请求范围内应用一些安全拦截器,但是如果你直接注入到其他层,然后它跳过,拦截器可能会被跳过......这种方式也打破了封装,显然是反模式。

于 2018-01-08T06:32:11.690 回答