使用@Resource注释注入的DataSource的生命周期/长度

时间:2013-05-23 15:05:27

标签: java servlets annotations jndi

我远不是资源注入错综复杂的专家,实际上是Java中的DataSources,但我通常理解查找预定义JNDI资源以获取数据源的过程。

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

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

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

由于

3 个答案:

答案 0 :(得分:1)

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

关于DataSource尝试制作的基础连接,这取决于您的数据源。

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:1)

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的请求处理方法不得修改其字段。