编程语言
首页 > 编程语言> > Guice注入Java Web App的业务层

Guice注入Java Web App的业务层

作者:互联网

我已经成功地使用Guice将Inject Providers注入现有java Web应用程序的servlet部分,但是,我无法通过应用程序的业务层(非servlet java类)访问注入器.

我已经阅读了注入注射器,但对我来说,这似乎更像是一个黑客,在几个地方,包括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或过滤器的类调用时不起作用.

解决方法:

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

注射仅在注射期间由Guice处理时起作用.因此,从你所做的基础注入器开始,你所请求的实例所需的@Inject标记将由Guice尽可能提供,反过来,在实例化期间,进一步提供@Inject注释将由提供者和绑定填写,直到没有新的需要实例化.从那时起,你不会将字段注入到Guice注入之外创建的servlet中,也许是通过在某个地方调用new,这可能就是你的Object Factory正在做的事情.

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

因此,Guice意识到的业务层的一种方式是创建一个注入器,然后请求由注入器创建servlet.如果这意味着你将拥有多个注射器,那么是的,这将是一个问题,但仅适用于你想成为单身的物体.所以你可以为单例注入器创建一个工厂模式类,或者你可以找到创建servlet本身的这些类(这里是类型条)创建的位置(在foo中),然后从那里开始(在foo中)使用一个Guice注入器创建那些(bar类型)类并修改它们(bar类型)以请求它们将使用的servlet的提供者而不是调用新的servlet.

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

另一个选择是按照建议在任何时候避免在字段上使用@Inject.所以现在你的servlet正在将org.slf4j.Logger作为构造参数.构造函数标记为@Inject,并将参数的值赋给该字段.然后,任何你没有使用注射的地方都应该在新的呼叫中使用不正确数量的参数.通过弄清楚如何获取此处提供的servlet,或者如何将servlet的提供者放入类中来解决这些问题.

标签:java,servlets,guice,guice-servlet
来源: https://codeday.me/bug/20190709/1418331.html