javaweb应用的业务层Guice注入

javaweb应用的业务层Guice注入,java,servlets,guice,guice-servlet,Java,Servlets,Guice,Guice Servlet,我已经成功地使用Guice将提供者注入现有javaweb应用程序的servlet部分,但是,我无法通过应用程序的业务层(非servlet java类)访问这些提供者 我读过关于注射注射器的文章,但对我来说,这更像是一个黑客行为,在一些地方,包括Guice文档,它说不要做太多 我想我的问题是,我应该在哪里引导java web应用程序,以便非servlet/过滤器类能够访问在我用来扩展GuiceServletContextListener的类中创建的注入器?有没有办法让这些类在不注入注入器的情况下可

我已经成功地使用Guice将提供者注入现有javaweb应用程序的servlet部分,但是,我无法通过应用程序的业务层(非servlet java类)访问这些提供者

我读过关于注射注射器的文章,但对我来说,这更像是一个黑客行为,在一些地方,包括Guice文档,它说不要做太多

我想我的问题是,我应该在哪里引导java web应用程序,以便非servlet/过滤器类能够访问在我用来扩展GuiceServletContextListener的类中创建的注入器?有没有办法让这些类在不注入注入器的情况下可注入

谢谢你,如果你需要任何澄清,请告诉我

编辑:

到目前为止,我正试图在我的 servlets,我称之为:

@Inject
   private static org.slf4j.Logger log;
注射在MyLoggerModule中设置如下(位于 createInjector调用(使用ServletModule):

这一切在servlet中都非常有效,但字段注入确实有效
被非servlet或筛选器的类调用时不工作。

不确定您的意思。。。如果将对象注入到servlet/过滤器中,这些对象的依赖关系也会被Guice注入,以此类推


如何创建要将此记录器注入的类?它们必须由要注入的Guice创建,这意味着没有
new

Guice不会拦截对新对象的调用,因此,如果您的业务层尚未使用Guice创建需要注入的对象,则需要进行修改

注入仅在注入期间由Guice处理时有效。因此,从您制作的基本注入器开始,Guice将尽可能提供您请求的实例所需的标记为
@Inject
的任何内容,反过来,在这些实例的实例化过程中,进一步的
@Inject
注释将由提供程序和绑定填充,直到不需要实例化任何新内容。然而,从那时起,您就不会将字段注入到在Guice注入之外创建的servlet中,可能是通过在某处调用
new
,这很可能是您的对象工厂正在做的事情

您需要将对象工厂更改为使用提供程序而不是新的。如果您可以编辑这些,这就不难了,因为Guice可以为您提供绑定的默认提供程序

因此,您的业务层可以意识到Guice的一种方法是让创建servlet的任何东西首先创建一个注入器,然后请求注入器创建servlet。如果这意味着您将有多个注入器,那么是的,这将是一个问题,但仅适用于您希望成为单例的对象。因此,您可以为单例注入器创建一个工厂模式类,或者您可以找到创建servlet的这些类(这里是类型化的bar)的创建位置(在foo中),然后从那里的注入器开始(在foo中),使用一个Guice注入器创建这些(bar类型)类并修改它们(bar类型)为他们将使用的servlet请求提供程序,而不是调用新的servlet

现在我考虑一下,如果10-20个servlet类型只发生一次或两次,那么它可能会很简单,如果有一个框架定义了完全灵活的行为,来描述什么时候和为什么会出现新的内容,那么它可能会很复杂


另一个选择是,按照建议,始终避免在字段上插入@Inject。因此,现在您的servlet将一个
org.slf4j.Logger
作为构造参数。构造函数被标记为
@Inject
,它将参数的值分配给字段。然后,任何不使用注入的地方在新调用时都会因参数数量不正确而中断。解决这些问题的方法是找出如何获取此处提供的servlet,或者如何将servlet的提供程序放入类中。

我在上面做了一些澄清。。。谢谢。我收到了你的编辑。。。我正在使用第三方api,它使用对象工厂创建一些我无法覆盖或扩展的类。看起来在这些情况下,我一直在通过一个静态工厂类调用原始喷油器,我用来创建原始喷油器。我浏览了我的web应用程序,但它并不像我想象的那样常见。不幸的是,我无法编辑对象工厂,因为它是第三方api。谢谢您的回复和想法。@OwenBerger不客气,很遗憾它无法编辑。
@Override
   public void configure() {
       bindListener(Matchers.any(), new SLF4JTypeListener()); // I
       built my own SLF4JTypeListener...
   }