BeanFactory很好理解是 IOC 容器的原始基本形式或者说是IOC的核心高级抽象接口形式,用来管理bean的工厂。spring中所有的bean都是用BeanFactory来进行管理的。他的作用包括1.IOC定位xml的位置;2.用来实例化bean(使用getBean()方法)。3.载入xml中bean配置并建立bean之间的依赖关系,贯穿了ioc的初始化bean和 依赖注入(部分)的过程。这里不得不提一下大家熟悉的applicationContext,他包含了beanFactory还扩展了其他很多功能,所以我们一般都用他,而忽视了beanFactory。
FactoryBean首先他是一个工厂接口类,工厂模式宗旨就是隐藏内部复杂的实现过程,不同于前者他是提供一种专门用来实例化bean的工厂接口类,用于隐藏实例化bean的一系列复杂过程提供给上层调用。主语是bean表明他定义是一种bean,只不过他实现了FactoryBean的接口,通过getObject()来实例化一个bean。
FactoryBean一般情况下,Spring 通过反射机制利用 <bean> 的 class 属性指定实现类实例化 Bean ,在某些情况下,实例化 Bean 过程比较复杂,如果按照传统的方式,则需要在 <bean> 中提供大量的配置信息。配置方式的灵活性是受限的,这时采用编码的方式可能会得到一个简单的方案。 Spring 为此提供了一个 org.springframework.bean.factory.FactoryBean 的工厂类接口,用户可以通过实现该接口定制实例化 Bean 的逻辑。
FactoryBean接口对于 Spring 框架来说占用重要的地位, Spring 自身就提供了 70 多个 FactoryBean 的实现。它们隐藏了实例化一些复杂 Bean 的细节,给上层应用带来了便利。从 Spring 3.0 开始, FactoryBean 开始支持泛型,即接口声明改为 FactoryBean<T> 的形式:
package org.springframework.beans.factory;
public interface FactoryBean<T> {
T getObject() throws Exception;
Class<?> getObjectType();
boolean isSingleton();
}
在该接口中还定义了以下3 个方法:
T getObject():返回由 FactoryBean 创建的 Bean 实例,如果 isSingleton() 返回 true ,则该实例会放到 Spring 容器中单实例缓存池中;
boolean isSingleton():返回由 FactoryBean 创建的 Bean 实例的作用域是 singleton 还是 prototype ;
Class<T> getObjectType():返回 FactoryBean 创建的 Bean 类型。
当配置文件中<bean> 的 class 属性配置的实现类是 FactoryBean 时,通过 getBean() 方法返回的不是 FactoryBean 本身,而是 FactoryBean#getObject() 方法所返回的对象,相当于 FactoryBean#getObject() 代理了 getBean() 方法。
例:如果使用传统方式配置下面Car 的 <bean> 时, Car 的每个属性分别对应一个 <property> 元素标签。
package com.baobaotao.factorybean;
public class Car {
private int maxSpeed ;
private String brand ;
private double price ;
public int getMaxSpeed () {
return this . maxSpeed ;
}
public void setMaxSpeed ( int maxSpeed ) {
this . maxSpeed = maxSpeed;
}
public String getBrand () {
return this . brand ;
}
public void setBrand ( String brand ) {
this . brand = brand;
}
public double getPrice () {
return this . price ;
}
public void setPrice ( double price ) {
this . price = price;
}
}
如果用FactoryBean 的方式实现就灵活点,下例通过逗号分割符的方式一次性的为 Car 的所有属性指定配置值:
package com.baobaotao.factorybean;
import org.springframework.beans.factory.FactoryBean;
public class CarFactoryBean implements FactoryBean<Car> {
private String carInfo ;
public Car getObject () throws Exception {
Car car = new Car () ;
String [] infos = carInfo .split ( "," ) ;
car.setBrand ( infos [ 0 ]) ;
car.setMaxSpeed ( Integer. valueOf ( infos [ 1 ])) ;
car.setPrice ( Double. valueOf ( infos [ 2 ])) ;
return car;
}
public Class<Car> getObjectType () {
return Car. class ;
}
public boolean isSingleton () {
return false ;
}
public String getCarInfo () {
return this . carInfo ;
}
// 接受逗号分割符设置属性信息
public void setCarInfo ( String carInfo ) {
this . carInfo = carInfo;
}
}
有了这个CarFactoryBean 后,就可以在配置文件中使用下面这种自定义的配置方式配置 Car Bean 了:
<bean id="car" class="com.baobaotao.factorybean.CarFactoryBean"
P:carInfo="法拉利 ,400,2000000"/>
当调用getBean("car") 时, Spring 通过反射机制发现 CarFactoryBean 实现了 FactoryBean 的接口,这时 Spring 容器就调用接口方法 CarFactoryBean#getObject() 方法返回。如果希望获取 CarFactoryBean 的实例,则需要在使用 getBean(beanName) 方法时在 beanName 前显示的加上 "&" 前缀:如 getBean("&car");
3、 区别
BeanFactory是个 Factory ,也就是 IOC 容器或对象工厂, FactoryBean 是个 Bean 。在 Spring 中,所有的 Bean 都是由 BeanFactory( 也就是 IOC 容器 ) 来进行管理的。但对 FactoryBean 而言,这个 Bean 不是简单的 Bean ,而是一个能生产或者修饰对象生成的工厂 Bean, 它的实现与设计模式中的工厂模式和修饰器模式类似。
分享到:
相关推荐
简单了解Spring中BeanFactory与FactoryBean的区别 Spring框架中有两个非常关键的接口:BeanFactory和FactoryBean。虽然它们的名字相似,但它们的作用和实现机制却有很大的不同。 BeanFactory是Spring IoC容器的...
在Spring框架中,BeanFactory和FactoryBean是两个重要的接口,它们各自扮演着不同的角色,但都与Spring容器的管理和创建对象密切相关。 **BeanFactory接口**是Spring容器的基础,它是整个Spring IoC(Inversion of ...
BeanFactory和FactoryBean的区别在于,BeanFactory需要遵循完整的创建流程,而FactoryBean只需要调用getObject()方法来返回具体对象。 Spring源码流程图是了解Spring框架核心组件和Bean生命周期的关键。通过了解...
在学习了书籍Spring5.0后,将自己的理解总结成了ppt,主要包含了IoC 和 DI,AOP,BeanFactory和FactoryBean,事务管理四个方面
在Spring框架中,`FactoryBean`是一个非常重要的接口,它为Spring容器提供了更高级别的抽象,使得我们可以自定义Bean的创建过程。...理解并熟练运用`FactoryBean`,对于提升Spring应用的可扩展性和灵活性具有重要意义。
4. **BeanFactory与FactoryBean的区别**: - **BeanFactory**:是Spring IoC容器的基础接口,负责管理和控制bean的生命周期。而`FactoryBean`是提供bean实例的一种特殊机制。 - **FactoryBean.getObject()**:返回...
5. **Spring框架**:Spring相关的面试题目可能会涵盖BeanFactory和FactoryBean的区别、Spring的IoC和AOP原理、Bean的生命周期管理、事务管理、SpringMVC的工作流程,以及Spring中采用的设计模式等。 6. **网络编程...
Spring框架中的BeanFactory和FactoryBean也使用了工厂模式,它们负责根据配置信息创建并管理Bean对象。 2. **代理模式**:代理模式为其他对象提供一种代理以控制对这个对象的访问。在Struts中,ActionProxy可以视为...
理解这个过程对于深入理解Spring的工作原理和优化应用性能非常重要。在实际开发中,合理利用FactoryBean可以实现更灵活的对象创建,而了解`getBean`的流程则有助于避免不必要的性能开销和潜在的错误。
#### 三、BeanFactory与ApplicationContext的区别 虽然BeanFactory和ApplicationContext都属于Spring的容器,但它们之间存在一定的差异: - **BeanFactory**:这是Spring容器最基本的实现,提供了一种延迟加载的...
理解Spring的IOC容器,尤其是BeanFactory接口,有助于深入探究Spring如何管理对象的生命周期、依赖关系和装配过程。通过源代码阅读,我们可以看到Spring如何优雅地将这些复杂的概念转化为可扩展和灵活的代码,从而更...
工厂模式 - BeanFactory 和 FactoryBean - **BeanFactory**:作为 Spring 的核心接口之一,BeanFactory 是简单工厂模式的一个具体应用。它通过提供`getBean(String name)`方法,允许开发者通过唯一标识符获取相应...
其中有大量一线大厂高频面试问题深度剖析,如MyBatis的Mapper接口底层原理,什么是FactoryBean,什么是BeanFactory?什么是BeanPostProcessor,什么是BeanFactoryPostProcessor?Service中注入的Mapper接口是什么...
源码中,BeanFactory接口包含如`getBean()`方法,用于根据Bean名称获取Bean实例,确保了对FactoryBean的特殊处理。此外,还有其他重载版本的`getBean()`方法,提供类型安全的Bean获取和参数传递功能。 通过学习本...
在Spring框架中,IOC(Inversion of Control,控制反转)是一种设计原则,它将对象的创建和管理职责从...通过深入理解BeanFactory接口和事务处理机制,开发者可以更好地利用Spring框架,提升应用的可扩展性和灵活性。
本文主要探讨Spring整合Mybatis的底层原理和实现步骤,结合鲁班学院公开课笔记,深入理解这一过程。 首先,Dao层是数据访问层,它提供了Service层调用的接口,有时甚至可以作为一个独立的项目。在Spring整合Mybatis...
Spring框架是Java平台的一个开源应用程序框架,它为开发Java应用程序提供了一个全面的编程和配置模型。...无论使用哪种配置方式,理解Spring IoC容器的工作原理都是深入学习和使用Spring框架不可或缺的一部分。
4. **BeanFactory与FactoryBean** - BeanFactory是Spring IoC容器的基础接口,而FactoryBean是创建其他Bean的工厂Bean。 5. **Spring事件** - 应用上下文中发生的事件及其监听机制。 #### 五、多线程 1. **乐观锁...