引入问题:

  在XML配置文件中配置bean后,这些文件又是如何被加载的?它们被加载到哪里去了?

Spring容器——框架核心

  1、什么是Spring容器?它的功能是什么?

  在基于Spring的应用中,你的应用对象生存于Spring容器中。

  Spring容器负责创建对象、装配对象、配置对象并管理它们的整个生命周期,from birth to death!!(也可以是new到finalize())

  Spring容器使用DI管理构成应用的组件,它会创建相互协作的组件之间的关联。

  2、Spring自带了多个容器实现,可以归为哪两种不同的类型?

  • BeanFactory:最简单的容器,提供基本的DI支持(对多数应用很低级);
  • 应用上下文:基于BeanFactory构建,提供框架级别的服务。

  

  3、上一节提到,Spring中自带了多种Application Context的实现,他们的主要区别在于如何加载配置。罗列出常用的加载ApplicationContext的方式。

  • FileSystemXmlApplicationContext ---从文件系统下的一个或者多个XML配置文件架子啊上下文定义。在这里,您需要将XML bean配置文件的完整路径提供给构造函数。

  • ClassPathXmlApplicationContext---这个容器从一个XML文件中加载bean的定义。这里你不需要提供XML文件的完整路径,但是你需要正确设置CLASSPATH,这里把应用上下文的定义文件作为类资源。

  • WebXmlApplicationContext---该容器从Web应用下的一个或者多个XML配置文件加载上下文定义。

  • AnnotationConfigApplicationContext---从基于Java的配置类中加载Spring应用上下文;
  • AnnotationConfigWebApplicationContext---从基于Java的配置类中加载Spring Web应用上下文

  4、使用文件系统和类路径加载ApplicationContext的代码差不多:

  ApplicationContext context=new FileSystemXmlAplicaitonContext("c:/spring-mvc.xml");

  ApplicaitonContext context=new ClassPathXmlApplicationContext("spring-mcv.xml");

  (classpath就是存放.class等编译后文件的路径。)

  5、从Java配置中加载ApplicationContext,把配置类的全路径作为参数。

  ApplicationContext context=new AnnotationConfigApplicationContext(con.biguo.SpringConfig.class);

  6、加载应用上下文后,怎么获取bean?

  使用ApplicationContext对象的的getBean(xxx.class)方法从Spring容器中获取bean。

Spring中bean的生命周期

  7、传统Java应用bean的声明周期:

  new进行实例化后便可以使用bean,再由Java自动进行垃圾回收。

  8、Spring中bean的生命周期很复杂,在bean准备就绪之前,bean工厂执行了多个启动步骤(调用了各种方法)。这些步骤也是Spring提供的扩展点,让开发者自定义bean 的创建过程。流如下:

  • Spring对bean实例化;
  • Spring将值和bean的引用注入到bean对应的属性;
  • 如果bean实现了BeanNameAware接口,Spring将beande ID传递给setBeanName()方法;
  • 如果bean实现了BeanFactoryAware接口,Spring将调用setBeanFactory()方法,将BeanFactory容器实例传入;
  • 如果bean实现了ApplicationContextAware接口,Spring将调用set Application Context()方法,将bean所在的应用上下文的引用传入进来;
  • 如果bean实现了BeanPostProcessor接口,Spring将调用它们的postProcessBeforeInitialization()方法;
  • 如果bean实现了InitializingBean接口,Spring将调用它们的afterPropertiesSet()方法。类似的,如果bean使用了init-method声明了初始化方法,该方法也会被调用
  • 调用自定义的初始化方法;
  • 如果bean实现了BeanPostProcessor接口,Spring将调用它们的postProcessAfterInitialization()方法;
  • bean准备就绪,可以使用了。它们将一直驻留在应用上下文中,直到该应用上下文被销毁。
  • 容器关闭
  • 如果bean实现了DisposableBean接口,Spring将调用它的destroy()接口方法。同样,如果bean使用了destroy-method声明了销毁方法,该方法也会被调用。

  这一节了解了如何创建和加载一个(空的)Spring容器,接下来会探讨如何将应用对象装配进Spring容器。

 

Spring实战(二)Spring容器和bean的生命周期的更多相关文章

  1. Spring(十二):IOC容器中Bean的生命周期方法

    IOC容器中Bean的生命周期方法 1)Spring IOC容器可以管理Bean的声明周期,Spring允许在Bean生命周期的特定点执行定制的任务. 2)Spring IOC容器对Bean的生命周期 ...

  2. 7 -- Spring的基本用法 -- 9...容器中Bean的生命周期

    7.9 容器中Bean的生命周期 Spring可以管理singleton作用域的Bean的生命周期,Spring可以精确地知道该Bean何时被创建,何时被初始化完成.容器何时准备销毁该Bean实例. ...

  3. Spring容器中bean的生命周期以及关注spring bean对象的后置处理器:BeanPostProcessor(一个接口)

    Spring IOC 容器对 Bean 的生命周期进行管理的过程: 1.通过构造器或工厂方法创建 Bean 实例 2.为 Bean 的属性设置值和对其他 Bean 的引用 3.将 Bean 实例传递给 ...

  4. Spring学习-- IOC 容器中 bean 的生命周期

    Spring IOC 容器可以管理 bean 的生命周期 , Spring 允许在 bean 声明周期的特定点执行定制的任务. Spring IOC 容器对 bean 的生命周期进行管理的过程: 通过 ...

  5. Spring 容器中 Bean 的生命周期

    Spring 容器中 Bean 的生命周期 1. init-method 和 destory-method 方法 Spring 初始化 bean 或销毁 bean 时,有时需要作一些处理工作,因此 s ...

  6. spring IOC 容器中 Bean 的生命周期

    IOC 容器中 Bean 的生命周期: 1.通过构造器或工厂方法创建 Bean 实例 2.为 Bean 的属性设置值和对其他 Bean 的引用 3.调用 Bean 后置处理器接口(BeanPostPr ...

  7. Spring IOC容器中Bean的生命周期

    1.IOC容器中Bean的生命周期 构造器函数 设置属性 初始化函数(在Bean配置中 init-method) 使用Bean 结束时关闭容器(在Bean中配置destroy-method) 2.Be ...

  8. Spring 使用介绍(十三)—— Bean的生命周期

    一.概述 Spring Bean的完整生命周期从创建Spring容器开始,直到最终Spring容器销毁Bean,生命周期时序图如下: 二.生命周期接口分类 Bean的生命周期经历了多个接口方法的调用, ...

  9. IOC容器中bean的生命周期

    一.Bean的生命周期 Spring IOC容器可以管理Bean的生命周期,允许在Bean生命周期的特定点执行定制的任务. Spring IOC容器对Bean的生命周期进行管理的过程如下: (1).通 ...

  10. Spring4学习回顾之路06- IOC容器中Bean的生命周期方法

    SpringIOC容器可以管理Bean的生命周期,Spring允许在Bean生命周期的特定点执行特定的任务! Spring IOC容器对Bean的生命周期进行管理的过程: -通过构造器或者工厂方法创建 ...

随机推荐

  1. 解决python中文乱码的方法

    首先需要说明的是,windows下的文件路径,cmd窗口等默认编码都是gbk 但在windows下编写python程序的时候,我们一般采用的编码是utf-8 二者不一致是导致乱码的根本原因! 在pyc ...

  2. 表单 Flask-WTF - 校验器

    1 wtforms内置的校验器 Class wtforms.validators.DataRequired(message=None)此验证器将会检测field是否输入了数值,实际上是进行了if fi ...

  3. SCRIPT438: 对象不支持“trim”属性或方法

    关于ie9以下不支持trim()方法 可以在自己封装的框架中加入如下.或直接调用也行. if(!String.prototype.trim) { String.prototype.trim = fun ...

  4. ArcGIS超级工具SPTOOLS-锐角检查,获得内角并判断是否凸多边形,获得线(面)两个折点方向

    1.1  锐角检查 操作视频: https://weibo.com/tv/v/HCNNXhm5F?fid=1034:4392479009475111 可以是面.线夹角锐角检查 输出锐角点的位置和角度( ...

  5. Sql中truncate,delete以及drop的比较

    相同点: 1.truncate和不带where子句的delete.以及drop都会删除表内的数据. 2.drop.truncate都是DDL语句(数据定义语言),执行后会自动提交. 不同点: 1. t ...

  6. SQL优化 | sql执行过长的时间,如何优化?

    1.查看sql是否涉及多表的联表或者子查询,如果有,看是否能进行业务拆分,相关字段冗余或者合并成临时表(业务和算法的优化) 2.涉及链表的查询,是否能进行分表查询,单表查询之后的结果进行字段整合 3. ...

  7. linux下编辑VI窗口插入与编辑命令

    前言 在嵌入式linux开发中,进行需要修改一下配置文件之类的,必须使用vi,因此,熟悉 vi 的一些基本操作,有助于提高工作效率. 一,模式 vi编辑器有3种模式:命令模式.输入模式.末行模式.掌握 ...

  8. Facebook币Libra学习-3.小试牛刀第一笔交易

    我们提供了一个命令行界面(CLI)客户端来与区块链进行交互. 假设 本文档中的所有命令均假定: 您运行的是Linux(基于Red Hat或Debian)或macOS系统. 您可以稳定地连接到互联网. ...

  9. 非局部模块(Non Local module)

    Efficient Coarse-to-Fine Non-Local Module for the Detection of Small Objects 何恺明提出了非局部神经网络(Non-local ...

  10. kotlin 委托类的初始化函数

    import java.beans.AppletInitializer import kotlin.reflect.KProperty fun main(arg: Array<String> ...