之前学了,配置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
之前的笔记: