Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用请求范围和线程进行注入_Java_Guice_Guice Servlet - Fatal编程技术网

Java 使用请求范围和线程进行注入

Java 使用请求范围和线程进行注入,java,guice,guice-servlet,Java,Guice,Guice Servlet,我有一些bussines类,它们被注入了一些使用servlet请求范围提供的依赖项 问题是,我想在一些比servlet请求更有效的线程中使用该业务类。 最透明的方法是什么?如果您使用的是Spring(根据您用来描述问题的术语,您似乎正在使用Spring),那么您可以为请求范围的对象使用AOP范围的代理,并将此代理注入到servlet请求之外的对象中。作用域代理将负责在每次访问时使用正确的实例。好, 我不确定我是否了解你的问题。我认为架构本身存在问题,但这可以帮助您: Guice模块 bind(B

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

问题是,我想在一些比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
用法

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
还可以使用将不同范围的对象绑定到类。别忘了把它暴露出来。

我看到3个选项:

  • 您可以将所需的信息添加到具有更大范围(如应用程序或会话范围)的对象中
  • 您可以将信息持久保存在文件或数据库中,稍后再进行查找
  • 您可以保存线程上的信息或使用线程作用域:

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

Singleton不是一个选项。在第1部分中,我使用GUICE来避免单例。如果使用GUICE,您可以使用提供程序来实现相同的功能,尽管与框架的耦合稍微多一些。请看