這兩天面試有人問了問題,singleton和prototype的區別?
就這問題參考網上資料,總結一下,以備日后用。
單例模式,在spring 中其實是scope(作用范圍)參數的缺省設定值
每個bean定義只生成一個對象實例,每次getBean請求獲得的都是此實例
餓漢模式
| spring singleton的缺省是餓漢模式:啟動容器時(即實例化容器時),為所有spring配置文件中定義的bean都生成一個實例
|
懶漢模式
| 在第一個請求時才生成一個實例,以后的請求都調用這個實例 spring singleton設置為懶漢模式:
<beans default-lazy-init="true">
|
- 另一種和singleton對應的scope值---prototype多實例模式
調用getBean時,就new一個新實例
singleton
xml配置文件: <bean id="dvdTypeDAO" class="com.machome.hibernate.impl.DvdTypeDAOImpl" />
|
測試代碼: ctx = new ClassPathXmlApplicationContext("spring-hibernate-mysql.xml"); DvdTypeDAO tDao1 = (DvdTypeDAO)ctx.getBean("dvdTypeDAO"); DvdTypeDAO tDao2 = (DvdTypeDAO)ctx.getBean("dvdTypeDAO");
|
運行: true com.machome.hibernate.impl.DvdTypeDAOImpl@15b0333 com.machome.hibernate.impl.DvdTypeDAOImpl@15b0333
說明前后兩次getBean()獲得的是同一實例,說明spring缺省是單例 |
prototype
<bean id="dvdTypeDAO" class="com.machome.hibernate.impl.DvdTypeDAOImpl" scope="prototype" />
|
執行同樣的測試代碼
|
運行: false com.machome.hibernate.impl.DvdTypeDAOImpl@afae4a com.machome.hibernate.impl.DvdTypeDAOImpl@1db9852 說明scope="prototype"后,每次getBean()的都是不同的新實例
|
輕輕的我走了, 正如我輕輕的來; 我輕輕的招手, 作別西天的云彩。 那河畔的金柳, 是夕陽中的新娘; 波光里的艷影, 在我的心頭蕩漾。 軟泥上的青荇, 油油的在水底招搖; 在康河的柔波里, 我甘心做一條水草! 那榆蔭下的一潭, 不是清泉, 是天上虹; 揉碎在浮藻間, 沉淀著彩虹似的夢。 尋夢?撐一支長篙, 向青草更青處漫溯; 滿載一船星輝, 在星輝斑斕里放歌。 但我不能放歌, 悄悄是別離的笙簫; 夏蟲也為我沉默, 沉默是今晚的康橋! 悄悄的我走了, 正如我悄悄的來; 我揮一揮衣袖, 不帶走一片云彩。