Bean标签作用:
用于配置对象让 spring 来创建的。
默认情况下它调用的是类中的无参构造函数。如果没有无参构造函数则不能创建成功。
Bean标签属性:
id:给对象在容器中提供一个唯一标识。用于获取对象。
class:指定类的全限定类名。用于反射创建对象。默认情况下调用无参构造函数。
scope:指定对象的作用范围。
- singleton:默认值,单例的(在整个容器中只有一个对象).
- prototype:多例的.
- reques:WEB 项目中,Spring 创建一个 Bean 的对象,将对象存入到 request 域中.
- session:WEB 项目中,Spring 创建一个 Bean 的对象,将对象存入到 session 域中.
- global session:WEB 项目中,应用在 Portlet 环境.如果没有 Portlet 环境那么globalSession 相当于 session.
- init-method:指定类中的初始化方法名称。
- destroy-method:指定类中销毁方法名称。比如DataSource的配置中一般需要指定destroy-method=“close”。
Bean的作用范围:
单例对象:scope=”singleton”
* 一个应用只有一个对象的实例。它的作用范围就是整个引用。 * 生命周期: 对象创建:当应用加载,创建容器时,对象就被创建了。 对象活着:只要容器在,对象一直活着。 对象死亡:当应用卸载,销毁容器时,对象就被销毁了。
多例对象:scope=”prototype”
- 每次访问对象时,都会重新创建对象实例。
- 生命周期:
对象创建:当使用对象时,创建新的对象实例。
对象活着:只要对象在使用中,就一直活着。
对象死亡:当对象长时间不用时,被 java 的垃圾回收器回收了。
Singleton作用域
***example.xml***
单例模式, Spring IoC 容器中只会存在一个共享的 Bean 实例,无论有多少个 Bean *引用它,始终指向同一对象。 *Singleton 作用域是 Spring 中的缺省作用域,也可以显示的将 Bean 定义为 singleton 模式,
示例中 bean 只被实例化了一次,也就是只有一个 bean 以引用的方式分别注入otherBean1, otherBean2, otherBean3.
1 | <bean id="bean" class="..." scope="singleton"></bean> |
Prototype作用域
原型模式,每次通过 Spring 容器获取 prototype 定义的 bean 时,容器都将创建一个新的 Bean 实例,每个Bean 实例都有自己的属性和状态,而 singleton 全局只有一个对象。根据经验,对有状态的 bean 使用 prototype 作用域,而对无状态的 bean 使用 singleton 作用域。
Singleton 与 Prototype 混合:
1 | <bean id="bean2" class="com.***.Bean2"/> |
方法注入
1 | <bean id="bean2" class="com.***.Bean2" scpoe="prototype"/> |
这里Bean1是 singleton,Bean2是 prototype,Bean1依赖Ban2。我们希望每次调用Bean1的某个方法时,该方法拿到的Bean2都是一个新的实例,而不是都为单实例
首先将 Bean1 中的 get 与 set 方法删除(即去掉私有属性域中的 bean2 ),改为
1 | protected abstract Bean2 createBean2(); |
并将 .xml 改为即可实现方法注入
1 | <bean id="bean2" class="com.***.Bean2" scpoe="prototype"/> |
Web环境作用域
- request作用域
- session作用域
- application作用域
- websocket作用域
自定义作用域
- SimpleThreadScope作用域