Spring笔记:设置Bean的作用域
描述:当通过getBean()方法请求该Bean时,Spring是根据Bean的作用域决定应该返回的Bean实例。默认的作用域为singleton,意思是每个Spring IoC容器只创建一个Bean实例。但在某些情况下,这样的作用域并不合适,比如购物车,应该是每请求一次就创建一次Bean实例。因此,需要为Bean设置更合适的Bean的作用域。
例子:购物车ShoppingCart类:
package chapter4_1; import java.util.ArrayList; import java.util.List; public class ShoppingCart { private List<Produce> items = new ArrayList<Produce>(); public void addItem(Produce item) { items.add(item); } public List<Produce> getItems() { return items; } }
配置文件:
<bean id="aaa" class="chapter4_1.Battery"> <property name="name" value="aaa"></property> <property name="price" value="22"></property> </bean> <bean id="disc" class="chapter4_1.Disc"> <property name="name" value="Disc"></property> <property name="price" value="555"></property> </bean> <bean id="shoppingCart" class="chapter4_1.ShoppingCart"> </bean>
测试程序:
package chapter4_1; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Test { /** * @param args */ public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("app4.xml"); Produce aaa = (Produce)context.getBean("aaa"); Produce disc = (Produce)context.getBean("disc"); ShoppingCart cart1 = (ShoppingCart)context.getBean("shoppingCart"); cart1.addItem(aaa); ShoppingCart cart2 = (ShoppingCart)context.getBean("shoppingCart"); cart2.addItem(disc); System.out.println("cart1 contains "+cart1.getItems()); System.out.println("cart2 contains "+cart2.getItems()); } }
打印:
cart1 contains [chapter4_1.Battery@16546ef, chapter4_1.Disc@1428ea]
cart2 contains [chapter4_1.Battery@16546ef, chapter4_1.Disc@1428ea]
Spring里有效的作用域:
1、singleton:每个Spring IoC容器只创建一个Bean实例
2、prototype:每次请求时都创建一个新的Bean实例
3、request:每个Http请求创建一个Bean实例,仅在web应用程序的上下文中有效
4、session:每个Http会话创建一个Bean实例,仅在web应用程序的上下文中有效
5、globalSession:为每个全局的Http会话创建一个Bean实例,仅在门户应用程序的上下文有效
因此,需要将id为shoppingCart的Bean作用域设置为prototype
<bean id="shoppingCart" class="chapter4_1.ShoppingCart" scope="prototype">
</bean>
设置作用域后,再次运行测试程序:
cart1 contains [chapter4_1.Battery@1326484]
cart2 contains [chapter4_1.Disc@16546ef]