Spring学习--实现 FactoryBean 接口在 Spring IOC 容器中配置 Bean
Spring 中有两种类型的 bean , 一种是普通的 bean , 另一种是工厂 bean , 即 FactroyBean。
工厂 bean 跟普通 bean 不同 , 其返回的对象不是指定类的一个实例 , 其返回的是该工厂 bean 的 getObject 方法所返回的对象。
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> 5 6 <bean id="car" class="com.itdjx.spring.factorybeans.CarFactoryBean"> 7 <property name="name" value="BMW"/> 8 </bean> 9 10 </beans>
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 @Override 35 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... |
创建 IOC 容器时调用 isSingleton 若是返回 true 调用 getObjectType , 若返回 false , IOC 直接创建完成。
创建 Car 实例时调用 isSingleton -->> getObject , 实例创建完成。