Spring Bean的装配模式-BeanFactory和ApplicationContext

作为Spring核心机制的依赖注入/控制反转,改变了传统编程习惯。

组件的实例化不再由应用程序完成,转而交给Spring容器完成,需要时注入到应用程序中,从而将组件之间的依赖关系进行解耦

这一切都离不开Spring配置文件中使用<bean>元素。

Spring框架的主要功能是通过其IoC容器来实现的,它可以容纳我们所开发的各种Bean,并且我们可以从中获取各种发布在Spring IoC容器里的Bean,并且通过描述得到它。

Spring IOC容器的设计主要基于BeanFactory和ApplicationContext两个接口。

Bean工厂 BeanFactory

Spring IOC设计的核心是Bean容器BeanFactory是Spring IOC容器的核心接口,采用了Java 经典的工厂模式,由org.springframework.beans.factory.BeanFactory接口定义。

作为制造Bean的工厂,BeanFactory接口负责向容器的使用者提供实例,其功能主要是负责初始化各种Bean,并根据预定的配置完成对象之间依赖关系的组装,最终向使用者提供已经完成装配的可用对象。

BeanFactory接口提供了几个实现类,其中最常用的是org.springframework.beans.factory.xml.XmlBeanFactory,会跟XML配置文件中的定义来装配Bean,加载配置信息的语法如下:

BeanFactory beanFactory=new XmlBeanFactory(new FileSystemResource("D:/beans.xml"))  //这种加载方式在实际开发中并不多见,了解即可。

Bean工厂ApplicationContext

ApplicationContext是BeanFactory的子接口之一,换句话说,BeanFactory是Spring容器所定义的最底层接口,而ApplicationContext是其高级接口之一

ApplicationContext并且对BeanFactory功能做了许多有用的扩展,还添加了对国际化、资源访问、实践传播等方面的支持。

ApplicationContext成为Java EE应用中首选的IoC容器,可应用在Java APP 和 Java Web中。

ApplicationContext的中文含义是“应用上下文”,它继承自BeanFactory接口,有三个常用的实现类。

ClassPathXMLApplicationContext

ClassPathXMLApplicationContext类从类路径ClassPath中寻找指定的XML配置文件,找到并装载ApplicationContext的实例化工作。例如:

ApplicationContext context=new ClassPathXMLApplicationContext(String configLocation);

configLocation 参数指定Spring配置文件的名称和位置,如“ApplicationContext.xml”。 

ClassPathXmlApplicationContext 默认会去 classPath 路径下找。classPath 路径指的就是编译后的 classes 目录。

 FileSystemXmlApplicationContext

FileSystemXMLApplicationContext类从指定的文件系统路径中寻找指定的XML配置文件,找到并转载ApplicationContext的实例化工作。例如:

ApplicationContext context=new FileSystemXMLApplicationContext(String configLocation);

其与ClassPathXMLApplicationContext的区别在于读取Spring配置文件的方式,FileSystemXMLApplicationContext不再从类路径中读取配置文件,而是通过参数指定配置文件的位置,可以获取类路径以外的资源。这样绝对路径的方式,会导致程序的灵活性变差,所以这个方法一般不推荐使用。

FileSystemXmlApplicationContext 默认是去项目的路径下加载,可以是相对路径,也可以是绝对路径,若是绝对路径,“file:” 前缀可以缺省。

XMLWebApplicationContext

XMLWebApplicationContext类从Web系统中的XML文件载入Bean定义的信息,Web应用寻找指定的XML配置文件,找到并装载完成ApplicationContext的实例化工作。例如:

ServletContext servletcontext=request.getSession().getServletContext();

ApplicationContext context=WebApplicationContextUtils.getWebApplicationContext(servletContext);

在使用Spring框架时,可以通过实例化其中的任何一个类来创建Spring的ApplicationContext容器,这些实现类的主要区别在于装载Spring配置文件实例化ApplicaitonContext容器的方式不同,在实例化ApplicationContext之后,同样通过getBean的方法从ApplicationContext容器中获取装配好的Bean实例以供使用。

 

 在Java项目中通过ClassPathXmlApplicationContext类手工实例化ApplicationContext容器通常是不二之选。

但对于Web项目就不行了。Web项目的启动是由响应的Web服务器负责的,因此在Web项目中,AppllicationContext容器的实例化工作最好交给Web服务器来完成,Spring为此提供了如下两种方式:

(一)基于ContextLoaderListener实现

这种方式只适用于Servlet2.4及以上规范的Servlet,需要在web.xml中添加如下代码:

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:applicatoinContext.xml</param-value>
</context-param>

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

(二)基于ContextLoaderServlet实现

<!--指定spring配置温的位置,多个配置文件以逗号分隔-->
<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:applicatoinContext.xml</param-value>
</context-param>
<!--指定以Servlet方式启动Spring容器-->
<Servlet>
    <servlet-name>context</servlet>
    <servlet-class>
         org.springfaramwork.web.context.ContextLoaderServlet
    </servlet-class>
    <load-on-startup>1</load-on-startup>
</Servlet>

 

原文地址:https://www.cnblogs.com/kjitboy/p/12067934.html