1. 程式人生 > >spring bean的單例和多例的使用場景和在單例bean中注入多例(不看後悔,一看必懂)

spring bean的單例和多例的使用場景和在單例bean中注入多例(不看後悔,一看必懂)

為什麼用單例或者多例?何時用?

之所以用單例,是因為沒必要每個請求都新建一個物件,這樣子既浪費CPU又浪費記憶體;

之所以用多例,是為了防止併發問題;即一個請求改變了物件的狀態,此時物件又處理另一個請求,而之前請求對物件狀態的改變導致了物件對另一個請求做了錯誤的處理;

 

當物件含有可改變的狀態時(更精確的說就是在實際應用中該狀態會改變),則多例,否則單例;

對於struts2來說,action必須用多例,因為action本身含有請求引數的值,即可改變的狀態;

為什麼用單例或者多例?何時用?

之所以用單例,是因為沒必要每個請求都新建一個物件,這樣子既浪費CPU又浪費記憶體;

之所以用多例,是為了防止併發問題;即一個請求改變了物件的狀態,此時物件又處理另一個請求,而之前請求對物件狀態的改變導致了物件對另一個請求做了錯誤的處理;

 

當物件含有可改變的狀態時(更精確的說就是在實際應用中該狀態會改變),則多例,否則單例;

對於struts2來說,action必須用多例,因為action本身含有請求引數的值,即可改變的狀態;

如何在單例bean中注入一個多例bean

如果我們需要給一個單例beanA注入一個多例beanB時(多例注入單例是沒有問題的),僅僅通過配置Spring是無法幫我們的單例beanA注入一個多例beanB的,即無法讓我們每次使用beanB時都使用的是一個全新的beanB。因為beanA只初始化一次,相對應的Spring只會給beanA注入一個beanB。解決辦法是給beanA注入一個BeanFactory,這樣我們就可以在每次需要使用beanB時都從BeanFactory中獲取一個新的beanB。

例如:service是單例的,而tool又是多例的

這裡tool仍然是單例的

UserService 通過實現 BeanFactoryAware 介面來獲得factory

由於不使用spring的自動注入,set方法要去掉!

public class userService implements BeanFactoryAware{   

  private Tool tool;

  private BeanFactory factory;
  public

 void service(){
    this.tool = (Tool)factory.getBean("tool");
    System.out.println(this+":service");
    tool.work();
  }
  public Tool getTool() {
        return tool;
  }

public void setBeanFactory(BeanFactory f) throws BeansException {

factory = f;
  }
}

配置檔案,不能再使用注入。因此要把tool物件的注入去掉!

<bean id="user" class="modle.User" scope="prototype">   

     <property name="service" ref="userservice"></property> 

</bean>   

<bean id="userservice" class="service.userService" > 

</bean>   

<bean id="tool" class="service.ToolImpl" scope="prototype">

</bean>