【问题标题】:Guice Injection into Business Layer of Java Web AppJava Web App业务层的Guice注入
【发布时间】:2011-11-19 11:45:51
【问题描述】:

我已成功使用 Guice 将提供程序注入现有 Java Web 应用程序的 servlet 部分,但是,我无法通过应用程序的业务层(非 Servlet Java 类)访问注入器。

我已经阅读了 Injecting the Injector,但对我来说,这似乎更像是一个 hack,并且在包括 Guice 文档在内的多个地方,它说不要做太多。

我想我的问题是,我在哪里引导一个 java web 应用程序,以便非 servlet/filter 类可以访问在我用来扩展 GuiceServletContextListener 的类中创建的注入器?有什么方法可以在不注入注入器的情况下使这些类可注入?

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

编辑:

到目前为止,我正在尝试使用一个简单的记录器来执行此操作 servlet,我称之为:

@Inject
   private static org.slf4j.Logger log;

在 MyLoggerModule 中的注入设置如下(在 使用 ServletModule 调用 createInjector):

@Override
   public void configure() {
       bindListener(Matchers.any(), new SLF4JTypeListener()); // I
       built my own SLF4JTypeListener...
   }

这一切都在 servlet 中完美运行,但字段注入确实如此 被非 servlet 或过滤器的类调用时不起作用。

【问题讨论】:

    标签: java servlets guice guice-servlet


    【解决方案1】:

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

    注入只有在 Guice在注入期间处理时才有效。因此,从您制作的基础注入器开始,Guice 将尽可能提供您请求的实例所需的任何标记为@Inject 的内容,反过来,在这些实例的实例化过程中,进一步@987654322 @ 注释将由提供者和绑定填充,直到不需要实例化任何新内容。但是从那时起,您将不会将字段注入到在 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。感谢您的回复和想法。
    • @OwenBerger 不客气,可惜不能编辑。
    【解决方案2】:

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

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

    【讨论】:

    • 我在上面做了一些澄清...谢谢。
    • 我得到了您的编辑...我正在使用第三方 api,它使用对象工厂来创建一些我无法覆盖或扩展的类。看起来在那些情况下,我坚持通过我用来创建原始的静态工厂类调用原始注入器。我浏览了我的网络应用程序,但它并不像我想象的那么普遍。
    猜你喜欢
    • 1970-01-01
    • 2021-11-06
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 2012-04-04
    • 1970-01-01
    • 2012-08-10
    相关资源
    最近更新 更多