【问题标题】:Life cycle/length of a DataSource injected with @Resource annotation注入@Resource注解的DataSource的生命周期/长度
【发布时间】:2013-05-23 15:05:27
【问题描述】:

我远非精通资源注入的复杂性以及 Java 中的数据源,但我通常了解查找预定义 JNDI 资源以从中获取数据源的过程。

使用资源注入作为替代方法,以下语法有效:

@Resource(name="jdbc/Foo")
private javax.sql.DataSource con;

但是,我在 servlet 中使用它,因此想知道注入的连接对象的值将存在多长时间?据推测,由于它只是 servlet 中的一个对象,它会在 servlet 首次实例化时注入,并且与 servlet 存在相同的持续时间(假设我没有手动更改它)。它是否正确?还是每次使用 servlet 时 servlet 都会重新注入资源?

谢谢

【问题讨论】:

    标签: java servlets annotations jndi


    【解决方案1】:

    一个 servlet 容器只会创建一个 servlet 实例。然后,您使用的 IoC 容器将实例化并注入 DataSource,因此 con 中的值将在您的 servlet 的生命周期内保持不变,即。应用程序的生命周期。

    至于 DataSource 试图建立的底层连接,这取决于您的数据源。

    【讨论】:

    • 啊,谢谢,和我想的一样。这被认为是好的做法吗?或者资源注入一般不应该在 servlet 中使用?
    • @SpAm 这绝对被认为是好的做法。你在哪里使用它并不重要,只要它符合它的目的。
    【解决方案2】:

    it will inject when the servlet is first instantiated and exist for the same duration as the servlet

    正确。

    Or does the servlet re-inject the resource everytime the servlet is used?

    不,这不可能发生,因为每个请求都由不同的线程提供服务。如果这些线程会修改 servlet 的字段,那就不好了。 servlet 的请求处理方法不得修改其字段。

    【讨论】:

      【解决方案3】:

      通常容器管理的资源是使用@Resources 注解注入的。只要容器正在运行,容器管理的资源就会一直存在(除非您没有手动杀死它或发生任何异常)。多个应用程序可以使用相同的资源对象,前提是它们位于相同的应用程序服务器生态系统(相同的应用程序服务器或集群或服务器域)中。但是 servlet 由您的应用程序管理,只要您的应用程序正在运行,它就存在于应用程序的范围内!因此,就寿命而言,如果您比较资源比 servlet 寿命更长。

      是的,您是对的,如果您将资源注入 servlet,则资源的引用将保持从 servlet 的创建到 servlet 生命周期的结束。注入与您如何使用 servlet 或资源无关。

      希望这能回答你的问题,谢谢!

      【讨论】:

      • 谢谢你,这澄清了很多。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-24
      • 1970-01-01
      • 2021-02-07
      • 2017-06-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多