Spring学习手札(四)谈谈Spring Bean的生命周期及作用域
在Spring中,那些组成应用程序的主体以及由Spring IoC容器所管理的对象,被称之为Bean。Bean与应用程序中其他对象(比如自己创建类)的区别就是,Bean是由IoC容器创建于销毁的。在Spring中,每次从BeanFactory或ApplicationContext指定病获取Bean时都会产生一个新的实例,且默认都是单例。
Spring Bean生命周期比较复杂,可以分为创建和销毁创建
1.实例化Bean对象
2.设置Bean属性
Bean实例生命周期的知性过程如下:
* Spring实例化一个bean,就是new
* Spring会在配置说明,也就是IoC注入
* 如果这个Bean已经实现了Aware接口,会调用它实现setBeanName方法,次数传递的就是Spring配置中Bean的id值
* 如果这个Bean已经实现了BeanFactoryAware接口,会调用它实现的setBeanFactory(setBeanFactory(BeanFactory)传递的是Spring工厂自身(可以用这个方式来获取其它Bean,只需在Spring配置文件中配置一个普通的Bean就可以);
* 如果这个Bean已经实现了ApplicationContextAware接口,会调用setApplicationContext(ApplicationContext)方法,传入Spring上下文(同样这个方式也可以实现步骤4的内容,但比4更好,因为ApplicationContext是BeanFactory的子接口,有更多的实现方法);
* 如果这个Bean关联了BeanPostProcessor接口,将会调用postProcessBeforeInitialization(Object obj, String s)方法,BeanPostProcessor经常被用作是Bean内容的更改,并且由于这个是在Bean初始化结束时调用那个的方法,也可以被应用于内存或缓存技术;
* 如果Bean在Spring配置文件中配置了init-method属性会自动调用其配置的初始化方法。
* 如果这个Bean关联了BeanPostProcessor接口,将会调用postProcessAfterInitialization(Object obj, String s)方法、;
注:以上工作完成以后就可以应用这个Bean了,那这个Bean是一个Singleton的,所以一般情况下我们调用同一个id的Bean会是在内容地址相同的实例,当然在Spring配置文件中也可以配置非Singleton,这里我们不做赘述。
* Bean不再需要时,会经过清理阶段,如果Bean实现了DisposableBean这个接口,会调用那个其实现的destroy()方法;
* 最后,如果这个Bean的Spring配置中配置了destroy-method属性,会自动调用其配置的销毁方法。
Spring Bean的销毁过程调用了DisposableBean的destory方法和Bean自身定制的destory方法。
Spring Bean有5个作用域
Singleton,Spring的默认作用域,也就是为每个IoC容器创建唯一的一个Bean实例。适合无状态的Bean
Prototype,针对每个getBean请求,容器都会单独创建一个Bean实例。适合有状态的Bean,相当于new xxBean()
Request,为每个HTTP请求创建单独的Bean实例,适用于WebApplicationContext 环境
Session,同一个Http Session才能共享一个Bean,适用于WebApplicationContext 环境
GlobalSession,用于Portlet容器,因为每个Portlet有单独的Session,GlobalSession提供一个全局性的Http Session,适用于WebApplicationContext 环境
关于Spring Bean作用域再做补充
1.Spring中的bean默认都单例Singleton(bean的Id唯一),就是说容器在创建一个bean对象后,不管是使用与否,它都切实的存在,每次获取到的对象都是同一个对象。注意,Singleton作用域是Spring中却省的作用域。
<bean name="userService" class="service.UserService" scope="singleton"></bean>
2.当一个bean的作用域为Prototype时,表示这个bean定义对应了多个对象实例,每次getBean()时,都会创建一个新的bean实例。Prototype,在我们创建容器的时候并没有实例化,而是我们获取bean的时候才回去创建一个对象,每次获取的对象不一样。
<bean name="userService" class="service.UserService" scope="prototype"></bean>
3.每次HTTP请求,Spring容器会根据loginActionbean定义创建一个全新的LoginAction,此仅在当前HTTP Request内有效,而HTTP时无常态的,所以每次的请求,都是心的bean实例,当请求结束,request作用域的bean实例被销毁。
<bean name="userService" class="service.UserService" scope="request"></bean>
4.定义为Session,该作用域仅在基于web的Spring ApplicationContext情形下有效。可以根据需要任意的更改bean的状态。
<bean name="userService" class="service.UserService" scope="session"></bean>
5.Global Session,表示了一个全局的HTTP Session,仅限于全局portlet context的生命周期范围内。
<bean name="userService" class="service.UserService" scope="globalSession"></bean>
Spring Bean的生命周期,完全被容器所管理,从属性设置到各种依赖关系,都是容器负责注入,并进行各个阶段其他事宜的处理,Spring容器为应用开发者定义了清晰的生命周期沟通界面。
Spring学习手札(四)谈谈Spring Bean的生命周期及作用域的更多相关文章
- spring 学习(四): spring 的 jdbcTemplate 操作
spring 学习(四): spring 的 jdbcTemplate 操作 spring 针对 javaee 的每一层,都提供了相应的解决技术,jdbcTemplate 的主要操作在 dao 层. ...
- 第37讲 谈谈Spring Bean的生命周期和作用域
在企业应用软件开发中,Java 是毫无争议的主流语言,开放的 Java EE 规范和强大的开源框架功不可没,其中 Spring 毫无疑问已经成为企业软件开发的事实标准之一.今天这一讲,我将补充 Spr ...
- Spring 使用介绍(十三)—— Bean的生命周期
一.概述 Spring Bean的完整生命周期从创建Spring容器开始,直到最终Spring容器销毁Bean,生命周期时序图如下: 二.生命周期接口分类 Bean的生命周期经历了多个接口方法的调用, ...
- Spring 框架基础(02):Bean的生命周期,作用域,装配总结
本文源码:GitHub·点这里 || GitEE·点这里 一.装配方式 Bean的概念:Spring框架管理的应用程序中,由Spring容器负责创建,装配,设置属性,进而管理整个生命周期的对象,称为B ...
- Spring02——Spring 中 Bean 的生命周期及其作用域
在前一篇文章中,我们已经介绍了 Spring IOC 的相关知识,今天将为个位介绍 Spring 中 Bean 的相关知识.关注我的公众号「Java面典」,每天 10:24 和你一起了解更多 Java ...
- spring bean的生命周期与作用域
bean的作用域 singleton:单例模式,Spring IoC容器中只会存在一个共享的Bean实例,无论有多少个Bean引用它,始终指向同一对象. prototype:原型模式,每次通过Spri ...
- java Spring系列之 配置文件的操作 +Bean的生命周期+不同数据类型的注入简析+注入的原理详解+配置文件中不同标签体的使用方式
Spring系列之 配置文件的操作 写在文章前面: 本文带大家掌握Spring配置文件的基础操作以及带领大家理清依赖注入的概念,本文涉及内容广泛,如果各位读者耐心看完,应该会对自身有一个提升 Spri ...
- Spring 学习笔记(五)—— Bean之间的关系、作用域、自动装配
继承 Spring提供了配置信息的继承机制,可以通过为<bean>元素指定parent值重用已有的<bean>元素的配置信息. <?xml version="1 ...
- spring学习笔记四:spring常用注解总结
使用spring的注解,需要在配置文件中配置组件扫描器,用于在指定的包中扫描注解 <context:component-scan base-package="xxx.xxx.xxx.x ...
随机推荐
- iOS method swizz
1: 防止按钮在一定时间内重复响应默认1秒 // // UIButton+AvoidDoubleClick.h // 51WaywardShop // // Created by jisa on 20 ...
- AVL树的实现——c++
一.概念 AVL树是根据它的发明者G.M. Adelson-Velsky和E.M. Landis命名的.它是最先发明的自平衡二叉查找树,也被称为高度平衡树.相比于"二叉查找树",它 ...
- Queue-621. Task Scheduler
Given a char array representing tasks CPU need to do. It contains capital letters A to Z where diffe ...
- Heap-451. Sort Characters By Frequency
Given a string, sort it in decreasing order based on the frequency of characters. Example 1: Input: ...
- Text and Binary modes
http://perlmaven.com/what-is-a-text-file https://cygwin.com/cygwin-ug-net/using-textbinary.html Text ...
- strlen()与mb_strlen()的区别
1,strlen()是php的内置函数,可以在php中直接调用:mb_strlen()是php的扩展,需要配置php.ini,以开启mb_strlen()扩展.在php.ini中加载了php_mbst ...
- 手把手教你从零搭建Python数据分析环境
由于最近再做推荐系统的特征处理,需要借助一些工具来筛选特征.最初使用了R,R的安装很简单,而且API也很容易使用,直接就能出图.后来,发现很多人在python和R之间做选择,所以我也在两个工具间摇摆不 ...
- webpack快速入门——CSS进阶,Less文件的打包和分离
1.要使用less,首先使用npm安装less服务 cnpm install less --save-dev 还需要安装Less-loader用来打包使用. cnpm install less-loa ...
- WebStorm 最新版本激活方式
WebStorm 最新版本激活方式:今天下载最新版本的WebStorm,发现原来的通过license server激活的方式,网上的已经失效. 找到一种最新的激活码,今天试了下,是有效的.记录下. 注 ...
- chrome inspect 远程调试H5
chrome://inspect/#devices 一个内置于chrome的远程调试指令,满足远程调试的几个必须条件 1,能够访问https://chrome-devtools-frontend.ap ...