分享

解析:Spring IoC容器

 码农9527 2021-08-06

IoC容器是Spring的核心,也可以称为Spring容器。Spring通过IoC容器来管理对象的实例化和初始化,以及对象从创建到销毁的整个生命周期。  

Spring中使用的对象都由IoC容器管理,不需要我们手动使用new运算符创建对象。由IoC容器管理的对象称为SpringBean,SpringBean就是Java对象,和使用new运算符创建的对象没有区别。  

Spring通过读取XML或Java注解中的信息来获取哪些对象需要实例化。  

Spring提供2种不同类型的IoC容器,即BeanFactory和ApplicationContext容器。  

1.BeanFactory容器  

BeanFactory是最简单的容器,由org.springframework.beans.factory.BeanFactory接口定义,采用懒加载(lazy-load),所以容器启动比较快。BeanFactory提供了容器最基本的功能。  

为了能够兼容Spring集成的第三方框架(如BeanFactoryAware、InitializingBean、DisposableBean),所以目前仍然保留了该接口。  

简单来说,BeanFactory就是一个管理Bean的工厂,它主要负责初始化各种Bean,并调用它们的生命周期方法。  

BeanFactory接口有多个实现类,最常见的是org.springframework.beans.factory.xml.XmlBeanFactory。使用BeanFactory需要创建XmlBeanFactory类的实例,通过XmlBeanFactory类的构造函数来传递Resource对象。如下所示。  

Resource resource = new ClassPathResource("applicationContext.xml"); 
BeanFactory factory = new XmlBeanFactory(resource);  12复制代码类型:[java]

2.ApplicationContext容器  

ApplicationContext继承了BeanFactory接口,由org.springframework.context.ApplicationContext接口定义,对象在启动容器时加载。ApplicationContext在BeanFactory的基础上增加了很多企业级功能,例如AOP、国际化、事件支持等。  

ApplicationContext接口有两个常用的实现类,具体如下。  

1)ClassPathXmlApplicationContext  

该类从类路径ClassPath中寻找指定的XML配置文件,并完成ApplicationContext的实例化工作,具体如下所示。  

ApplicationContext applicationContext = new ClassPathXmlApplicationContext(String configLocation);1复制代码类型:[java]

在上述代码中,configLocation参数用于指定Spring配置文件的名称和位置,如Beans.xml。  

2)FileSystemXmlApplicationContext  

该类从指定的文件系统路径中寻找指定的XML配置文件,并完成ApplicationContext的实例化工作,具体如下所示。

ApplicationContext applicationContext = new FileSystemXmlApplicationContext(String configLocation);1复制代码类型:[java]

它与ClassPathXmlApplicationContext的区别是:在读取Spring的配置文件时,FileSystemXmlApplicationContext不会从类路径中读取配置文件,而是通过参数指定配置文件的位置。即FileSystemXmlApplicationContext可以获取类路径之外的资源,如“F:/workspaces/Beans.xml”。  

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

<!--指定Spring配置文件的位置,有多个配置文件时,以逗号分隔-->
<context-param>
 <param-name>contextConfigLocation</param-name>
 <!--spring将加载spring目录下的applicationContext.xml文件-->
 <param-value>
  classpath:spring/applicationContext.xml
 </param-value>
</context-param>
<!--指定以ContextLoaderListener方式启动Spring容器-->
<listener>
 <listener-class>  org.springframework.web.context.ContextLoaderListener
 </listener-class>
</listener>1234567891011121314复制代码类型:[java]

需要注意的是,BeanFactory和ApplicationContext都是通过XML配置文件加载Bean的。  

二者的主要区别在于,如果Bean的某一个属性没有注入,使用BeanFacotry加载后,第一次调用getBean()方法时会抛出异常,而ApplicationContext则会在初始化时自检,这样有利于检查所依赖的属性是否注入。  

因此,在实际开发中,通常都选择使用ApplicationContext,只有在系统资源较少时,才考虑使用BeanFactory。本教程中使用的是ApplicationContext容器。  

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多