Spring——Bean scope
Spring framework 支持6个范围(scope),其中4个只能在用web-aware时才能使用。当然,你也可以创建自定义范围。
- singleton : spring默认就是singleton,即在注册该bean的时候,会把这个bean存储到单列bean缓存,以后对该bean的所有的后续请求和引用都会返回缓存中的这一个bean。但spring的singleton 与Gang of Four,GoF)模式的单例模式不一样,spring的singleton是相对与容器只有一个实例,但jvm中可能有多个容器,即有多个实例;所有,如果我们控制对象生命周期完全交给spring管理,可以达到单列模式的效果,即:对象不通过其他地方进行new 或反射等方式创建。
偷个图:
- prototype:原型。能创建任意个新的bean实例,在你将bean注入到其他bean中或调用getBean()方法。一般prototype用于有状态的bean,singleton用于无状态的所有bean(如DAO)。
但有一点:Spring不管理原型bean的生命周期,容器实例化、配置或组装原型对象都交给客户端,自己不去对实例记录,也不会去configured destruction lifecycle callbacks are not called(怕自己理解有误)。所以,客户端代码必须清理原型作用域的对象以及引用,释放bean占用的宝贵资源,可通过自定义bean后台处理
- 具有prototype bean依赖的sigleton bean:
因为sigleton bean 被 容器实例化和解析注入依赖只发生一次,之后便被存储到缓存中了。所以prototype bean 将一直为初始化时候的那一个,但如果你想每次在sigleton bean运行时重复获取新的prototype bean,则可以通过方法注入的方式通过实现ApplicationContextAware
接口,并生成一个getBean()方法,每次去获得新的bean。
- Request, Session, Application, and WebSocket Scopes:这些是需要你
use a web-aware Spring ApplicationContext implementation (such as XmlWebApplicationContext).
等我学到web上再说吧????。