gpt4 book ai didi

java - Java Web App业务层Guice注入(inject)

转载 作者:搜寻专家 更新时间:2023-11-01 03:43:56 24 4
gpt4 key购买 nike

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

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

我想我的问题是,我在哪里引导 Java Web 应用程序,以便非 servlet/过滤器类可以访问在我用来扩展 GuiceServletContextListener 的类中创建的注入(inject)器?有什么方法可以在不注入(inject)注入(inject)器的情况下使这些类可注入(inject)吗?

谢谢,如果您需要任何说明,请告诉我。

编辑:

到目前为止,我正在尝试使用一个简单的记录器来完成此操作servlet,我调用:

@Inject
private static org.slf4j.Logger log;

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

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

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

最佳答案

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

只有当 Guice 在注入(inject)期间处理注入(inject)时,注入(inject)才会起作用。因此,从您创建的基础注入(inject)器开始,Guice 将尽可能提供您请求的实例所需的任何标记为 @Inject 的内容,然后在实例化期间提供其中,进一步的 @Inject 注释将由提供者和绑定(bind)填充,直到不需要实例化任何新内容为止。然而,从那时起,您不会将字段注入(inject)到在 Guice 注入(inject)之外创建的 servlet 中,也许是通过在某处调用 new,这很可能是您的对象工厂正在做的事情。

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

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

现在我想到了这一点,如果它只对 10-20 种 servlet 类型发生一次或两次,那么它可能会很简单,或者如果有一些框架可以为更新的内容定义完全灵活的行为,那么它可能会很复杂以及为什么。

另一种选择是按照建议始终避免在字段上使用@Inject。所以现在您的 servlet 将 org.slf4j.Logger 作为构造参数。构造函数标记为 @Inject,它将参数的值分配给字段。然后,任何你不使用注入(inject)的地方都应该在新的调用中以不正确的参数数量中断。通过弄清楚如何获取此处提供的 servlet 或如何将 servlet 的提供程序添加到类中来解决这些问题。

关于java - Java Web App业务层Guice注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7458577/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com