当前位置: 首页 > news >正文

Spring Bean生命周期详解

对象生命周期:创建(实例化----初始化)---使用----销毁,而在Spring中,Bean对象周期当然遵从这一过程,但是Spring提供了许多对外接口,允许开发者对三个过程(实例化、初始化、销毁)的前后做一些操作。在Spring Bean中,实例化是为Bean对象开辟空间(构造函数),初始化则是对属性的初始化,属性注入(setter方法注入属性)。

1.Bean自身方法:init-method/destroy-method,通过为配置文件bean定义中添加相应属性指定相应执行方法。

2.Bean级生命周期接口:BeanNameAware、BeanFactoryAware、InitializingBean和DiposableBean这些接口的方法。每个Bean选择实现,可选择各自的个性化操作。

3.容器级生命周期接口方法:这个包括了InstantiationAwareBeanPostProcessor 和 BeanPostProcessor 这两个接口实现(前者继承自后者),一般称它们的实现类为“后处理器“,这些接口是每个bean实例化或初始化时候都会调用。

4.工厂后处理器接口方法:也是容器级别的,但他们是在上下文装置配置文件之后调用(BeanFactoryPostProcessor、 CustomAutowireConfigurer)。


Bean具体生命周期

1.postProcessBeanFactory(ConfigurableListableBeanFactory c):工厂后处理器,这个事故IoC容器(ApplicationContext)初始化一部分。实现:写一个类,实现BeanFactoryPostProcessor接口,重写该方法,并在

    Spring配置文件中配置该类的一个bean。

2.postProcessBeforeInstantiation(Class<?>c,String beanName):所有bean对象(注1)实例化之前执行,具体点就是执行每个bean类构造函数之前。 实现:写一个类,实现InstantiationAwareBeanPostProcessor接

口,重写该方法,在Spring配置文件中配置该类的一个bean。返回一个Object,但是实际上你返回一个null即可。

3.Bean实例化,调用bean类构造函数。

4.postProcessAfterInstantiation(Object bean,String beanName):bean类实例化之后,初始化之前调用。

5.postProcessPropertyValue:属性注入之前调用。

6.setBeanName(String beanName):属性注入后调用,该方法作用是让bean类知道自己所在的Bean的name或者id属性。

7.setBeanFactory(BeanFactory factory):setBeanName后调用,该方法作用是让bean类知道自己所在的BeanFactory的属性。

8.postProcessBeforeInitialization(Object bean,String beanName):BeanPostProcessor作用是对bean实例化、初始化做些预处理操作。

9.postProcessBeforeInitialization(Object bean,Strign beanName)

10.afterPropertiesSet():bean类实现InitializingBean接口,重写该方法。初始化工作,但实现该接口这种方法和Spring耦合,不推荐。

11.postProcessAfterInitialization(Object bean,Strign beanName)

12.postProcessAfterInitialization(Object bean,Strign beanName)

13.程序执行,bean工作

14.destroy():bean销毁前执行。

15.xml_destroy():实现:spring bean配置文件中配置bean属性destroy-method=”xml_destroy”,这个方法名开发者自己定义。


总结:

实例化》初始化》使用》销毁

转载于:https://www.cnblogs.com/jdktomcat/p/9182188.html

相关文章:

  • linux设置预留端口号,防止监听端口被占用 ip_local_reserved_ports
  • 4.5/4.6 磁盘格式化 4.7/4.8 磁盘挂载 4.9 手动增加swap空间
  • Android开发者用RxJs和Python撸了一个网站
  • Vue.js 2.x:组件的定义和注册(详细的图文教程)
  • Nginx负载均衡,ssl原理,生成ssl密钥对,Nginx配置ssl
  • easyui-tree 修改图标
  • egret--一次性给多个对象添加点击事件
  • 《Python从小白到大牛》第3章 第一个Python程序
  • webpack4.X初学之配置VUE开发环境
  • val和var和Java
  • 银河证券互联网转型调研报告:数字化加速器助推银河战舰腾飞
  • 第十七节:易混淆的概念(静态和非静态、拆箱和装箱)
  • 从10亿到百亿规模大促,用云效玩转项目管理
  • for in遍历对象属性注意事项
  • nodejs:开发并发布一个nodejs包
  • [case10]使用RSQL实现端到端的动态查询
  • 【Leetcode】104. 二叉树的最大深度
  • 【刷算法】求1+2+3+...+n
  • 30天自制操作系统-2
  • ES学习笔记(12)--Symbol
  • v-if和v-for连用出现的问题
  • webpack+react项目初体验——记录我的webpack环境配置
  • 关于字符编码你应该知道的事情
  • CMake 入门1/5:基于阿里云 ECS搭建体验环境
  • 如何用纯 CSS 创作一个菱形 loader 动画
  • ​LeetCode解法汇总2696. 删除子串后的字符串最小长度
  • ​MySQL主从复制一致性检测
  • ​软考-高级-系统架构设计师教程(清华第2版)【第12章 信息系统架构设计理论与实践(P420~465)-思维导图】​
  • #if 1...#endif
  • #我与虚拟机的故事#连载20:周志明虚拟机第 3 版:到底值不值得买?
  • (1综述)从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练
  • (6)STL算法之转换
  • (cos^2 X)的定积分,求积分 ∫sin^2(x) dx
  • (Spark3.2.0)Spark SQL 初探: 使用大数据分析2000万KF数据
  • (顶刊)一个基于分类代理模型的超多目标优化算法
  • (非本人原创)史记·柴静列传(r4笔记第65天)
  • (附源码)springboot车辆管理系统 毕业设计 031034
  • (算法)前K大的和
  • (原創) 物件導向與老子思想 (OO)
  • (转)【Hibernate总结系列】使用举例
  • * 论文笔记 【Wide Deep Learning for Recommender Systems】
  • .Net IE10 _doPostBack 未定义
  • .Net Redis的秒杀Dome和异步执行
  • .NET 设计一套高性能的弱事件机制
  • .NET 中各种混淆(Obfuscation)的含义、原理、实际效果和不同级别的差异(使用 SmartAssembly)
  • .net开源工作流引擎ccflow表单数据返回值Pop分组模式和表格模式对比
  • .NET值类型变量“活”在哪?
  • .php文件都打不开,打不开php文件怎么办
  • .sys文件乱码_python vscode输出乱码
  • .w文件怎么转成html文件,使用pandoc进行Word与Markdown文件转化
  • @Autowired注解的实现原理
  • @entity 不限字节长度的类型_一文读懂Redis常见对象类型的底层数据结构
  • @Resource和@Autowired的区别
  • [ vulhub漏洞复现篇 ] Celery <4.0 Redis未授权访问+Pickle反序列化利用
  • [ vulhub漏洞复现篇 ] Hadoop-yarn-RPC 未授权访问漏洞复现