0%

Bean的简介

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的作用范围:

  1. 单例对象:scope=”singleton”

    * 一个应用只有一个对象的实例。它的作用范围就是整个引用。
    * 生命周期:
      对象创建:当应用加载,创建容器时,对象就被创建了。
      对象活着:只要容器在,对象一直活着。
      对象死亡:当应用卸载,销毁容器时,对象就被销毁了。
  2. 多例对象:scope=”prototype”

    • 每次访问对象时,都会重新创建对象实例。
    • 生命周期:
      对象创建:当使用对象时,创建新的对象实例。
      对象活着:只要对象在使用中,就一直活着。
      对象死亡:当对象长时间不用时,被 java 的垃圾回收器回收了。

Singleton作用域

  •    ***example.xml***

单例模式, Spring IoC 容器中只会存在一个共享的 Bean 实例,无论有多少个 Bean *引用它,始终指向同一对象。 *Singleton 作用域是 Spring 中的缺省作用域,也可以显示的将 Bean 定义为 singleton 模式,

示例中 bean 只被实例化了一次,也就是只有一个 bean 以引用的方式分别注入otherBean1, otherBean2, otherBean3.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<bean id="bean" class="..." scope="singleton"></bean>

<bean id="otherBean1" class="???">
<property name="parameterBean" ref="bean"/ >
</bean>

<bean id="otherBean2" class="???">
<property name="parameterBean" ref="bean"/ >
</bean>

<bean id="otherBean3" class="???">
<property name="parameterBean" ref="bean"/ >
</bean>

Prototype作用域

原型模式,每次通过 Spring 容器获取 prototype 定义的 bean 时,容器都将创建一个新的 Bean 实例,每个Bean 实例都有自己的属性和状态,而 singleton 全局只有一个对象。根据经验,对有状态的 bean 使用 prototype 作用域,而对无状态的 bean 使用 singleton 作用域。

SingletonPrototype 混合:

1
2
3
4
<bean id="bean2" class="com.***.Bean2"/>
<bean id="bean1" class="com.***.Bean1">
<property name="bean2" ref"bean2"/>
</bean>

混合下的作用域


方法注入

1
2
3
4
<bean id="bean2" class="com.***.Bean2" scpoe="prototype"/>
<bean id="bean1" class="com.***.Bean1" scope="singleton">
<property name="bean2" ref"bean2"/>
</bean>

​ 这里Bean1是 singleton,Bean2是 prototype,Bean1依赖Ban2。我们希望每次调用Bean1的某个方法时,该方法拿到的Bean2都是一个新的实例,而不是都为单实例

​ 首先将 Bean1 中的 get 与 set 方法删除(即去掉私有属性域中的 bean2 ),改为

1
protected abstract Bean2 createBean2();

​ 并将 .xml 改为即可实现方法注入

1
2
3
4
<bean id="bean2" class="com.***.Bean2" scpoe="prototype"/>
<bean id="bean1" class="com.***.Bean1" scope="singleton">
<lookup-method name="createBean2" bean="bean2"/>
</bean>

Web环境作用域

  • request作用域
  • session作用域
  • application作用域
  • websocket作用域

自定义作用域

  • SimpleThreadScope作用域