1.2 Spring 容器

Posted wpengch1

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1.2 Spring 容器相关的知识,希望对你有一定的参考价值。

Spring 容器

在一个基于Spring的应用程序中,你的应用程序对象是生存在Spring 容器中的。如果所示,容器创建它们、
将它们组装起来、配置他们并管理他们的全生命周期。

接下来你可以看到怎么去配置Spring,什么对象可以被创建、配置并组装。首先,重要的是要知道你的对象
生存的容器。了解这个容器将有助于你了解如何管理你的对象。

容器是在Spring的核心库(spring-core)里面,Spring的容器使用DI来管理组成应用程序的组件。这个包
含创建组件之间的连接。本身这些组件是纯粹的,易于理解、易于重用并且易于测试的。

不只有单一的Spring的容器,Spring有好几个容器,可以将这些容器分为两个类别。Bean factories–Bean工厂(定义
在org.springframework.beans.factory.BeanFactory中)是最简单的容器,它对DI提供支持。Application Context–应用程序上下文(定义在org.springframework.context.ApplicationContext中)通过提供应用程序框架,比如:从属性文件解析文本消息的能力、将应用程序发布到感兴趣的事件监听器的能力等,建立一个Bean工厂。

尽管理论上来说,可以单独使用Bean工厂或者应用程序上下文,但是对于许多应用程序来说,Bean工厂是在低级别上面进行的,Application Context是在Bean工厂上一级别的,所以我们主要讨论Application Context,而不会花时间讨论Bean工厂。

1.2.1 与Application Context一起工作

Spring提供了几个Application Context,以下是一些你可能会遇到的:

  • AnnotationConfigApplicationContext 从一个或者多个基于Xml的配置类里面加载Spring上下文
  • AnnotationConfigWebApplicationContext 从一个或者多个基于Java的配置类里面加载Spring Web上下文
  • ClassPathXmlApplicationContext 从在类目录下的一个或者多个基于Xml的配置类里面加载Spring上下文
  • FileSystemXmlApplicationContext 从在文件系统下的一个或者多个基于Xml的配置类里面加载Spring上下文
  • XmlWebApplicationContext 在网络应用程序中加载一个或多个XML文件中加载上下文

我们将会探讨AnnotationConfigWebApplicationContext和XmlWebApplicationContext在第8章,当我
们讨论基于Web的Spring应用程序时。现在,让我们学习使用FileSystemXMLApplicationContext从文件
系统中加载上下文或者使用ClassPathXMLApplicationContext从代码目录下面加载上下文。这两种是相似
的,比如:

ApplicationContext context = new
FileSystemXmlApplicationContext("c:/knight.xml");
ApplicationContext context = new
ClassPathXmlApplicationContext("knight.xml");

他们之间唯一的不同就是FileSystemXmlApplicationContext基于文件目录查找并进行加载,而
ClassPathXmlApplicationContext是基于代码目录(包含jar文件)进行查找并加载。

另外,如果你加载上下文使从Java配置文件,则使用:

ApplicationContext context = new AnnotationConfigApplicationContext(
com.springinaction.knights.config.KnightConfig.class);

跟前面标识从XML加载不同,AnnotationConfigApplicationContext是从java类里面加载。

当具有上下文后,可以通过getBean获取到该上下文中的Bean。既然你已经知道了怎么创建Spring上下文,现在让我们看看在一个Spring容器中Bean的生命周期。

1.2.2 Bean的生命周期

在传统的Java应用程序中,Bean的生命周期是相当简单的。 Java的new 关键字去创建一个Bean,这是
Bean处于可使用状态。一旦Bean不在处于使用状态,则会提交给垃圾回收期在适当的时候进行回收。

相反,在Spring容器中的Bean的生命周期会更加复杂。理解Spring Bean的生命周期是相当重要的,因为你
可能想要使用Spring提供的机制去定制Bean是怎么被创建的。下图展示了Spring Bean的典型生命周期:

像你看到的,一个Bean在使用之前,一个Bean工厂执行了几步安装操作。我们详细分析下:

  1. Spring实例化Bean
  2. Spring注入值和引用进Bean的属性里面
  3. 如果Bean实现了BeanNameAware,Spring通过Bean的ID去调用setBeanName方法
  4. 如果Bean实现了BeanFactoryAware,Spring调用setBeanFactory方法,传递Bean工厂本身
  5. 如果Bean实现了ApplicationContextAware,Spring调用setApplicationContext方法,传递自己的ApplicationContext引用
  6. 如果Bean实现了BeanPostProcessor接口,Spring调用它的postProcessBeforeInitialization()方法
  7. 如果Bean实现了InitializingBean接口,Spring调用它的afterPropertiesSet()方法,同样地,如果Bean被生命为initmethod,特定的初始化方法会被调用。
  8. 如果Bean实现了BeanPostProcessor接口,Spring会调用他的postProcessAfterInitialization()方法
  9. 直到这里,Bean就是可以使用的了,并且会一直保存在上下文中,直到上下文销毁
  10. 如果Bean实现了DisposableBean接口,Spring会调用起destroy方法。

现在,你知道了怎么创建和加载一个Spring容器,但是一个空的容器是没有什么用的,它不包含任何东西,
除非你加入进去。为了实现DI的好处,你必须将你的应用程序Bean加入进Spring容器,我们将在第二张详细
描述。

现在,让我们来橄榄下Spring由哪些东西组成,其最新的版本是什么。

以上是关于1.2 Spring 容器的主要内容,如果未能解决你的问题,请参考以下文章

Spring——bean的基本配置依赖注入

Spring——bean的基本配置依赖注入

Spring创建和初始化的源码流程分析

Spring

Spring之bean标签属性详解

Spring学习-----Spring使用@Autowired注解自动装配