今天在看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 + "'");
}
}
}
分享到:
相关推荐
通过模拟`BeanFactory`,我们可以加深对Spring如何管理对象生命周期和依赖关系的理解。这对于日常开发和优化Spring应用非常有帮助,尤其是在解决依赖问题或自定义bean处理逻辑时。同时,了解这些基础知识也为理解和...
Spring的BeanFactory的接口的中文解释
简单了解Spring中BeanFactory与FactoryBean的区别 Spring框架中有两个非常关键的接口:BeanFactory和FactoryBean。虽然它们的名字相似,但它们的作用和实现机制却有很大的不同。 BeanFactory是Spring IoC容器的...
了解`BeanFactory`及其相关接口的功能对于掌握Spring的核心原理至关重要。 #### 二、`BeanFactory`接口的关键功能点详解 ##### 1. `void registerScope(String scopeName, Scope scope);` - **功能**: 此方法用于...
spring之beanfactory 的一些基本知识与其关系使用
在Spring框架中,BeanFactory和ApplicationContext是两种不同的bean容器,它们各自有其特性和应用场景,理解二者的区别对于深入掌握Spring框架至关重要。 首先,BeanFactory是Spring中最基本的bean容器,它提供了对...
《Spring源码分析——BeanFactory》 ...理解并熟练运用BeanFactory及其相关概念,对于深入学习Spring框架至关重要。通过不断实践和研究源码,我们可以更深入地理解Spring的工作原理,从而更好地利用这个强大的工具。
在Spring框架中,ApplicationContext和BeanFactory是两种不同的bean容器,它们各自有其特性和应用场景,理解二者的区别对于深入学习和使用Spring至关重要。 首先,BeanFactory是Spring中最基础的bean管理容器,它...
在Spring框架中,BeanFactory是核心的容器,它负责管理和装配应用中的对象,即bean。当我们谈论“Spring中的BeanFactory解析XML文件”时,我们实际上是在讨论如何通过XML配置文件来定义、创建和管理bean。这篇文章将...
理解BeanFactory的工作原理和功能对于掌握Spring的IoC机制至关重要。通过配置元数据,我们可以控制bean的实例化、初始化、作用域等多个方面,实现灵活的依赖注入和组件装配。在实际开发中,通常会结合使用...
在Spring框架中,BeanFactory和FactoryBean是两个重要的接口,它们各自扮演着不同的角色,但都与Spring容器的管理和创建对象密切相关。 **BeanFactory接口**是Spring容器的基础,它是整个Spring IoC(Inversion of ...
在上面的代码中,我们首先创建了一个 `FileSystemXmlApplicationContext` 对象,指向了文件系统中的 `beans.xml` 文件,然后将其转换为一个 BeanFactory 对象。 Spring 3 中提供了三种实例化 BeanFactory 的方法,...
BeanFactory 是 Spring 框架中的一个核心接口,用于管理应用程序中的对象(也称为 bean)。它提供了一种将应用程序组件(如服务、数据源、控制器等)解耦并配置到应用程序中的方式。 总的来说,可以初步理解...
Spring IoC提供了BeanFactory和ApplicationContext两种容器类型,其中BeanFactory是基础的IoC容器,而ApplicationContext则提供了更多高级功能,如资源加载、事件发布等。 Spring IoC的配置主要通过XML或注解的方式...
在Spring中,ApplicationContext(应用程序上下文)是容器的核心,负责配置和管理应用中对象的生命周期和依赖关系。在实际开发过程中,经常需要从各个角落获取到这个ApplicationContext对象,以便于能够使用Spring...
总结起来,Spring的IoC容器是通过BeanFactory和ApplicationContext来实现对象的管理和服务的。BeanFactory作为基础容器,强调轻量级和延迟初始化,适合资源有限的环境;而ApplicationContext则提供了更全面的功能,...
在Java中,BeanFactory是Spring框架中的一个核心组件,用于管理和创建对象。通过使用BeanFactory,可以将对象的创建和依赖注入解耦,提高代码的可维护性和灵活性。 在本文中,我们将详细介绍如何使用BeanFactory来...
在Spring框架中,BeanFactory是核心的IoC(Inversion of Control)容器接口,它负责管理和维护Bean的生命周期。BeanFactory提供了对Bean的创建、...但了解BeanFactory的底层机制对于深入理解Spring的工作原理至关重要。
提供Spring框架的基本功能,其主要组件是BeanFactory,是工厂模式的实现。 Spring 上下文。向Spring 框架提供上下文信息,包括企业服务,如 JNDI、EJB、电子邮件、国际化、校验和调度等。 Spring AOP。通过配置管理...