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...
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 , 实例创建完成。

 

posted @ 2017-03-03 08:33  Chinda  阅读(408)  评论(0编辑  收藏  举报