Spring实战(二)Spring容器和bean的生命周期
引入问题:
在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的生命周期的更多相关文章
- Spring(十二):IOC容器中Bean的生命周期方法
IOC容器中Bean的生命周期方法 1)Spring IOC容器可以管理Bean的声明周期,Spring允许在Bean生命周期的特定点执行定制的任务. 2)Spring IOC容器对Bean的生命周期 ...
- 7 -- Spring的基本用法 -- 9...容器中Bean的生命周期
7.9 容器中Bean的生命周期 Spring可以管理singleton作用域的Bean的生命周期,Spring可以精确地知道该Bean何时被创建,何时被初始化完成.容器何时准备销毁该Bean实例. ...
- Spring容器中bean的生命周期以及关注spring bean对象的后置处理器:BeanPostProcessor(一个接口)
Spring IOC 容器对 Bean 的生命周期进行管理的过程: 1.通过构造器或工厂方法创建 Bean 实例 2.为 Bean 的属性设置值和对其他 Bean 的引用 3.将 Bean 实例传递给 ...
- Spring学习-- IOC 容器中 bean 的生命周期
Spring IOC 容器可以管理 bean 的生命周期 , Spring 允许在 bean 声明周期的特定点执行定制的任务. Spring IOC 容器对 bean 的生命周期进行管理的过程: 通过 ...
- Spring 容器中 Bean 的生命周期
Spring 容器中 Bean 的生命周期 1. init-method 和 destory-method 方法 Spring 初始化 bean 或销毁 bean 时,有时需要作一些处理工作,因此 s ...
- spring IOC 容器中 Bean 的生命周期
IOC 容器中 Bean 的生命周期: 1.通过构造器或工厂方法创建 Bean 实例 2.为 Bean 的属性设置值和对其他 Bean 的引用 3.调用 Bean 后置处理器接口(BeanPostPr ...
- Spring IOC容器中Bean的生命周期
1.IOC容器中Bean的生命周期 构造器函数 设置属性 初始化函数(在Bean配置中 init-method) 使用Bean 结束时关闭容器(在Bean中配置destroy-method) 2.Be ...
- Spring 使用介绍(十三)—— Bean的生命周期
一.概述 Spring Bean的完整生命周期从创建Spring容器开始,直到最终Spring容器销毁Bean,生命周期时序图如下: 二.生命周期接口分类 Bean的生命周期经历了多个接口方法的调用, ...
- IOC容器中bean的生命周期
一.Bean的生命周期 Spring IOC容器可以管理Bean的生命周期,允许在Bean生命周期的特定点执行定制的任务. Spring IOC容器对Bean的生命周期进行管理的过程如下: (1).通 ...
- Spring4学习回顾之路06- IOC容器中Bean的生命周期方法
SpringIOC容器可以管理Bean的生命周期,Spring允许在Bean生命周期的特定点执行特定的任务! Spring IOC容器对Bean的生命周期进行管理的过程: -通过构造器或者工厂方法创建 ...
随机推荐
- RuntimeException异常处理汇总
Java中所有异常的父类是Throwable类,在Throwable类下有两大子类: 一个是Error类,指系统错误异常,例如:VirtualMachineError 虚拟机错误,ThreadDeat ...
- 重读APUE(15)-pthread_cond_wait与while循环
即使pthead_cond_wait()和pthread_cond_timewait()没有错误返回,等待的条件也可能是假的:即使pthread_cond_timewait()返回了超时错误,关联的条 ...
- GA函数优化
一.遗传算法简介 遗传算法(Genetic Algorithms,GA)是1962年美国人提出,模拟自然界遗传和生物进化论而成的一种并行随机搜索最优化方法. 与自然界中“优胜略汰,适者 ...
- Linux rpm 安装MySQL
1 检查是否存在旧版本mysql (1) mysql 执行命令:rpm -qa|grep mysql,若存在旧mysql,删除查询到的旧mysql,执行: rpm -e --nodeps XXXX ...
- flutter中的异步机制 Future
饿补一下Flutter中Http请求的异步操作. Dart是一个单线程语言,可以理解成物理线路中的串联,当其遇到有延迟的运算(比如IO操作.延时执行)时,线程中按顺序执行的运算就会阻塞,用户就会感觉到 ...
- Python 学习 —— 进阶篇(装饰器、类的特殊方法)
Python基础部分学完之后,在进入其OOP部分前,先理解一下其装饰器这种结构,其功能可类比于Java中的面向切面编程,下面参见具体实例: def log(f): def fn(x): print ' ...
- 免费版CloudFlare CDN基本设置参考
CDN有很多,网上都有介绍,用户比较多的CloudFlare CDN大家都知道,配置起来也比较简单,合理的配置,才能提升网站的速度和网站安全.不同的网站需求配置不一样,以下是我的配置情况,仅供参考. ...
- 阶段5 3.微服务项目【学成在线】_day02 CMS前端开发_06-vuejs研究-vuejs基础-v-on指令
3.v-on绑定一个按钮的单击事件 计算的按钮上加事件 点击计算的按钮,弹出的事件 定义一个Result的变量
- java nio 缓冲区读写数据(图形详解)
Position 您可以回想一下,缓冲区实际上就是美化了的数组.在从通道读取时,您将所读取的数据放到底层的数组中. position 变量跟踪已经写了多少数据.更准确地说,它指定了下一个字节将放到数组 ...
- Java 实现 telnet命令 验证主机端口的连通性
Java 实现 telnet命令 验证主机端口的连通性 1.Telnet 命令 Telnet协议是TCP/IP协议族中的一员,是Internet远程登录服务的标准协议和主要方式.它为用户提供了在本地计 ...