-
懶加載適用場景:
如果某個Bean在程序整個運行周期都可能不會被使用,那么可考慮設定該Bean為懶加載。
優點:盡可能的節省了資源。
缺點:可能會導致某個操作響應時間增加。
查看全部 -
實現懶加載的兩種方式:
為某個Bean設置懶加載
為所有Bean設置懶加載
查看全部 -
Bean的懶加載概念:
Spring容器會在創建容器時,提前初始化Singleton(單例)作用域的bean,但是如果Bean被標注了lazy-init=“true,則該Bean只有在其在被需要的時候才會被初始化。
注意:只對Singleton(單例)作用域的bean有效,其他作用域如多例并不知道什么這個bean才會被需要實例化。
查看全部 -
代碼回顧
SimpThreadScope
查看全部 -
代碼回顧
自定義作用域(spring.xml部分)
查看全部 -
代碼回顧
自定義作用域(自定義類部分)
查看全部 -
測試方法,如圖
創建線程的方法為
new?Thread(new?Runnable()?{ ????@Override ????public?void?run()?{ ????????Bean?bean?=?context.getBean("bean",Bean.class); ????????System.out.println("bean?=?"?+?bean); ????} }).start();
查看全部 -
使用SimpleThreadScope作用域
該作用域的作用是,在每一個線程里spring會提供一個全新的實例。在同一個線程多次向spring上下文申請實例的時候spring會提供同一個實例。但如果在多個線程里面每一個線程都向spring上下文申請一個實例,那么spring會給每一個線程申請一個新的實例。
先定義出SimpleThreadScope的實例
<bean?class="org.springframework.context.support.SimpleThreadScope"?id="SimpleThreadScope"/>
然后再在CustomScopeConfigurer的實例中加上
<entry?key="simplethreadScope"?value-ref="SimpleThreadScope"/>
查看全部 -
在spring.xml中,修改
????<bean?class="com.imooc.spring.ioc.class009.MyScope"?id="myScope"/> ????<bean?class="org.springframework.context.support.SimpleThreadScope"?id="SimpleThreadScope"/> ????<bean?class="org.springframework.beans.factory.config.CustomScopeConfigurer"> ????????<property?name="scopes"> ????????????<map> ????????????????<entry?key="myScope"?value-ref="myScope"/> ????????????</map> ????????</property> ????</bean> ????<bean?id="bean"?class="com.imooc.spring.ioc.class009.Bean"?scope="myScope"/>
查看全部 -
自定義作用域
需要引用Scope接口,注意是
import?org.springframework.beans.factory.config.Scope;
然后實現這個接口的方法。
重點關注get 和 remove方法,如圖為實現雙例模式(每一個Bean對應兩個實例)。
public?Object?get(String?s,?ObjectFactory<?>?objectFactory)?{ ????if(!map1.containsKey(s)){ ????????Object?o?=?objectFactory.getObject(); ????????map1.put(s,o); ????????return?o; ????} ????if(!map2.containsKey(s)){ ????????Object?o?=?objectFactory.getObject(); ????????map2.put(s,o); ????????return?o; ????} ????//若map1?和?map2都存在s,則隨機返回一個 ????int?i?=?new?Random().nextInt(2);//0?or?1 ????if(i?==?0){ ????????return?map1.get(s); ????}else?{ ????????return?map2.get(s); ????} } public?Object?remove(String?s)?{ ????if(map2.containsKey(s)){ ????????Object?o=map2.get(s); ????????map2.remove(s); ????????return?o; ????} ????if(map1.containsKey(s)){ ????????Object?o=map1.get(s); ????????map1.remove(s); ????????return?o; ????} ????return??null; }
查看全部 -
總結
reuqest:每個request請求都會創建一個單獨的實例。
session:每個session都會創建一個單獨的實例。
application:每個sercletContext都會創建一個單獨的實例。
websocket:每個websocket鏈接都會創建一個單獨的實例。
查看全部 -
該測試需要配置好Tomcat...
查看全部 -
之后在spring.xml中加上3個類的Bean
查看全部 -
創建ApplicationController、RequestController、SessionController類
修改RequestController類中代碼,如圖
其余兩個類也做相同修改,只不同
@RequestMapping("testApplication")
@RequestMapping("testSession")
查看全部 -
在web.xml中配置spring的web上下文環境
查看全部
舉報