在Spring应用中,Spring IoC容器可以创建、装配和配置应用组件对象,这里的组件对象称为Bean(Bean是注册到Spring容器中的Java类,任何一个Java类都可以是一个Bean)。
1. Bean的实例化
在面向对象编程中,如果使用某个对象,需要事先实例化该对象。同样,在Spring框架中,想使用Spring容器中的Bean,也需要实例化Bean。
Spring框架实例化Bean有三种方式:构造方法实例化、静态工厂实例化和实例工厂实例化。其中,最常用的实例方法是构造方法实例化。
2. Bean的实例化案例
分别使用构造方法、静态工厂和实例工厂实例化Bean。
案例实现详见链接:案例05 Bean的实例化案例
3. Bean的作用域
Spring容器创建一个Bean实例时,还可以为该Bean指定作用域,Bean的作用域是指实例的有效范围。
Spring容器为Bean指定了多种作用域,具体如下表所示:
作用域名称 |
描述 |
singleton |
单例模式,在单例模式下,Spring 容器中只会存在一个共享的Bean实例,所有对Bean的请求,只要请求的id(或name)与Bean的定义相匹配,会返回Bean的同一个实例。 |
prototype |
原型模式,每次从容器中请求Bean时,都会产生一个新的实例。 |
request |
在一次HTTP请求中容器将返回一个Bean实例,不同的HTTP请求返回不同的Bean实例。仅在Web Spring应用程序上下文中使用。 |
session |
在一个HTTP Session中,容器将返回同一个Bean实例。仅在Web Spring应用程序上下文中使用。 |
application |
为每个ServletContext对象创建一个实例,即同一个应用共享一个Bean实例。仅在Web Spring应用程序上下文中使用。 |
websocket |
为每个WebSocket对象创建一个Bean实例。仅在Web Spring应用程序上下文中使用。 |
其中,singleton和prototype是两种最为常见的作用域。
- singleton作用域
singleton单例模式,是Spring容器默认的作用域,当Bean的作用域为singleton时,Spring容器只为Bean创建一个实例,该实例可以重复使用。
Spring容器管理着Bean的声明周期,包括Bean的创建、初始化、销毁。因为创建和销毁Bean实例会带来一定的系统开销,所以singleton作用域可以避免反复创建和销毁实例造成的资源消耗。
- prototype作用域
prototype原型模式,每次从容器中请求Bean时,都会产生一个新的实例,Spring容器只负责创建Bean实例而不再管理其生命周期。
4. Bean的作用域案例
分别使用singleton和prototype作用域创建Bean实例,比较singleton和prototype作用域的区别。
案例实现详见链接:案例06 Bean的作用域案例
5. Bean的生命周期
Bean的生命周期是指Bean实例被创建、初始化和销毁的过程。在Bean的两种作用域singleton和prototype中,Spring容器对Bean的生命周期的管理是不同的。
在singleton作用域中,Spring容器可以管理Bean的生命周期,控制着Bean的创建、初始化和销毁。在prototype作用域中,Spring容器只负责创建Bean实例,不会管理其生命周期。
在Bean的生命周期中,有两个时间节点尤为重要,这两个时间节点分别是Bean实例初始化后和Bean实例销毁前,在这两个时间节点通常需要完成一些指定操作。因此,常常需要对这两个节点进行监控。