Spring極簡學習(三)例項化Bean的方法有兩種
阿新 • • 發佈:2018-12-23
其實例項化一個Bean並沒有那麼複雜,不就是將new Bean()的過程放到Spring這裡來實現了嗎?
其實的確如此,當然了,之前的設計模式中的例項化Bean的方式Spring也得支援支援吧。
一、最直觀例項化(反射模式)
xml配置
<bean id="car1" class="com.*.Car">
<property name="id" value="1"></property>
</bean>
說明:這裡要把類com.*.Car例項化為一個名叫car1的物件,引數都在下面,請Spring先生例項化一下吧。
二、工廠方法模式
工廠方式與設計模式對應,分為靜態工廠與動態工廠。靜態工廠指的是,需要工廠進行例項化的類是固定寫在程式碼中,不需要在配置中顯式例項化。
1、靜態工廠—— Factory模式
bean類Car
package com.home.factoryMethod; public class Car { private int id; private String name; public int getId() { return id; } public void setId(int id) { this.id = id; } @Override public String toString() { return "Car [id=" + id + " ]"; } public Car(){ } public Car(int id, String name, int price) { super(); this.id = id; } }
工廠類CarStaticFactory
package com.home.factoryMethod; import java.util.HashMap; import java.util.Map; public class CarStaticFactory { private static Map<Integer, Car> map = new HashMap<Integer,Car>(); static{ map.put(1, new Car(1); map.put(2, new Car(2); map.put(3, new Car(3); } public static Car getCar(int id){ return map.get(id); } }
xml配置
<bean id="Car3"
class="com.home.factoryMethod.CarStaticFactory"
factory-method="getCar">
<constructor-arg value="3"></constructor-arg>
</bean>
<bean id="Car2"
class="com.home.factoryMethod.CarStaticFactory"
factory-method="getCar">
<constructor-arg value="2"></constructor-arg>
</bean>
程式碼呼叫
public static void h(){
ApplicationContext ctx =
new ClassPathXmlApplicationContext("bean-factoryMethod.xml");
Car car2 = (Car) ctx.getBean("Car2");
System.out.println(car2 );
Car car1 = (Car) ctx.getBean("Car1");
System.out.println(car1);
}
靜態工廠方法方式是非常適用於作為1個bean容器(集合的), 只不過bean集合定義在工廠類裡面而不是bean config file裡面。
缺點也比較明顯, 把資料寫在class裡面而不是配置檔案中違反了spring的初衷。
當然優點就是bean config file更加簡潔啦。
2、動態工廠——Factory bean模式
就是將需要例項化的bean也設定在配置檔案中,更加靈活。這種方式是更為常用的工廠模式。
1、例項工廠類
package com.home.factoryMethod;
import java.util.HashMap;
import java.util.Map;
public class CarInstanceFactory {
private Map<Integer, Car> map = new HashMap<Integer,Car>();
public void setMap(Map<Integer, Car> map) {
this.map = map;
}
public CarInstanceFactory(){
}
public Car getCar(int id){
return map.get(id);
}
}
2、xml寫法
<bean id="carFactory"
class="com.home.factoryMethod.CarInstanceFactory">
<property name="map">
<map>
<entry key="4">
<bean class="com.home.factoryMethod.Car">
<property name="id" value="4"></property>
</bean>
</entry>
<entry key="6">
<bean class="com.home.factoryMethod.Car">
<property name="id" value="6"></property>
</bean>
</entry>
</map>
</property>
</bean>
<bean id="car4" factory-bean="carFactory" factory-method="getCar">
<constructor-arg value="4"></constructor-arg>
</bean>
<bean id="car6" factory-bean="carFactory" factory-method="getCar">
<constructor-arg value="6"></constructor-arg>
</bean>
3、客戶端呼叫
public static void h2(){
ApplicationContext ctx =
new ClassPathXmlApplicationContext("bean-factoryMethod.xml");
Car car1 = (Car) ctx.getBean("car4");
System.out.println(car1);
car1 = (Car) ctx.getBean("car6");
System.out.println(car1);
}