Spring BeanFactory与FactoryBean的区别

╰半夏微凉° 2023-03-01 13:38 29阅读 0赞

1. BeanFactory

  以Factory结尾,表示它是一个工厂类(接口),用于管理Bean的一个工厂。在Spring中,BeanFactory是IOC容器的核心接口,它的职责包括:实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。

  Spring为我们提供了许多易用的BeanFactory实现比如XmlBeanFactory就是常用的一个,该实现将以XML方式描述组成应用的对象及对象间的依赖关系。

BeanFactory提供的方法及其简单,仅提供了六种方法供客户调用:

  •   boolean containsBean(String beanName) 判断工厂中是否包含给定名称的bean定义,若有则返回true
  •   Object getBean(String) 返回给定名称注册的bean实例。根据bean的配置情况,如果是singleton模式将返回一个共享实例,否则将返回一个新建的实例,如果没有找到指定bean,该方法可能会抛出异常
  •   Object getBean(String, Class) 返回以给定名称注册的bean实例,并转换为给定class类型
  •   Class getType(String name) 返回给定名称的bean的Class,如果没有找到指定的bean实例,则排除NoSuchBeanDefinitionException异常
  •   boolean isSingleton(String) 判断给定名称的bean定义是否为单例模式
  •   String[] getAliases(String name) 返回给定bean名称的所有别名。

2. FactoryBean

  以Bean结尾,表示它是一个Bean,不同于普通Bean的是:它是实现了FactoryBean接口的Bean。FactoryBean接口定义了以下3个接口方法:

  1. Object getObject():返回有FactoryBean创建的Bean实例,如果isSingleton()返回true,则该实例会放到Spring容器的单实例缓存池中。
  2. boolean isSingleton():确定由FactoryBean创建Bean的作用域是singleton还是prototype.
  3. Class getObjectType():返回FactoryBean创建Bean的类型。

    当配置文件中 的class属性配置的实现类是FactoryBean时,通过getBean方法返回的不是FactoryBean本身,而是 FactoryBean.getObject()方法所返回的对象,相当于FactoryBean#getObject()代理了getBean()方法。

如果用户希望获取 FactoryBean的实例,则需要在使用getBean(beanName)方法时显式地在beanName前加上“&”前缀.

一个例子如下:

  1. <bean id="car" class="com.lxm.fb.carFactoryBean">
  2. <property name="carInfo" value=" Benzi"/>
  3. </bean>
  4. import org.springframework.beans.factory.FactoryBean;
  5. public class CarFactoryBean implements FactoryBean{
  6. private String carInfo;
  7. public Stirng getCarInfo() {
  8. return carInfo;
  9. }
  10. public void setCarInfo(String carInfo) {
  11. this.carInfo=carInfo;
  12. }
  13. public Object getObject()throws Exception{
  14. Car car=new Car();
  15. .....
  16. return car;
  17. }
  18. public Class getObjectType(){
  19. return Car.class;
  20. }
  21. public boolean isSingleton() {
  22. return true;
  23. }
  24. }

当调用getBean(“car”)时,Spring通过反射机制发现CarFactoryBean实现了FactoryBean的接口,这时 Sping容器就调用接口方法CarFactoryBean#getObject()返回工厂类创建的对象。如果用户希望获取 CarFactoryBean的实例,则需要在使用getBean(beanName)方法时显式地在beanName前加上“&”前 缀:getBean(“&car”).

发表评论

表情:
评论列表 (有 0 条评论,29人围观)

还没有评论,来说两句吧...

相关阅读