1.配置bean的方式
配置bean有三种方式:通过全类名(class反射)、通过工厂方法(静态工厂&实例工厂)、通过FactoryBean。前面我们已经一起学习过全类名方式和工厂方法方式,下面通过这篇文章来学习一下FactroyBean.
2.FactoryBean配置bean
FactoryBean是Spring给我们提供的一个接口,我们来看一下这个接口的源码:
1 public interface FactoryBean<T> { 2 @Nullable 3 T getObject() throws Exception; 4 5 @Nullable 6 Class<?> getObjectType(); 7 8 default boolean isSingleton() { 9 return true; 10 } 11 }
这个接口中为我们提供了三个方法:
getObject():返回bean本身
getObjectType():返回FactoryBean创建Bean的类型。
isSingleton():返回bean是否是单例的
我们有全类名配置,也有工厂方法配置,为什么我们还要用这种FactoryBean来配置Bean呢?因为我们在配置一个bean的时候需要用到另一个bean的时候,使用FactoryBean在合适不过了
下面来具体操作一下:
首先我们创建一个Car的FactoryBean去实现FactoryBean接口:
1 public class CarFactoryBean implements FactoryBean { 2 private String brand; 3 4 public void setBrand(String brand) { 5 this.brand = brand; 6 } 7 8 @Nullable 9 public Object getObject() throws Exception { 10 return new Car("BMW", 5000000); 11 } 12 13 @Nullable 14 public Class<?> getObjectType() { 15 return Car.class; 16 } 17 18 public boolean isSingleton() { 19 return true; 20 } 21 }
Spring配置文件:
1 <!--通过factorybean来配置bean的实例,通过class来指向factorybean的全类名,property指的factory的属性--> 2 <!--,但实际返回的的是,getObject方法返回的实例。--> 3 <!--我们在配置bean的时候经常需要用的ioc容器里的其他bean,在factorybean中处理你传入的其他bean以达到目的--> 4 <bean id="car1" class="com.wzy.factorybean.CarFactoryBean"> 5 <property name="brand" value="audi"/> 6 </bean>
编写Main测试类:
1 public class Main { 2 public static void main(String[] args) { 3 ApplicationContext ctx = new ClassPathXmlApplicationContext("bean-factorybean.xml"); 4 5 Car car1 = (Car) ctx.getBean("car1"); 6 7 System.out.println(car1); 8 } 9 }
输出结果:
3.FactoryBean总结
通过Factorybean来配置bean的实例,通过class来指向factorybean的全类名,property指的factory的属性,我们在配置bean的时候经常需要用的ioc容器里的其他bean,在factorybean中处理你传入的其他bean以达到目的。但实际返回的的是,getObject方法返回的实例。