在基于spring的应用中,你的应用对象存活在spring container(容器中)。容器创建,将它们装配到一起。还有配置和管理它们完整的生命周期(从生到死)

  下一章节,你会看到如何配置Spring来了解对象的创建、设置和装配。不过现在首要的任务是,认识你对象存活的容器。理解容器将帮助你了解它是如何管理对象。容器是spring框架的核心。spring容器使用DI来管理组件并组合成应用。它能够使组件间进行协作,还有这些创建的对象非常简洁和容易理解,它们支持复用并且很容易进行测试。

  在spring中没有单一的spring容器,spring自带有几个容器实现,可以将它们归纳为两类。Bean factories(定义在org.springframwork.beans.factory.BeanFactory接口中):它是最简单的容器,提供最基本的DI支持。Application contexts(定义在org.springframework.context.ApplicationContext接口中),它构建在bean factories概念上,用来提供应用框架服务,比如提供配置文件中处理文本信息和发布应用事件到监听器中的能力。尽管你可以使用bean factories或者Application contexts,但是由于bean factories对于大部分应用来说它太底层了。所以,应该优先使用Application contexts。接下来我们的关注点会放在Application contexts而不是bean factories上。

使用 application context

  spring自带几种application context。这里有些你可能已经碰到过:

  • AnnotationConfigApplicationContext ---- 从一个或多个基于java配置的类中加载spring application context
  • AnnotationConfigWebApplicationContext ---- 从一个或多个基于java配置的类中加载spring web application context
  • ClassPathXmlApplicationContext ---- 从一个或者多个位于类路径中的xml加载context定义,将context定义文件当做类路径资源对待
  • FileSystemXmlApplicationContext ---- 从一个或者多个位于文件系统中的xml中加载context定义
  • XmlWebApplicationContext ---- 从一个或者多个位于web应用的xml中加载context定义

我们会在以后的基于web的spring应用章节中来讨论AnnotationConfigWebApplicationContext和XmlWebApplicationContext。现在,我们从文件系统(FileSystemXmlApplicationContext )或者类路径(ClassPathXmlApplicationContext )中来加载application context。从文件系统或者类路径中来加载应用是类似的,都是如何加载你的bean到bean factory中。举个例子

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

这段是从文件系统中加载application context。

ApplicationContext context = new ClassPathXmlApplicationContext("knight.xml");

这段则是从类路径加载application context。使用FileSystemXmlApplicationContext和ClassPathXmlApplicationContext 的不同点是FileSystemXmlApplicationContext会从文件系统的具体位置的具体文件进行查找,而ClassPathXmlApplicationContext 会在你的类路径中进行查找(包括jar文件)

  或者,如果你可以从你的java配置类来加载你的application context,如下所示

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

  可以看出这里使用配置类来取代具体的xml来加载spring application context。如果你现在手上握有application context,你就可以从spring容器中调用genBean()方法来获取beans。到目前为止,我们知道一些spring容器的基本概念和如何创建容器,接下来我们进一步来看下容器中bean的生命周期。

bean的一生

  在传统的java应用中,bean的生命周期很简单。java的new关键字用来实例化一个bean,实例完后他就可以用了。一旦bean不再使用了。将会由垃圾收集进行处理。相反,在spring容器中bean变得更复杂。所以理解spring容器中的bean的生命周期很重要,因为你可以利用spring提供的自定义bean的机会来创建个性化的bean。下面图就显示了一个典型的bean开始生命周期

  如你所见,在bean准备被使用前会执行一系列步骤,下面我们来解释下上面的步骤

  1. spring初始化bean
  2. spring将值和bean引用注入到bean的属性中
  3. 如果bean实现BeanNameAware,Spring会传递bean的ID到setBeanName()方法中
  4. 如果bean实现BeanFactoryAware,Spring会调用setBeanFactory()方法,会将这个bean传递到bean factory中
  5. 如果bean实现ApplicationContextAware,Spring调用setAppliationContext()方法,并且传递一个引用到application context中
  6. 如果bean实现BeanPostProcessor接口,Spring会调用它的postProcessBeforeInitialization()方法
  7. 如果bean实现InitializingBean接口,Spring会调用它的afterPropertiesSet()方法。类似的,如果你的bean声明了init-method,然后具体的实例化方法会被调用
  8. 如果bean实现BeanPostProcessor,Spring会调用它的postProcessAfterInitialization方法
  9. 在这点,bean已经做好了被应用使用的准备,并且会保留在application context中直到application context销毁
  10. 如果bean实现了DisposableBean接口,Spring会调用它的destroy()方法。类似的,如果bean声明了destroy-method方法,则具体的方法会被调用。

  现在你应该知道如何去创建或者加载一个spring容器,不过一个空的容器不是很好;除非你将一些东西放到它上面不然它是不包含任何内容的。为了利用Spring DI优势,你必须将你的应用对象装配到spring容器中。我们会在以后的章节来讲装配的细节。接下来我们来看下spring框架的蓝图,看看spring框架整体架构。

spring 第一篇(1-2):管理你的beans的更多相关文章

  1. spring 第一篇(1-1):让java开发变得更简单(下)转

    spring 第一篇(1-1):让java开发变得更简单(下) 这个波主虽然只发了几篇,但是写的很好 上面一篇文章写的很好,其中提及到了Spring的jdbcTemplate,templet方式我之前 ...

  2. Spring第一篇

    我计划用3到五篇文章来描述Spring,这是第一篇 1 . 什么是Spring Spring 是一个开源框架,Spring 是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnso ...

  3. Spring第一篇【介绍Spring、引入Spring、Spring六大模块】

    前言 前面已经学习了Struts2和Hibernate框架了.接下来学习的是Spring框架-本博文主要是引入Spring框架- Spring介绍 Spring诞生: 创建Spring的目的就是用来替 ...

  4. SSH框架之Spring第一篇

    1.1. spring概述: 1.1.1 spring介绍 : Spring是分层的Java SE/EE应用 full-stack轻量级开源框架,以IoC(Inverse Of Control : 反 ...

  5. spring 第一篇(1-1):让java开发变得更简单(下)

    切面(aspects)应用 DI能够让你的软件组件间保持松耦合,而面向切面编程(AOP)能够让你捕获到在整个应用中可重用的组件功能.在软件系统中,AOP通常被定义为提升关注点分离的一个技术.系统由很多 ...

  6. spring 第一篇(1-3):鸟瞰spring蓝图

    如你所见,spring框架的核心是关注于如何使用DI.AOP和模板来让企业级java开发变得更简单.spring确实也是这样做的,所以很值得你去使用它.不过spring内容可能比你所能看到的要多很多. ...

  7. spring 第一篇(1-1):让java开发变得更简单(上)

    1.释放POJOS能量 传统开发中是如何束缚POJOS呢,如果你开发过java很长时间,那你一定有接触过EJB的开发.那时候开发一个小小的功能都要扩展框架的类或者实现其接口.所以你很容易在早期的Str ...

  8. 初学Java ssh之Spring 第一篇

    之前虽然毕业前实习的工作是使用的C# .NET语言,但是,毕业后还是果断应聘Java.虽然自己对Java的理解不如C#深入,只是对基础知识比较熟悉,但还是义无返顾了··· 虽然应聘经历比较坎坷,但最终 ...

  9. 聊聊、Spring 第一篇

    Spring 大家都不陌生,企业应用中很流行的一个平台.从最开始的 Servlet 控制所有,到 MVC 模式的出现.从 SSH (Struts.Spring.Hibernate) 所谓的三剑客 到 ...

随机推荐

  1. 1.2(java学习笔记)类与对象

      对象:是指具体的事物.比如学生 张三,老师 李四,代表一个单一的个体. 比如 学生 张三,这时张三就是具体的对象. 类:将对象中共有特征抽象出,可以理解为某种特性的集合. 世界上的事物可以分解成一 ...

  2. Bootstrap-datetimepicker日期插件简单使用

    写在前面: 日期组件有很多,这里简单的记录下bootstrap的一个日期插件datetimepicker,使用方法比较简单,基本上看一些就会了,但是还是记录下. 这个就不过多的说了,简单粗暴上代码 & ...

  3. [OpenJudge8471][划分DP]切割回文

    切割回文 总时间限制: 1000ms 内存限制: 65536kB [描述] 阿福最近对回文串产生了非常浓厚的兴趣. 如果一个字符串从左往右看和从右往左看完全相同的话,那么就认为这个串是一个回文串.例如 ...

  4. hdu 1054 Strategic Game(tree dp)

    Strategic Game Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  5. iptables禁止外网访问redis server服务默认端口6379的命令

    //只允许127.0.0.1访问6379 iptables -A INPUT -s 127.0.0.1 -p tcp --dport 6379 -j ACCEPT //其他ip访问全部拒绝 iptab ...

  6. 【FTP】org.apache.commons.net.ftp.FTPClient实现复杂的上传下载,操作目录,处理编码

    和上一份简单 上传下载一样 来,任何的方法不懂的,http://commons.apache.org/proper/commons-net/apidocs/org/apache/commons/net ...

  7. CentOS7 rc.local开机开法启动

    CentOS 7添加开机启动服务/脚本 一.添加开机自启服务 在CentOS 7中添加开机自启服务非常方便,只需要两条命令(以Jenkins为例):systemctl enable jenkins.s ...

  8. 纯C实现面向对象之接口编程

    创建如下文件目录 : Shape.h #include <stdlib.h> //接口 #ifndef Interface #define Interface struct #endif ...

  9. Maven 使用 二——nexus

    上篇博客介绍了创建maven项目的两种方式,当中一种是使用命令行的方式来创建,这种情况非常少,一般我们都有IDE开发环境.所以接下来,我们还是在一个详细的IDE中来说,我使用的是Eclipse. 一. ...

  10. oracle数据库修改编码

    (1)SYSTEM  用户登录SQLPLUS        SYS是sysdba用户,不能直接登录 (2)SYSDBA登录        CONN  / as sysdba; (3)查看数据库字符集 ...