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]

 

 

 

posted @ 2013-04-01 22:01  爱生活者wmmang  Views(285)  Comments(0Edit  收藏  举报