【问题标题】:Best/most clean way to inject dependencies into Servlets without any frameworks在没有任何框架的情况下将依赖项注入 Servlet 的最佳/最干净的方法
【发布时间】:2011-08-19 11:21:23
【问题描述】:

当您不想使用任何类型的 DI 框架时,将依赖项注入 Servlet 的最佳方法是什么?我应该将它们放入ServletContext 中的ServletContextListener 吗?

【问题讨论】:

  • 甚至不是 JavaEE 6 中的 DI 框架?
  • @skaffman 我只需要注入 2-3 个依赖项。我不确定增加的复杂性是否值得付出努力。
  • @skaffman:如果您正在构建一个简单的基于 servlet 的库或插件,您可能不想使用 DI 框架。并非如此,只是指出其他原因。
  • @skaffman:Jetty 与 Java EE 6 相差甚远。
  • 我不做Jetty,所以不能详细介绍。对于 Tomcat/Glassfish/JBoss/etc,我只想说,就像你对 DataSource 所做的一样。只需在 JNDI 中定义它并给它一个 JNDI 名称。它只是成为@Resource 可用的应用程序范围的实例。还是在 Jetty 中真的是紧密耦合/特定的?设置为ServletContext 属性是您最好的选择。已经回答过了。这是我手上的另一个例子:stackoverflow.com/questions/4491596/…

标签: java servlets jetty


【解决方案1】:

是的。您可以在 ServletContextListener 中初始化它们(如果您需要预先初始化它们),然后将它们放入 ServletContext 以供所有 servlet 访问。

最好按类名存储对象,这样检索是类型安全的。

Foo foo = servletContext.getAttribute(Foo.class.getName());

【讨论】:

    【解决方案2】:

    要在 servlet 中注入一些东西,您需要在另一个类中获取 servlet 实例。而且你不能这样做,因为 getServlet(name) 方法已被弃用(并且不起作用)。

    所以每个 servlet 都必须在上下文中手动注册自己。在每个 servlet 的 init() 方法中,您可以将自己添加到 servlet 上下文中的集合中:

    ((List<HttpServlet>) servletContext.getAttribute("servlets")).add(this);
    

    然后,在ServletContextListener 中,您可以循环所有已注册的 servlet 并调用一些设置器或用户反射,以在外部设置依赖项。

    但是..这似乎太复杂了,所以你可能会在这里和那里坚持使用new 运算符。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-06
      • 2012-06-21
      • 1970-01-01
      • 1970-01-01
      • 2015-01-19
      • 1970-01-01
      • 2020-12-08
      相关资源
      最近更新 更多