spring beanFactory

1.什么叫beanfactory?

spring使用BeanFactory来实例化、配置和管理对象,但是它只是一个接口,里面有一个getBean()方法。我们一般都不直接用BeanFactory,而是用它的实现类ApplicationContext,这个类会自动解析我们配置的applicationContext.xml,然后根据我们配置的bean来new对象,将new好的对象放进一个Map中,键就是我们bean的id,值就是new的对象。

原文参考http://www.cnblogs.com/liuling/archive/2013/04/14/BeanFactory.html

2.什么叫ApplicationContext?

答:实用的Bean工厂ApplicationContext,继承BeanFactory接口

在ApplicationContext接口的众多实现类中,有3个是我们经常用到的(见表1-1),并且使用这3个实现类也基本能满足我们Java EE应用开发中的绝大部分需求。

表1-1 ApplicationContext接口的常用实现类介绍


类 名 称

功 能 描 述

ClassPathXmlApplicationContext

从类路径ClassPath中寻找指定的XML配置文件,找到并装载

完成ApplicationContext的实例化工作。例如:

//装载单个配置文件实例化ApplicationContext容器

ApplicationContext cxt = new ClassPathXmlApplicationContext

("applicationContext.xml");

//装载多个配置文件实例化ApplicationContext容器

String[] configs = {"bean1.xml","bean2.xml","bean3.xml"};

ApplicationContext cxt = new ClassPathXmlApplicationContext(configs);


FileSystemXmlApplicationContext

从指定的文件系统路径中寻找指定的XML配置文件,找到并装载

完成ApplicationContext的实例化工作。例如:

//装载单个配置文件实例化ApplicationContext容器

ApplicationContext cxt = new FileSystemXMLApplicationContext

("beans.xml");

//装载多个配置文件实例化ApplicationContext容器

String[] configs = {"c:/beans1.xml","c:/beans2.xml"};

ApplicationContext cxt = new FileSystemXmlApplicationContext(configs);


XmlWebApplicationContext

从Web应用中的寻找指定的XML配置文件,找到并装载完成ApplicationContext的实例化工作。这是为Web工程量身定制的,使用WebApplicationContextUtils类的getRequiredWebApplicationContext方法可在JSP与Servlet中取得IoC容器的引用

3.applicationContext与beanFactory的不同?

与BeanFactory不同的是,ApplicationContext容器实例化后会自动对所有的单实例Bean进行实例化与依赖关系的装配,使之处于待用状态。而BeanFactory容器实例化后并不会自动实例化Bean,只有当Bean被使用时BeanFactory容器才会对该Bean进行实例化与依赖关系的装配。

在Java项目中通过ClassPathXmlApplicationContext类手动实例化ApplicationContext容器通常是不二之选。但对于Web项目就不行了,Web项目的启动是由相应的Web服务器负责的,因此,在Web项目中ApplicationContext容器的实例化工作最好交给Web服务器来完成。

4.在web项目中,怎样实例化applicationContext?

答:

Spring为此提供了两种解决方案,一种是基于ContextLoaderListener实现的(此方案只适用于Servlet2.4及以上规范的Servlet容器)。例如,在web.xml中加入如下代码:

<!-- 指定Spring的配置文件,多个配置文件以逗号分隔 -->

<context-param>

<param-name>contextConfigLocation</param-name>

<param-value>classpath:spring-config/applicationContext.xml</param-value>

</context-param>

<!-- 指定以Listener方式启动Spring容器 -->

<listener>

<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

</listener>

另外一种方案则是基于ContextLoaderServlet实现的。例如,在web.xml中加入如下代码:

<!-- 指定Spring的配置文件,多个配置文件以逗号分隔 -->

<context-param>

<param-name>contextConfigLocation</param-name>

<param-value>classpath:spring-config/applicationContext.xml</param-value>

</context-param>

<!-- 指定以Servlet方式启动Spring容器 -->

<servlet>

<servlet-name>context</servlet-name>

<servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class>

<load-on-startup>1</load-on-startup>

</servlet>

从servlet容器启动时加载组件的顺序来看,Listener组件是优先于Servlet组件的。基于Servlet方式的加载方案主要是为了兼容Servlet2.3及以下规范的Servlet容器。以Tomcat为例,Tomcat 5.x都已经支持Servlet2.4规范了,因此,基于Listener方式启动Spring容器是目前的主流选择。

5.web开发选择哪种方式实例化applicationConntext比较好?

答:从servlet容器启动时加载组件的顺序来看,Listener组件是优先于Servlet组件的。因此,基于Listener方式启动Spring容器是目前的主流选择。

本文主要参考:http://baike.baidu.com/link?url=Ll-tgSO20TwrB6sm7Eu9RKtaZuxb-hwazwqg-53kwlkPynRPwdF27bX6kOgEzq6vHiXv8dwj7xqRw9v0IsSKINnn__SFKp_XOcsvWPYvuqy

6.spring的上下文和spring mvc的上下文和web应用的上下文之间有什么关系?

答:

要想很好理解这三个上下文的关系,需要先熟悉spring是怎样在web容器中启动起来的。spring的启动过程其实就是其IoC容器的启动过程,对于web程序,IoC容器启动过程即是建立上下文的过程。

spring的启动过程:

  1. 首先,对于一个web应用,其部署在web容器中,web容器提供其一个全局的上下文环境,这个上下文就是ServletContext,其为后面的spring IoC容器提供宿主环境;
  2. 其次,在web.xml中会提供有contextLoaderListener。在web容器启动时,会触发容器初始化事件,此时contextLoaderListener会监听到这个事件,其contextInitialized方法会被调用,在这个方法中,spring会初始化一个启动上下文,这个上下文被称为根上下文,即WebApplicationContext,这是一个接口类,确切的说,其实际的实现类是XmlWebApplicationContext。这个就是spring的IoC容器,其对应的Bean定义的配置由web.xml中的context-param标签指定。在这个IoC容器初始化完毕后,spring以WebApplicationContext.ROOTWEBAPPLICATIONCONTEXTATTRIBUTE为属性Key,将其存储到ServletContext中,便于获取;
  3. 再次,contextLoaderListener监听器初始化完毕后,开始初始化web.xml中配置的Servlet,这个servlet可以配置多个,以最常见的DispatcherServlet为例,这个servlet实际上是一个标准的前端控制器,用以转发、匹配、处理每个servlet请求。DispatcherServlet上下文在初始化的时候会建立自己的IoC上下文,用以持有spring mvc相关的bean。在建立DispatcherServlet自己的IoC上下文时,会利用WebApplicationContext.ROOTWEBAPPLICATIONCONTEXTATTRIBUTE先从ServletContext中获取之前的根上下文(即WebApplicationContext)作为自己上下文的parent上下文。有了这个parent上下文之后,再初始化自己持有的上下文。这个DispatcherServlet初始化自己上下文的工作在其initStrategies方法中可以看到,大概的工作就是初始化处理器映射、视图解析等。这个servlet自己持有的上下文默认实现类也是mlWebApplicationContext。初始化完毕后,spring以与servlet的名字相关(此处不是简单的以servlet名为Key,而是通过一些转换,具体可自行查看源码)的属性为属性Key,也将其存到ServletContext中,以便后续使用。这样每个servlet就持有自己的上下文,即拥有自己独立的bean空间,同时各个servlet共享相同的bean,即根上下文(第2步中初始化的上下文)定义的那些bean。

说完了spring上下文的初始化过程,这三个上下文的关系应该就了解了。如还是不太清楚,我就爱莫能助了,只能自行看代码去了。

转自https://segmentfault.com/q/1010000000210417 感谢作者

时间: 2024-10-11 03:55:25

spring beanFactory的相关文章

攻城狮在路上(贰) Spring(四)--- Spring BeanFactory简介

BeanFactory时Spring框架最核心的接口,它提供了高级IoC的配置机制,使管理不同类型的Java对象成为了可能.我们一般称BeanFactory为IoC容器.BeanFactory是Spring的基础设施,面向Spring本身. 一.BeanFactory的体系结构: 二.类图说明: ListableBeanFactory:定义了访问容器中Bean基本信息的方法,查看Bean的个数.获取某一类型Bean的配置名,看容器中是否包含某一Bean等方法. HierarchicalBeanF

bean创建过程、spring BeanFactory的实现、spring aware

Bean的创建过程: Spring beanFactory的工厂模式实现: 解析<bean>标签,存到一个Map<String, Object> beans中 People o = (People)factory.getBean("p"); 因为map存的是object类型,所以取出时需要强制类型转换 Bean的生命周期: spring aware的目的是为了让Bean获得spring容器的服务,bean继承applicationContextAware可以获得

Spring BeanFactory 中的类型推断

Spring BeanFactory 中的类型推断 Spring 系列目录(https://www.cnblogs.com/binarylei/p/10117436.html) Spring 容器中可以根据 beanName 查找其类型,其推断方式和 bean 的创建方式密切相关,并且 Spring 中有一个原则是尽可能的不要通过创建 bean 来获取其类型,除了 FactoryBean 只有通过创建对象调用其 getObjectType 方法,但也只是部分的创建该 FactoryBean(所谓

Spring BeanFactory 依赖注入

Spring BeanFactory 依赖注入 Spring 系列目录(https://www.cnblogs.com/binarylei/p/10117436.html) 一.autowire 五种注入方式测试 (1) 环境准备 public class Company { private Department department; private List<Employee> employees; public Company() { } public Company(Departmen

spring BeanFactory和ApplicationContext详解

1.BeanFactory是spring的核心,有以下几种: 2.详解: 3.例子:获取资源-->启动ioc容器-->第一次调用时初始化类,对于单例类会存储备下次调用. 版权声明:本文为博主原创文章,未经博主允许不得转载.

spring BeanFactory 与ApplicationContext

Spring 的IOC容器就是一个实现了BeanFactory的接口,通过工厂模式来获取对应的Bean对象的引用: BeanFactory的子接口有: ApplicationContext,AutowireCapableBeanFactory,ConfigurablePortleApplication等,其中最为常用的为ApplicationContext: ApplicationContext接口的实现类有FileSystemXMLApplicationContext.ClassPathXML

Spring BeanFactory源码学习

一.BeanFactory BeanFactory是Spring IOC容器的基础,是IOC容器的基础接口,所有的容器都是从它这里继承实现而来.BeanFactory提供了最基本的IOC容器的功能,即所有的容器至少需要实现的标准.BeanFactory体系结构是典型的工厂方法模式,即什么样的工厂生产什么样的产品.BeanFactory是最基本的抽象工厂,而其他的IOC容器只不过是具体的工厂,对应着各自的Bean定义方法.但同时,其他容器也针对具体场景不同,进行了扩充,提供具体的服务. 二.Bea

spring BeanFactory概述

BeanFactory是Spring提供的两种容器类型之一,它是基础的IoC容器,并提供完整的IoC服务支持.如果没有指定,默认采用延迟初始化策略.只有当客户端对象需要访问容器中的某个受管对象的时候,才对该受管对象进行初始化以及依赖注入操作.所以相对来说,容器启动初期速度较快,所需要的资源有限.对于资源有限,而且功能要求不是很严格的场景,BeanFactory是比较合适的IoC容器选择.

Spring BeanFactory与FactoryBean的区别及其各自的详细介绍于用法

1. BeanFactory BeanFactory,以Factory结尾,表示它是一个工厂类(接口),用于管理Bean的一个工厂.在Spring中,BeanFactory是IOC容器的核心接口,它的职责包括:实例化.定位.配置应用程序中的对象及建立这些对象间的依赖. Spring为我们提供了许多易用的BeanFactory实现,XmlBeanFactory就是常用的一个,该实现将以XML方式描述组成应用的对象及对象间的依赖关系.XmlBeanFactory类将持有此XML配置元数据,并用它来构