1. 程式人生 > 實用技巧 >bean scope的實際應用

bean scope的實際應用

建立s05,進行基本配置,建立dao包,包下建立UserDao類。UserDao只新增預設構造方法IoC容器中例項化名為userDao的物件。不新增scope預設為單例singleton。單例模式有一個典型特點就是,對於當前的bean來說是在IoC容器初始化的時候,就會將物件建立。scope設定為prototype多例模式。建立物件的時機並不在IoC容器初始化的時候,在獲取bean的時候才會建立
<bean id="userDao" class="com.imooc.spring.ioc.dao.UserDao" scope="prototype">

    </bean>

    <bean id="userService" class="com.imooc.spring.ioc.service.UserService">
        <property name="userDao" ref="userDao"/>
    </bean>
IoC容器初始化的時候會產生兩個,第五行scope預設的是單例模式,所以會建立一個userService物件,第二個是第六行引用了userDao,而userDao在初始化的過程中是不存在的,所以IoC容器也同樣進行了userDao的例項化。先userService再userDao
實際專案中,Dao、Service這些具體的類,到底是應該單例還是多例?在絕大多數場景下Dao、Service乃至於MVC的Controller控制器類都是單例的。之所以單例會出現執行緒安全問題,是因為作為某一個物件它的內建的屬性,在執行過程中會被不斷地變化。根源是屬性在執行時不斷地發生變化。但是放在具體的環境中,一旦userService物件被建立,也就意味著userDao是哪個具體的類也就確定了,在絕大多數情況下我們並不會對userDao這個屬性進行重新的設定,這也就意味著userDao在userService中是一個穩定的不變的。所以作為userService去引用userDao,我們將這兩個物件都設定為單例模式,並不會出現執行緒安全的問題。
<bean id="userDao" class="com.imooc.spring.ioc.dao.UserDao" scope="prototype">

    </bean>

    <bean id="userService" class="com.imooc.spring.ioc.service.UserService">
        <property name="userDao" ref="userDao"/>
    </bean>
技巧:作為某一個屬性,如果在執行過程中它是恆定不變的,那就可以在我們當前容器中進行單例的設定。但是如果這個屬性在執行過程中不斷地改變,那就要使用多例模式了。