之前筆記一實踐的是全類名(反射)的方式進行bean的配置父丰,現(xiàn)在我們實踐使用工廠的方法進行bean的配置。
在使用工廠方法配置bean是有兩種方式:靜態(tài)工廠方法和實例工廠方法掘宪。
- 靜態(tài)工廠方法
也就是通過工廠類直接調(diào)用獲取實例的方法去獲取bean的實例蛾扇,那么工廠類是如何實現(xiàn)bean的實例和初始化呢攘烛,我們在創(chuàng)建工廠類是,可以在類的靜態(tài)代碼塊中進行bean的實例加初始化镀首,并提供獲取bean的方法坟漱;具體代碼實現(xiàn)如下:
創(chuàng)建Car類:
public class Car {
private String brand;//品牌
private double price;//價錢
public Car() {
System.out.println("constructor()......");
}
public Car(String brand, double price) {
this.brand = brand;
this.price = price;
}
public void init() {
System.out.println("init()......");
}
public void destory() {
System.out.println("destory()......");
}
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
System.out.println("setBrand()......");
this.brand = brand;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
@Override
public String toString() {
return "Car{" +
"brand='" + brand + '\'' +
", price=" + price +
'}';
}
}
靜態(tài)工廠代碼:
/**
* 工廠靜態(tài)方法配置bean
*/
public class StaticCarFactory {
private static Map<String, Car> cars=null;
//初始化對象
static {
cars=new HashMap<>();
cars.put("Audi",new Car("Audi",30000));
cars.put("Ford",new Car("Ford",20000));
}
//獲取bean實例的方法
public static Car getCar(String bread){
return cars.get(bread);
}
}
在xml配置文件中進行靜態(tài)工廠的配置
<!--靜態(tài)方法實現(xiàn)bean的配置-->
<!--factory-method指向靜態(tài)工廠方法的名稱-->
<!--constructor-arg 涉及到獲取實例方法傳參的問題,設(shè)置方法的形參-->
<bean id="staticfactory" class="com.example.demo.factory.StaticCarFactory" factory-method="getCar">
<constructor-arg value="Audi"></constructor-arg>
</bean>
根據(jù)配置文件可以看出通過靜態(tài)工廠實例去調(diào)用工廠方法去獲取bean的實例對象更哄,具體配置涉及到的屬性如下:
- id 定義靜態(tài)工廠的名稱
- class 靜態(tài)工廠所對應(yīng)的全路徑
- factory-method 靜態(tài)工廠獲取bean實例的方法
- constructor-arg 設(shè)置調(diào)用靜態(tài)工廠獲取bean方法是需要用到的參數(shù)
測試配置:
public class FactoryMain {
public static void main(String[] args){
ApplicationContext ctx=new ClassPathXmlApplicationContext("bean-factory.xml");
//靜態(tài)工廠配置
Car staticfactoryCar= (Car) ctx.getBean("staticfactory");
System.out.println(staticfactoryCar);
}
}
運行代碼結(jié)果:
Car{brand='Audi', price=30000.0}
- 實例工廠方法
實例工廠
/**
* 實例工廠配置bean
*/
public class InstanceCarFactory {
private Map<String, Car> cars = null;
//通過無參構(gòu)造方法初始化
public InstanceCarFactory() {
cars = new HashMap<>();
cars.put("Audi", new Car("Audi", 30000));
cars.put("Ford", new Car("Ford", 20000));
}
//獲取bean的方法
public Car getCar(String bread) {
return cars.get(bread);
}
}
xml配置文件
<!--配置工廠實例-->
<bean id="instancefactory" class="com.example.demo.factory.InstanceCarFactory">
</bean>
<!--factory-bean 指向?qū)嵗S方法的bean-->
<!--factory-method指向是實例工廠方法的名稱-->
<bean id="carinstance" factory-bean="instancefactory" factory-method="getCar">
<constructor-arg value="Audi"></constructor-arg>
</bean>
涉及到的屬性和靜態(tài)配置的都一樣芋齿,唯一區(qū)別就是actory-bean屬性,實例工廠配置也就是先獲取實例工廠的對象實例竖瘾,這是在獲取實例工廠是調(diào)用了InstanceCarFactory()構(gòu)造方法沟突,在構(gòu)造方法中初始化了Cars,與此同時可以調(diào)用實例工廠方法去獲取配置bean的具體實例信息捕传。
測試代碼:
public static void main(String[] args){
ApplicationContext ctx=new ClassPathXmlApplicationContext("bean-factory.xml");
//實例工廠配置
Car instanceCar= (Car) ctx.getBean("carinstance");
System.out.println(instanceCar);
}
測試結(jié)果:
Car{brand='Audi', price=30000.0}
總結(jié):對于工廠配置bean的不論是針對靜態(tài)的方式還是實例的方式惠拭,都是在工廠中將bean實例化然后放置在ioc容器中,通過工廠獲取實例的方法去獲扔孤邸职辅!只是在實例bean的方式上是有所差異的!