-
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个答案 按时间排序 按投票排序
-
采纳的答案
特性
BeanFactory ApplicationContextBean实例化/装配 Yes Yes自动BeanPostProcessor注册 No Yes自动BeanFactoryPostProcessor注册 No Yes便捷的MessageSource访问(i18n) No YesApplicationEvent发送 No Yes
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
-
那个,不会用表格标签,表格错位了
特性 BeanFactory ApplicationContext
Bean实例化/装配 Yes Yes
自动BeanPostProcessor注册 No Yes
自动BeanFactoryPostProcessor注册 No Yes
便捷的 MessageSource访问(i18n) No Yes
ApplicationEvent发送 No Yes2010年9月21日 21:56
相关推荐
这样的设计使得其他类可以方便地通过`MyApplicationContextUtil.getBean()`方法获取所需的Bean,无需直接与`ApplicationContext`交互。 5. 使用`ApplicationContext`的最佳实践: - 尽量减少在业务代码中直接使用...
简单了解Spring中BeanFactory与FactoryBean的区别 Spring框架中有两个非常关键的接口:BeanFactory和FactoryBean。虽然它们的名字相似,但它们的作用和实现机制却有很大的不同。 BeanFactory是Spring IoC容器的...
在实际的Spring框架中,`BeanFactory`接口提供了许多方法,如`getBean()`用于获取bean,`containsBean()`检查是否存在特定bean等。 首先,我们要了解`BeanFactory`的工作流程。这个过程通常包括以下步骤: 1. **...
`getBean`是Spring容器的核心接口`ApplicationContext`或`BeanFactory`中的一个方法,它允许我们从Spring容器中获取一个已经定义和初始化的Bean。当你在Spring配置文件(XML或Java配置)中声明了一个Bean,Spring会...
三、BeanFactory与ApplicationContext的区别 虽然BeanFactory是基础,但实际开发中更多使用的是其子类ApplicationContext。ApplicationContext除了具备BeanFactory的所有功能外,还添加了以下特性: 1. **资源加载**...
1. **开始**:当调用`ApplicationContext`或`BeanFactory`的`getBean`方法时,首先会检查请求的Bean是否已经存在于容器的缓存中。如果存在且参数`args`为null,直接返回缓存中的Bean实例。 2. **...
1. **BeanFactory与ApplicationContext** - **BeanFactory** 是Spring中最基础的IoC容器,负责管理和实例化Bean。它允许开发者定义Bean的生命周期和依赖关系,提供了低级别的配置选项。 - **ApplicationContext**...
在Spring框架中,BeanFactory和FactoryBean是两个重要的接口,它们各自扮演着不同的角色,但都与Spring容器的管理和创建对象密切相关。 **BeanFactory接口**是Spring容器的基础,它是整个Spring IoC(Inversion of ...
获取 Spring 里注册的 Bean 对象可以使用四种方法:继承 BaseDispatchAction、实现 BeanFactoryAware、使用 ApplicationContext、使用 @Autowired。每种方法都有其特点和应用场景,开发者可以根据实际情况选择合适的...
主要的方法有`getBean(String beanName)`,用于获取指定名称的bean;`containsBean(String beanName)`,用来检查是否包含特定的bean;以及`isSingleton(String beanName)`等,用于确定bean的作用域。 ### 2. Bean的...
#### BeanFactory与ApplicationContext的区别 - **BeanFactory**:作为Spring的最基本容器,它仅提供最基本的依赖注入功能。BeanFactory在创建Bean时,不会立即初始化所有Bean,而是采用懒加载策略,即在首次调用`...
Bean的创建主要逻辑和功能都在BeanFactory中,ApplicationContext不仅继承了BeanFactory,而且ApplicationContext内部还维护着BeanFactory的引用。 Bean的作用域 在Spring框架中,Bean的作用域可以通过scope属性来...
Spring容器主要有两种接口形式:BeanFactory和ApplicationContext,后者是前者的子接口。这两种接口都是用来表示Spring容器,它们的主要职责是创建Bean实例并管理这些实例。 BeanFactory作为Spring的基础容器接口,...
### Spring学习方法详解 #### 一、Spring框架概述 Spring框架是一个开源的、设计层面的框架,主要用于解决业务逻辑层与其他层之间的松耦合问题。它通过实现面向接口的编程思想,使得整个系统应用能够更好地组织和...
在Spring框架中,BeanFactory是核心的IoC(Inversion of Control)容器接口,它负责管理和维护Bean的生命周期。BeanFactory提供了对Bean的创建、初始化、销毁等操作的支持,是Spring容器的基础。当我们通过XML、Java...
4. **BeanFactory与ApplicationContext的区别**: BeanFactory是Spring的基本容器,采用延迟加载策略,只有在调用`getBean`方法时才会初始化Bean。而ApplicationContext不仅包含了BeanFactory的所有功能,还支持...
其中,核心容器是Spring的基础,主要包括BeanFactory和ApplicationContext,它们实现了控制反转(IOC)和依赖注入(DI)。 【控制反转(IOC)和依赖注入(DI)】 控制反转(IOC)是一种设计思想,意味着将对象的...
当调用BeanFactory的getBean方法时,如`factory.getBean("testBean")`,DefaultListableBeanFactory首先会根据传入的bean名称查找BeanDefinition,然后根据BeanDefinition中的信息来实例化bean。如果bean是单例...
#### 三、BeanFactory与ApplicationContext的区别 虽然BeanFactory和ApplicationContext都属于Spring的容器,但它们之间存在一定的差异: - **BeanFactory**:这是Spring容器最基本的实现,提供了一种延迟加载的...
创建ApplicationContext实例有两种常见的方法: 1. 使用`ClassPathXmlApplicationContext`,它会从类路径中查找配置文件,如`"classpath:spring/applicationContext.xml"`。 2. 使用`...