Spring 中有两种类型的 bean , 一种是普通的 bean , 另一种是工厂 bean , 即 FactroyBean。
工厂 bean 跟普通 bean 不同 , 其返回的对象不是指定类的一个实例 , 其返回的是该工厂 bean 的 getObject 方法所返回的对象。
1 25 6 7 9 108
1 package com.itdjx.spring.factorybeans; 2 3 /** 4 * @author Wáng Chéng Dá 5 * @create 2017-03-03 8:08 6 */ 7 public class Car { 8 9 private String name;10 11 private int price;12 13 public int getPrice() {14 return price;15 }16 17 public void setPrice(int price) {18 this.price = price;19 }20 21 public String getName() {22 return name;23 }24 25 public void setName(String name) {26 this.name = name;27 }28 29 public Car(String name, int price) {30 this.name = name;31 this.price = price;32 }33 34 @Override35 public String toString() {36 return "Car{" +37 "name='" + name + '\'' +38 ", price=" + price +39 '}';40 }41 }
1 package com.itdjx.spring.factorybeans; 2 3 import org.springframework.beans.factory.FactoryBean; 4 5 /** 6 * @author Wáng Chéng Dá 7 * @create 2017-03-03 8:10 8 */ 9 public class CarFactoryBean implements FactoryBean {10 11 private String name;12 13 public void setName(String name) {14 this.name = name;15 }16 17 @Override //factoryBean 返回的实例18 public Object getObject() throws Exception {19 System.out.println("I am CarFactoryBean's getObject method...");20 return new Car(name, 500000);21 }22 23 @Override //factoryBean 返回的类型24 public Class getObjectType() {25 System.out.println("I am CarFactoryBean's getObjectType method...");26 return Car.class;27 }28 29 @Override //返回的实例是否为单例30 public boolean isSingleton() {31 System.out.println("I am CarFactoryBean's isSingleton method...");32 return true;33 }34 }
1 package com.itdjx.spring.factorybeans; 2 3 import org.springframework.context.ApplicationContext; 4 import org.springframework.context.support.ClassPathXmlApplicationContext; 5 6 /** 7 * @author Wáng Chéng Dá 8 * @create 2017-03-03 8:14 9 */10 public class Main {11 12 public static void main(String[] args) {13 14 ApplicationContext cxt = new ClassPathXmlApplicationContext("factory-beans.xml");15 Car car = (Car) cxt.getBean("car");16 System.out.println(car);17 18 }19 }
控制台输出:
I am CarFactoryBean's isSingleton method... I am CarFactoryBean's getObjectType method...I am CarFactoryBean's isSingleton method...I am CarFactoryBean's getObject method...Car{name='BMW', price=500000} |
创建 IOC 容器时调用 isSingleton 若是返回 true 调用 getObjectType , 若返回 false , IOC 直接创建完成。
创建 Car 实例时调用 isSingleton -->> getObject , 实例创建完成。