【Spring】 Spring的核心容器

Spring的核心容器

简单记录 - Java EE企业级应用开发教程(Spring+Spring MVC+MyBatis)- Spring的基本应用

Spring是作为一个容器存在的,应用中的所有组件都处于Spring的管理之下,都被Spring以Bean的方式管理。

Spring负责创建Bean的实例,并管理其生命周期。

Spring框架的主要功能是通过其核心容器来实现的。

Spring有两个核心接口.分别为BeanFactory和ApplicationContext。

其中ApplicationContext是BeanFactory的子接口,它们都可代表Spring容器。也就是说Spring框架提供了两种核心容器,BeanFactory和ApplicationContext。

那容器是用来干什么的?Spring容器是生成Bean的工厂,所有的组件都被当成Bean处理,例如数据源、Hibernate的SessionFactory、事务管理器等。Bean是Spring容器的基本单位。

Spring核心容器是由什么组成的?Spring的核心容器由Beans、Core、Context、SpEL等模块组成。所有Spring的其他模块都是建立在Core Container基础模块上的。该模块规定了创建和维护Bean的方式,提供了控制反转(IoC)和依赖注入(DI)等特性。

BeanFactory

Spring很少直接使用BeanFactory作为容器,因为在企业级的应用中大多数都会使用的是ApplicationContext,知道BeanFactory就行。

BeanFactory由org.springframework.beans.facytory.BeanFactory接口定义,是基础类型的IoC容器(IoC控制反转),它提供了完整的IoC服务支持。简单来说,BeanFactory就是一个管理Bean的工厂,它主要负责初始化各种Bean,并调用它们的生命周期方法。

BeanFactory接口提供了几个实现类,其中最常用的是org.springframework.beans. factory.xml.XmlBeanFactory,该类会根据XML配置文件中的定义来装配Bean。

创建BeanFactory实例时,需要提供Spring所管理容器的详细配置信息,这些信息通常采用XML文件形式来管理,其加载配置信息的语法如下。

BeanFactory beanFactory = new XmlBeanFactory(new FileSystemResource("D:/applicationContext.xml"));

D:/applicationContext.xml 是XML配置文件的位置

这种加载方式在实际开发中并不多用,知道就行。

ApplicationContext

ApplicationContext是BeanFactory的子接口,也被称为应用上下文,是另一种常用的Spring核心容器。它由org.springframework.context. ApplicationContext接口定义,不仅包含了BeanFactory的所有功能,还添加了对国际化、资源访问、事件传播等方面的支持。

ApplicationContext和BeanFacotry两者都是用于加载Bean的,但是相比之下,Application Context提供了更多的扩展功能,简单一点说:ApplicationContext包含BeanFactory的所有功能。通常建议比BeanFactory优先,除非在一些限制的场合,比如字节长度对内存有很大的影响时(Applet)。绝大多数企业应用和系统,都是使用ApplicationContext的。

创建ApplicationContext接口实例,通常采用两种方法,具体如下。

1.通过ClassPathXmlApplicationContext创建

ClassPathXmlApplicationContext会从类路径classPath中寻找指定的XML配置文件,找到并装载完成ApplicationContext的实例化工作,其使用语法如下。

//初始化spring容器,加载配置文件
		ApplicationContext applicationContext = 
             new ClassPathXmlApplicationContext(String configLocation);
//初始化spring容器,加载配置文件
		ApplicationContext applicationContext = 
             new ClassPathXmlApplicationContext("applicationContext.xml");

上述代码中,configLocation参数用于指定Spring配置文件的名称和位置。如果其值为“applicationContext.xml”,则Spring会去类路径中查找名称为applicationContext.xml的配置文件。

就是 ClassPathXmlApplicationContext会从类路径classPath中寻找指定的XML配置文件,找到并装载完成ApplicationContext的实例化工作。

2.通过FileSystemXmlApplicationContext创建

FileSystemXmlApplicationContext会从指定的文件系统路径(绝对路径)中寻找指定的XML配置文件,找到并装载完成ApplicationContext的实例化工作,其使用语法如下。

初始化spring容器,加载配置文件
		ApplicationContext applicationContext = 
             new FileSystemXmlApplicationContext(String configLocation);
初始化spring容器,加载配置文件
		ApplicationContext applicationContext = 
             new FileSystemXmlApplicationContext("applicationContext.xml");

与ClassPathXmlApplicationContext有所不同的是,在读取Spring的配置文件时,FileSystemXmlApplicationContext不再从类路径中读取配置文件,而是通过参数指定配置文件的位置,例如“D:/workspaces/applicationContext.xml”。如果在参数中写的不是绝对路径,那么方法调用的时候,会默认用绝对路径来找。

就是 FileSystemXmlApplicationContext会从指定的文件系统路径(绝对路径)中寻找指定的XML配置文件,找到并装载完成ApplicationContext的实例化工作。

这种采用绝对路径的方式,会导致程序的灵活性变差,所以这个方法一般不推荐使用。

在使用Spring框架时,可以通过实例化其中任何一个类来创建ApplicationContext容器。

通常在Java项目中,会采用通过ClassPathXmlApplicationContext类来实例化ApplicationContext容器的方式,而在Web项目中,ApplicationContext容器的实例化工作会交由Web服务器来完成。Web服务器实例化ApplicationContext容器时,通常会使用基于ContextLoaderListener实现的方式,此种方式只需要在web.xml中添加如下代码。

       <context-param>
               <param-name>contextConfigLocation</param-name> 
               <param-value>
                          classpath:spring/applicationContext.xml
               </param-value>
       </context-param> 
       <listener>
               <listener-class>
                         org.springframework.web.context.ContextLoaderListener
               </listener-class>
       </listener>

在这里插入图片描述

三大框架整合以及项目时,将采用基于ContextLoaderListener的方式由Web服务器实例化ApplicationContext容器。

创建Spring容器后,就可以获取Spring容器中的Bean。Spring获取Bean的实例通常采用以下两种方法。

  • Object getBean(String name):

    根据容器中Bean的id或name来获取指定的Bean,获取之后需要进行强制类型转换。

  • T getBean(Class requiredType):

    根据类的类型来获取Bean的实例。由于此方法为泛型方法,因此在获取Bean之后不需要进行强制类型转换。

提示:BeanFactory和ApplicationContext两种容器都是通过XML配置文件加载Bean的。二者的主要区别在于,如果Bean的某一个属性没有注入,使用BeanFacotry加载后,在第一次调用getBean()方法时会抛出异常,而ApplicationContext则在初始化时自检,这样有利于检查所依赖属性是否注入。因此,在实际开发中,通常都优先选择使用ApplicationContext,而只有在系统资源较少时,才考虑使用BeanFactory。

posted @ 2020-02-13 23:09  渐若窥宏大  阅读(1366)  评论(0编辑  收藏  举报