Spring入門學習(工廠方法配置Bean) 第十節
阿新 • • 發佈:2019-01-06
Spring入門學習(工廠方法配置Bean)
配置Bean的形式
- 基於XML檔案的方式
- 基於註解的方式
Bean的配置方式
- 通過全類名(反射)
- 通過工廠方法(靜態工廠方法和例項工廠方法)
- FactoryBean
靜態工廠方法
靜態工廠方法建立Bean是將物件的建立過程封裝到靜態方法中,客戶端需要是隻需要簡單的呼叫就行,而不需要關心建立物件的細節
- 需要在Bean的class屬性中指定擁有該工廠方法的類,同時再
factory-method
<constructor-arg>
元素設定傳入的引數。 - 建立一個靜態工廠類
StaticCarFactory.java
和Car.java
/** * 靜態工廠方法:直接呼叫某一個類的靜態方法就可以返回bean的例項 * @author Stark * */ public class StaticCarFactory { private static Map<String, Car> cars = new HashMap<String, Car>(); static{ cars.put("audi"
- 建立一個
beans-factory.xml
配置檔案<!-- 通過靜態工廠方法來配置bean,注意不是配置靜態工廠方法例項,而是配置bean例項 --> <!-- class屬性:指向靜態工廠方法的全類名 factory-method: 指向靜態工廠方法的名字 constructor-arg: 如果工廠方法需要傳入引數,則使用constructor-arg 來配置引數 --> <bean id="car1" class="com.fafa.spring.beans.factory.StaticCarFactory" factory-method="getCar"> <constructor-arg value="audi"></constructor-arg> </bean>
- 建立一個
Main
函式進行測試:
測試結果:public class Main { public static void main(String[] args) { ApplicationContext ctx = new ClassPathXmlApplicationContext("classpath*:beans-factory.xml"); Car car1 = (Car) ctx.getBean("car1"); System.out.println(car1); } }
Car [brand=audi, price=300000.0]
顯而易見該方式是從靜態方法中獲取的值
例項工廠方法
例項工廠方法是將物件的建立過程封裝到另一個物件例項的方法裡,客戶端需要時可直接呼叫
- 先建立一個例項工廠類
InstanceCarFactory.java
/** * 例項工廠方法:例項工廠的方法,即現需要建立工廠的本身,再呼叫工廠的例項方法來返回bean的例項 * @author Stark * */ public class InstanceCarFactory { private Map<String, Car> cars = null; public InstanceCarFactory() { cars = new HashMap<String, Car>(); cars.put("audi", new Car("audi", 300000)); cars.put("ford", new Car("ford", 300000)); } public Car getCar(String brand) { return cars.get(brand); } }
- 再在xml配置檔案中配置工廠例項
<!-- 配置工廠的例項 --> <bean id="carFactory" class="com.fafa.spring.beans.factory.InstanceCarFactory"></bean>
- 建立一個bean,使用
factory-bean
屬性來指向工廠例項bean,factory-method
指向工廠方法的名稱,constructor-arg
傳入工廠方法的引數(可選)
測試結果:<!-- 通過例項工廠的方法來配置bean --> <!-- factory-bean: 指向例項工廠方法的bean factory-method: 指向例項工廠方法的名字 constructor-arg: 如果工廠方法需要傳入引數,則使用constructor-arg 來配置引數 --> <bean id="car2" factory-bean="carFactory" factory-method="getCar"> <constructor-arg value="ford"></constructor-arg> </bean>
Car [brand=ford, price=300000.0]
容器初始化的時候InstanceCarFactory
被例項化了,因此car2在指向carFactory
bean的時候直接呼叫getCar
方法獲取對應的car。