0 0

Spring的BeanFactory与ApplicationContext的getBean方法有什么区别?10

最近做项目,做测试时,无意中遇到了一个问题:分别用BeanFactory和用ApplicationContext的getBean方法获取dataSource,用ApplicationContext获取成功,而用BeanFactory获取则报错

 

public class DataSourceTest {
	
	public static void main(String[] args) {
		ApplicationContext ctx = new ClassPathXmlApplicationContext("resources/spring/applicationContext-hibernate.xml");
		DataSource ds = (DataSource) ctx.getBean("dataSource");
		System.out.println(ds);
                }
}

 输出结果:org.springframework.jdbc.datasource.DriverManagerDataSource@1af33d6

 

public class JdbcTemplateTest {
	static String delimiter = File.separator;
	static String classpath = "resources"+delimiter+"spring"+delimiter+"applicationContext-hibernate.xml";
		
	public static void main(String[] args) {
		BeanFactory factory = new XmlBeanFactory(new ClassPathResource(classpath));
		DataSource ds = (DataSource) factory.getBean("dataSource");
		/**
		 * 以上方法获得DataSource的Bean会报错:说找不到数据库的驱动类
		 * 
		 * */
		System.out.println(ds);

	}
}

 运行报错:

Error creating bean with name 'dataSource' defined in class path resource [resources/spring/applicationContext-hibernate.xml]:

Error setting property values; nested exception is org.springframework.beans.PropertyBatchUpdateException;

nested PropertyAccessExceptions (1) are:
PropertyAccessException 1: org.springframework.beans.MethodInvocationException: Property 'driverClassName' threw exception;

nested exception is org.springframework.jdbc.CannotGetJdbcConnectionException: Could not load JDBC driver class [${jdbc.driverClassName}]; nested exception is java.lang.ClassNotFoundException: ${jdbc.driverClassName}

 

我的配置文件位置如下所示:

resouces包-----
                   |

                   |

               config子包:放数据库配置信息:jdbc.properties文件

               spring子包:放spring的配置文件:applicationContext.xml

两个文件的内容如下:

jdbc.properties文件内容:

 

jdbc.driverClassName=oracle.jdbc.driver.OracleDriver
jdbc.url=jdbc:oracle:thin:@localhost:1521:LOCALDEV
jdbc.username=ccic
jdbc.password=ccic

 

<?xml version="1.0" encoding="UTF-8"?>
<beans
	xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"
	default-autowire="byName">
	<!-- 属性文件读入 -->
	<bean id="propertyConfigurer" 
		class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
		<property name="locations">
			<list>
				<value>classpath:resources/config/jdbc.properties</value>
			</list>
		</property>
	</bean>
	
	<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
		<property name="driverClassName" value="${jdbc.driverClassName}"/>
		<property name="url" value="${jdbc.url}" />
		<property name="username" value="${jdbc.username}" />
		<property name="password" value="${jdbc.password}" />
	</bean>
</beans>

 

问题:同样是读取同一个配置文件,Spring的BeanFactory与ApplicationContext的getBean方法有什么区别?为什么一个行一个不行呢?

我只知道它们两个在延迟加载方面有区别:BeanFactory的getBean是延迟加载,ApplicationContext的getBean是在容器启动时就创建

 

2010年9月21日 15:24

3个答案 按时间排序 按投票排序

0 0

采纳的答案

特性
BeanFactoryApplicationContextBean实例化/装配YesYes自动BeanPostProcessor注册NoYes自动BeanFactoryPostProcessor注册NoYes便捷的MessageSource访问(i18n)NoYesApplicationEvent发送NoYes

ApplicationContext能够自动辨认和应用在其上部署的实现了BeanFactoryPostProcessor的bean
如果要在BeanFactory中使用,bean factory post-processor必须手动运行
BeanFactory factory = new XmlBeanFactory(new ClassPathResource(classpath));
PropertyPlaceholderConfigurer cfg = new PropertyPlaceholderConfigurer();
cfg.setLocation(new ClassPathResource("resources/config/jdbc.properties"));
cfg.postProcessBeanFactory(factory);
DataSource ds = (DataSource) factory.getBean("dataSource");   

2010年9月21日 21:47
0 0

解释清楚明了

2015年7月22日 22:01
0 0

那个,不会用表格标签,表格错位了
特性                            BeanFactory  ApplicationContext
Bean实例化/装配                      Yes          Yes
自动BeanPostProcessor注册          No           Yes
自动BeanFactoryPostProcessor注册  No           Yes
便捷的 MessageSource访问(i18n)    No           Yes
ApplicationEvent发送               No           Yes

2010年9月21日 21:56

相关推荐

    spring 获得applicationcontext公用方法

    这样的设计使得其他类可以方便地通过`MyApplicationContextUtil.getBean()`方法获取所需的Bean,无需直接与`ApplicationContext`交互。 5. 使用`ApplicationContext`的最佳实践: - 尽量减少在业务代码中直接使用...

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

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

    简单模拟Spring的beanFactory

    在实际的Spring框架中,`BeanFactory`接口提供了许多方法,如`getBean()`用于获取bean,`containsBean()`检查是否存在特定bean等。 首先,我们要了解`BeanFactory`的工作流程。这个过程通常包括以下步骤: 1. **...

    Spring的getBean和JdbcTemplate

    `getBean`是Spring容器的核心接口`ApplicationContext`或`BeanFactory`中的一个方法,它允许我们从Spring容器中获取一个已经定义和初始化的Bean。当你在Spring配置文件(XML或Java配置)中声明了一个Bean,Spring会...

    二、Spring源码分析——BeanFactory

    三、BeanFactory与ApplicationContext的区别 虽然BeanFactory是基础,但实际开发中更多使用的是其子类ApplicationContext。ApplicationContext除了具备BeanFactory的所有功能外,还添加了以下特性: 1. **资源加载**...

    Spring getBean流程图1

    1. **开始**:当调用`ApplicationContext`或`BeanFactory`的`getBean`方法时,首先会检查请求的Bean是否已经存在于容器的缓存中。如果存在且参数`args`为null,直接返回缓存中的Bean实例。 2. **...

    Java中Spring获取bean方法小结

    1. **BeanFactory与ApplicationContext** - **BeanFactory** 是Spring中最基础的IoC容器,负责管理和实例化Bean。它允许开发者定义Bean的生命周期和依赖关系,提供了低级别的配置选项。 - **ApplicationContext**...

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

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

    获得spring里注册Bean的四种方法

    获取 Spring 里注册的 Bean 对象可以使用四种方法:继承 BaseDispatchAction、实现 BeanFactoryAware、使用 ApplicationContext、使用 @Autowired。每种方法都有其特点和应用场景,开发者可以根据实际情况选择合适的...

    BeanFactory创建对象.docx

    主要的方法有`getBean(String beanName)`,用于获取指定名称的bean;`containsBean(String beanName)`,用来检查是否包含特定的bean;以及`isSingleton(String beanName)`等,用于确定bean的作用域。 ### 2. Bean的...

    Spring_IOC详解.pdf

    #### BeanFactory与ApplicationContext的区别 - **BeanFactory**:作为Spring的最基本容器,它仅提供最基本的依赖注入功能。BeanFactory在创建Bean时,不会立即初始化所有Bean,而是采用懒加载策略,即在首次调用`...

    spring学习之路(黑马课程笔记)

    Bean的创建主要逻辑和功能都在BeanFactory中,ApplicationContext不仅继承了BeanFactory,而且ApplicationContext内部还维护着BeanFactory的引用。 Bean的作用域 在Spring框架中,Bean的作用域可以通过scope属性来...

    spring 容器.docx

    Spring容器主要有两种接口形式:BeanFactory和ApplicationContext,后者是前者的子接口。这两种接口都是用来表示Spring容器,它们的主要职责是创建Bean实例并管理这些实例。 BeanFactory作为Spring的基础容器接口,...

    spring学习方法

    ### Spring学习方法详解 #### 一、Spring框架概述 Spring框架是一个开源的、设计层面的框架,主要用于解决业务逻辑层与其他层之间的松耦合问题。它通过实现面向接口的编程思想,使得整个系统应用能够更好地组织和...

    Spring源码学习三:BeanFactory解析1

    在Spring框架中,BeanFactory是核心的IoC(Inversion of Control)容器接口,它负责管理和维护Bean的生命周期。BeanFactory提供了对Bean的创建、初始化、销毁等操作的支持,是Spring容器的基础。当我们通过XML、Java...

    spring相关面试题.docx

    4. **BeanFactory与ApplicationContext的区别**: BeanFactory是Spring的基本容器,采用延迟加载策略,只有在调用`getBean`方法时才会初始化Bean。而ApplicationContext不仅包含了BeanFactory的所有功能,还支持...

    中软Spring_PPT

    其中,核心容器是Spring的基础,主要包括BeanFactory和ApplicationContext,它们实现了控制反转(IOC)和依赖注入(DI)。 【控制反转(IOC)和依赖注入(DI)】 控制反转(IOC)是一种设计思想,意味着将对象的...

    Spring中BeanFactory解析bean详解

    当调用BeanFactory的getBean方法时,如`factory.getBean("testBean")`,DefaultListableBeanFactory首先会根据传入的bean名称查找BeanDefinition,然后根据BeanDefinition中的信息来实例化bean。如果bean是单例...

    Spring IOC容器实现分析

    #### 三、BeanFactory与ApplicationContext的区别 虽然BeanFactory和ApplicationContext都属于Spring的容器,但它们之间存在一定的差异: - **BeanFactory**:这是Spring容器最基本的实现,提供了一种延迟加载的...

    基于java的企业级应用开发:Spring的核心容器.ppt

    创建ApplicationContext实例有两种常见的方法: 1. 使用`ClassPathXmlApplicationContext`,它会从类路径中查找配置文件,如`"classpath:spring/applicationContext.xml"`。 2. 使用`...

Global site tag (gtag.js) - Google Analytics