`

spring对于BeanFactory取得对象

阅读更多
今天在看spring与hibernate的代码,发现了一个地方非常难理解,就是我以前搭建的一个spring+hibernate的代码中在DAO中注入HibernateDaoSupport中注入的是的spring的LocalSessionFactoryBean,而属性确实hibernate的SessionFactory,考虑不通,按照正常的思路应该是要保ClassCaseException的,于是查询了一下spring refreence,发现了一句话的描述:
“This may be done by prepending the bean id with & when calling the getBean method of BeanFactory(including ApplicationContext). So for a given FactoryBean with an id myBean, invoking getBean("myBean")on the BeanFactory will return the product of the FactoryBean, but invoking getBean("&myBean") will returnthe FactoryBean instance itself”

这句话表明了事情的原委,如果是factorybean的话,他会取得他的方法的产品,所以诸如的是HibernateDaoSupport的产品,就是getSessionFactory的返回值。一个细小的地方,造成误会。
spring处理此处的地方代码如下,可以解释spring如何进行的数据处理

//仔细察看spring的注释
// Now we have the bean instance, which may be a normal bean or a FactoryBean.
  // If it's a FactoryBean, we use it to create a bean instance, unless the
  // caller actually wants a reference to the factory.
  if (beanInstance instanceof FactoryBean) {
   if (!isFactoryDereference(name)) {
    // Return bean instance from factory.
    FactoryBean factory = (FactoryBean) beanInstance;
    if (logger.isDebugEnabled()) {
     logger.debug("Bean with name '" + beanName + "' is a factory bean");
    }
    try {
     beanInstance = factory.getObject();
    }
    catch (Exception ex) {
     throw new BeanCreationException(beanName, "FactoryBean threw exception on object creation", ex);
    }
    if (beanInstance == null) {
     throw new FactoryBeanNotInitializedException(
         beanName, "FactoryBean returned null object: " +
       "probably not fully initialized (maybe due to circular bean reference)");
    }
   }
   else {
     // The user wants the factory itself.
    if (logger.isDebugEnabled()) {
     logger.debug("Calling code asked for FactoryBean instance for name '" + beanName + "'");
    }
   }
  }

 

分享到:
评论
1 楼 dwangel 2008-02-23  
如果该 id所引用的bean是FactoryBean实例,则检查是否使用了&,
如果没有则调用FactoryBean的getObject方法来取得产品。

相关推荐

    简单模拟Spring的beanFactory

    通过模拟`BeanFactory`,我们可以加深对Spring如何管理对象生命周期和依赖关系的理解。这对于日常开发和优化Spring应用非常有帮助,尤其是在解决依赖问题或自定义bean处理逻辑时。同时,了解这些基础知识也为理解和...

    Spring的BeanFactory的接口源码中文解释

    Spring的BeanFactory的接口的中文解释

    简单了解Spring中BeanFactory与FactoryBean的区别

    简单了解Spring中BeanFactory与FactoryBean的区别 Spring框架中有两个非常关键的接口:BeanFactory和FactoryBean。虽然它们的名字相似,但它们的作用和实现机制却有很大的不同。 BeanFactory是Spring IoC容器的...

    Spring的BeanFactory的接口注解

    了解`BeanFactory`及其相关接口的功能对于掌握Spring的核心原理至关重要。 #### 二、`BeanFactory`接口的关键功能点详解 ##### 1. `void registerScope(String scopeName, Scope scope);` - **功能**: 此方法用于...

    spring之beanfactory

    spring之beanfactory 的一些基本知识与其关系使用

    day38 05-Spring的BeanFactory与ApplicationContext区别

    在Spring框架中,BeanFactory和ApplicationContext是两种不同的bean容器,它们各自有其特性和应用场景,理解二者的区别对于深入掌握Spring框架至关重要。 首先,BeanFactory是Spring中最基本的bean容器,它提供了对...

    二、Spring源码分析——BeanFactory

    《Spring源码分析——BeanFactory》 ...理解并熟练运用BeanFactory及其相关概念,对于深入学习Spring框架至关重要。通过不断实践和研究源码,我们可以更深入地理解Spring的工作原理,从而更好地利用这个强大的工具。

    Spring中ApplicationContext和beanfactory区别.rar

    在Spring框架中,ApplicationContext和BeanFactory是两种不同的bean容器,它们各自有其特性和应用场景,理解二者的区别对于深入学习和使用Spring至关重要。 首先,BeanFactory是Spring中最基础的bean管理容器,它...

    spring中的BeanFactory解析xml文件

    在Spring框架中,BeanFactory是核心的容器,它负责管理和装配应用中的对象,即bean。当我们谈论“Spring中的BeanFactory解析XML文件”时,我们实际上是在讨论如何通过XML配置文件来定义、创建和管理bean。这篇文章将...

    BeanFactory创建对象.docx

    理解BeanFactory的工作原理和功能对于掌握Spring的IoC机制至关重要。通过配置元数据,我们可以控制bean的实例化、初始化、作用域等多个方面,实现灵活的依赖注入和组件装配。在实际开发中,通常会结合使用...

    Spring中BeanFactory与FactoryBean接口的区别详解

    在Spring框架中,BeanFactory和FactoryBean是两个重要的接口,它们各自扮演着不同的角色,但都与Spring容器的管理和创建对象密切相关。 **BeanFactory接口**是Spring容器的基础,它是整个Spring IoC(Inversion of ...

    BeanFactory的实例化

    在上面的代码中,我们首先创建了一个 `FileSystemXmlApplicationContext` 对象,指向了文件系统中的 `beans.xml` 文件,然后将其转换为一个 BeanFactory 对象。 Spring 3 中提供了三种实例化 BeanFactory 的方法,...

    BeanFactory内部解析:Spring框架的心脏如何运作

    BeanFactory 是 Spring 框架中的一个核心接口,用于管理应用程序中的对象(也称为 bean)。它提供了一种将应用程序组件(如服务、数据源、控制器等)解耦并配置到应用程序中的方式。 总的来说,可以初步理解...

    Spring IOC:找对象的一次革命(1)

    Spring IoC提供了BeanFactory和ApplicationContext两种容器类型,其中BeanFactory是基础的IoC容器,而ApplicationContext则提供了更多高级功能,如资源加载、事件发布等。 Spring IoC的配置主要通过XML或注解的方式...

    Spring获取ApplicationContext对象工具类的实现方法

    在Spring中,ApplicationContext(应用程序上下文)是容器的核心,负责配置和管理应用中对象的生命周期和依赖关系。在实际开发过程中,经常需要从各个角落获取到这个ApplicationContext对象,以便于能够使用Spring...

    Spring的IoC容器之BeanFactory[定义].pdf

    总结起来,Spring的IoC容器是通过BeanFactory和ApplicationContext来实现对象的管理和服务的。BeanFactory作为基础容器,强调轻量级和延迟初始化,适合资源有限的环境;而ApplicationContext则提供了更全面的功能,...

    使用BeanFactory实现创建对象

    在Java中,BeanFactory是Spring框架中的一个核心组件,用于管理和创建对象。通过使用BeanFactory,可以将对象的创建和依赖注入解耦,提高代码的可维护性和灵活性。 在本文中,我们将详细介绍如何使用BeanFactory来...

    Spring源码学习三:BeanFactory解析1

    在Spring框架中,BeanFactory是核心的IoC(Inversion of Control)容器接口,它负责管理和维护Bean的生命周期。BeanFactory提供了对Bean的创建、...但了解BeanFactory的底层机制对于深入理解Spring的工作原理至关重要。

    Spring框架.ppt

    提供Spring框架的基本功能,其主要组件是BeanFactory,是工厂模式的实现。 Spring 上下文。向Spring 框架提供上下文信息,包括企业服务,如 JNDI、EJB、电子邮件、国际化、校验和调度等。 Spring AOP。通过配置管理...

Global site tag (gtag.js) - Google Analytics