文章目录
bean的作用域:其中singleton为缺省值
作用域 | 描述 |
---|---|
singleton | 在启动时自动实例化,只存在一个共享的命名实例,类似于servlet |
prototype | 每次请求时创建一个实例,不是在启动时自动初始化!而是在第一次请求时初始化(例如getBean时)。有状态的Bean需要用prototype,例如Action。什么是有状态的bean?需要保存用户数据 |
request | 对于每次HTTP请求,使用request定义的Bean都将产生一个新实例,即每次HTTP请求将会产生不同的Bean实例。只有在Web应用中使用Spring时,该作用域才有效 |
session | 对于每次HTTP Session,使用session定义的Bean都将产生一个新实例。只有在Web应用中使用Spring时,该作用域才有效 |
globalsession | 每个全局的HTTP Session使用session定义的Bean都将产生一个新实例。典型情况下,仅在使用portlet context的时候有效。同样只有在Web应用中使用Spring时,该作用域才有效 |
顺便聊一嘴生命周期,下图也不知道哪里看到的了,侵删:
SpringIoC 容器创建 bean 实例的三种方法:
1、调用构造器创建Bean实例
最普通的,略过。在这里放上applicationContext.xml文件,以和调用工厂方法作对比。
<bean id="itemOrder2" class="com.homework.bean.ItemOrder">
<property name="numItems">
<value>2</value>
</property>
<property name="item">
<ref bean="item2" />
</property>
</bean>
2、调用静态工厂方法创建bean实例
编写工厂类ItemOrderFactory
package com.homework.bean;
public class ItemOrderFactory {
public ItemOrderFactory() {
// TODO Auto-generated constructor stub
}
public static ItemOrder createItemOrder() {
System.out.println("调用实例工厂方法创建bean...");
return new ItemOrder();
}
}
修改applicationContext.xml文件:
此时的class不再是ItemOrder,而是ItemOrderFactory,并且增加factory-method方法
<bean id="itemOrder2" class="com.homework.bean.ItemOrderFactory" factory-method="createItemOrder">
<property name="numItems">
<value>2</value>
</property>
<property name="item">
<ref bean="item2" />
</property>
</bean>
3、调用实例工厂方法创建 bean 实例
工厂类ItemOrderFactory:和静态工厂方法不同的是返回ItemOrder的方法不再是静态的了。
package com.homework.bean;
public class ItemOrderFactory {
public ItemOrderFactory() {
// TODO Auto-generated constructor stub
}
public ItemOrder createItemOrder() {
System.out.println("调用实例工厂方法创建bean...");
return new ItemOrder();
}
}
修改applicationContext.xml文件:这时不再是直接把class改为ItemOrderFactory(class依旧为ItemOrder),而是配置一个ItemOrderFactory的实例出来(不知道这种说法是不是正确的,但我就是这么理解的),然后使用factory-bean去指向这个实例。当然factory-method属性依旧是被需要的。
<bean id="orderFactory" class="com.homework.bean.ItemOrderFactory" />
<bean id="itemOrder2" class="com.homework.bean.ItemOrder" factory-method="createItemOrder" factory-bean="orderFactory">
<property name="numItems">
<value>2</value>
</property>
<property name="item">
<ref bean="item2" />
</property>
</bean>