Ioc容器(典型的Spring)负责创建并管理对象之间的依赖关系以及生命周期,甚至还可以支持某种程度上受管对象与容器之间的交互(这需要受管对象的定义类实现容器相关的接口),spring借助对象作用域(singleton、prototype、request、session等)的概念支持在不同层次上缓存受管对象。
但是从本质上来说容器对受管对象的缓存与池的行为是不同的,一般来说池需要区分其管辖的对象在某一特定时刻是否是空闲的,以保证当客户端向池索取对象时得到的总是空闲可用的对象,而一般来讲容器不需要也没必要承担这种责任。
从客户端的角度来说,容器的意义在于使得客户端可以共享某些对象及它们的状态,以及通过一种可配置的方式让容器管理这些对象之间的依赖关系和生命周期等等;而使用池的目的多半在于用户要池化的对象是有状态的,最重要的是这些状态并非为了在应用程序之间共享,它们只是对象池区分对象是否空闲可用的重要标志。典型地拿数据库连接池来说,它所管理的对象是数据库连接,它的职责是保证客户端在任何时候得到的连接总是空闲可用的(也就是说没有其它任何用户在使用此连接),如果某一特定的连接已被客户端获得且尚未被重新放回池中,其它客户端是不可以再获得此连接的。
一言以蔽之,客户端借助容器可以共享容器中的对象以及它们之间的状态;而借助于对象池却可以在不同时刻共享池中处于某种特定状态(典型的是空闲)的对象。