0

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

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

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

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

谢谢

4

3 回答 3

1

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

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

于 2013-05-23T15:09:47.677 回答
1

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

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

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

于 2013-05-23T15:13:24.400 回答
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 的请求处理方法不得修改其字段。

于 2013-05-23T15:14:51.053 回答