之前学了,配置bean可以用普通全类名配置、用工厂方法配置,FactoryBean又是什么呢

有时候配置bean要用到,IOC其他Bean,这时,用FactoryBean配置最合适。

 FactoryBean是一个接口,要用的话就要实现它。他有三个方法:

  getObject()  //返回bean对象

  getObjectType()  //返回bean的类型

    isSingleton()   //是否单例

 弄个例子:

 Car类

 1 package com.guigu.spring.factorybean;
 2 
 3 
 4 public class Car {
 5     private String brand;
 6     private double price;
 7     
 8     public Car(){
 9     }
10     public Car(String brand,double price){
11         this.brand=brand;
12         this.price=price;
13     }
14     public String getBrand() {
15         return brand;
16     }
17     public void setBrand(String brand) {
18         this.brand = brand;
19     }
20     public double getPrice() {
21         return price;
22     }
23     public void setPrice(double price) {
24         this.price = price;
25     }
26     @Override
27     public String toString() {
28         return "Car [brand=" + brand + ", price="+price +"]";
29     }
30 }

 

 CarFactoryBean.java

 1 package com.guigu.spring.factorybean;
 2 
 3 import org.springframework.beans.factory.FactoryBean;
 4 
 5 public class CarFactoryBean implements FactoryBean<Car> {
 6 
 7     private String brand;
 8      
 9     //返回bean对象
10     @Override
11     public Car getObject() throws Exception {
12         return new Car(brand,500000);
13     }
14 
15     //返回bean的类型
16     @Override
17     public Class<?> getObjectType() {
18         return Car.class;
19     }
20     //是否单例
21     @Override
22     public boolean isSingleton() {
23         return true;
24     }
25 
26     public void setBrand(String brand) {
27         this.brand = brand;
28     }
29 
30 }

 bean-beanfactory中要配置的bean

 

1   <bean id="car" class="com.guigu.spring.factorybean.CarFactoryBean">
2       <property name="brand" value="BMW"></property>
3   </bean>

 

main函数

 

1     public static void main(String[] args) {
2         
3         ApplicationContext ctx =new ClassPathXmlApplicationContext("bean-beanfactory.xml");
4         Car car=(Car) ctx.getBean("car");
5         System.out.println(car);
6     
7     }

 

 输出:

 Car[brand=BMW, price=500000]

 

学到这里,我想了想,好像和一开始用类名配置的没什么区别啊!

再看一下xml中的笔记:

 1      <!-- 
 2         通过 FactoryBean 来配置Bean 的实例
 3         class : 指向 FactoryBean 的全类名
 4         property :配置 FactoryBean 的属性
 5         但实际返回实例确是 FactoryBean 的 getObject() 方法返回的实例!
 6         
 7      -->
 8 
 9  <bean id="car" class="com.guigu.spring.factorybean.CarFactoryBean">
10      <property name="brand" value="BMW"></property>
11  </bean>

 

 但实际返回实例确是 FactoryBean 的 getObject() 方法返回的实例!

 估计就是这里了,区别应该就是父接口带来的三个方法,后面会继续看

 

另外说一下,这个FactoryBean 不是前面的BeanFactory

 之前的笔记:

 

posted on 2016-08-25 00:01  ooooevan  阅读(517)  评论(0编辑  收藏  举报