Spring框架通過工廠建立Bean的三種方式實現
阿新 • • 發佈:2020-03-24
工廠模式
Spring中bean的建立,預設是框架利用反射new出來的bean例項。有時候也會有一些複雜的情況。
假設有一個飛機,屬性如下,現在需要造很多同型號的飛機,那麼唯一需要改變的屬性只有DriverName(機長姓名),此時可以使用工廠模式幫我們建立物件,有一個專門幫我們建立物件的類幫我們建立物件,這個類就叫工廠。
public class AirPlane { private String DriverName;// 機長姓名 private String AirPlaneName;// 飛機名字 private String longth;// 飛機長度 private Integer num;// 載客量 //省略getter與setter方法 }
靜態工廠:工廠本身不用建立物件,通過靜態方法呼叫。
例項工廠:工廠本身需要建立物件,需要先new一個工廠例項。
1.使用靜態工廠建立bean
靜態工廠:
package com.gql.factory; import com.gql.bean.AirPlane; /** * 靜態工廠 * * @author guoqianliang */ public class AirPlaneStaticFactory { public static AirPlane getAirPlane(String drivername) { System.out.println("靜態工廠造飛機..."); AirPlane airplan = new AirPlane(); airplan.setDriverName(drivername); airplan.setAirPlaneName("殲20"); airplan.setLongth(20); airplan.setNum(1); return airplan; } }
在xml中註冊靜態工廠:
<!-- 靜態工廠: factory-method="getAirPlane"指定哪個方法是工廠方法--> <bean id="airPlan1" class="com.gql.factory.AirPlaneStaticFactory" factory-method="getAirPlane"> <constructor-arg value="舒克"></constructor-arg> </bean>
測試:
@Test public void test07() { System.out.println("容器啟動完成"); AirPlane bean = (AirPlane) ioc.getBean("airPlan1"); System.out.println("列印飛機屬性:" + bean); }
2.使用例項工廠建立bean
例項工廠:
package com.gql.factory; import com.gql.bean.AirPlane; /** * 例項工廠 * @author guoqianliang */ public class AirPlaneInstanceFactory { public AirPlane getAirPlane(String drivername) { System.out.println("例項工廠造飛機..."); AirPlane airplan = new AirPlane(); airplan.setDriverName(drivername); airplan.setAirPlaneName("殲20"); airplan.setLongth(20); airplan.setNum(1); return airplan; } }
在xml中註冊例項工廠:
- factory-bean=“InstanceFactory” :指定使用哪個工廠例項。
- factory-method=“getAirPlane”:使用哪個工廠方法。
<bean id="InstanceFactory" class="com.gql.factory.AirPlaneInstanceFactory"></bean> <bean id="airPlan2" class="com.gql.bean.AirPlane" factory-bean="InstanceFactory" factory-method="getAirPlane"> <constructor-arg value="舒克二號"></constructor-arg> </bean>
測試:
@Test public void test08() { System.out.println("容器啟動完成"); AirPlane bean = (AirPlane) ioc.getBean("airPlan2"); System.out.println("列印飛機屬性:" + bean); }
3.實現FactoryBean工廠建立Bean
ioc容器啟動的時候不會建立例項(無論是單例項還是多例項),獲取的時候才建立例項物件。
實現FactoryBean介面:
package com.gql.factory; import org.springframework.beans.factory.FactoryBean; import com.gql.bean.Book; public class MyFactoryBean implements FactoryBean<Book> { /** * 返回建立的物件 */ @Override public Book getObject() throws Exception { System.out.println("MyFactoryBean建立物件..."); Book book = new Book(); book.setBookName("紅樓夢"); book.setAuthor("曹雪芹"); return book; } /** * 返回建立的物件的型別 */ @Override public Class<?> getObjectType() { // TODO Auto-generated method stub return Book.class; } /** * 是單例? true:是 false:不是 */ @Override public boolean isSingleton() { // TODO Auto-generated method stub return true; } }
在xml中註冊:
<!-- 使用FactoryBean --> <bean id="myFactoryBean" class="com.gql.factory.MyFactoryBean"></bean>
測試:
@Test public void test09() { System.out.println("容器啟動完成"); Object bean = ioc.getBean("myFactoryBean"); System.out.println("列印屬性:" + bean); }
到此這篇關於Spring框架通過工廠建立Bean的三種方式實現的文章就介紹到這了,更多相關Spring 工廠建立Bean內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!