Spring 基础教程之三:JavaBean生命周期

2023-11-06


Spring中Bean 的生命周期 , 在学习 spring 的过程中 bean 的生命周期理解对学习 spring 有很大的帮助,下面我就分别介绍在 ApplicationContext BeanFactory Bean 的生命周期。

1、在ApplicationContextBean的生命周期

生命周期执行的过程如下:

1、需找所有的bean根据bean定义的信息来实例化bean

2、使用依赖注入,spring按bean定义信息配置bean的所有属性

3、若bean实现了BeanNameAware接口,工厂调用Bean的setBeanName()方法传递bean的ID。

4、若bean实现了BeanFactoryAware接口,工厂调用setBeanFactory() 方法传入工厂自身。

5、若bean实现了ApplicationContextAware()接口,setApplicationContext()方法会被调用

6、若BeanPostProcessor和bean关联,

则它们的postProcessBeforeInitialization()方法被调用

7若bean指定了init-method="init"方法、,它将被调用。

8若有BeanPostProcessor和bean关联,

     则它们的postProcessAfterInitialization()方法被调用

    注意:通过已上操作,此时的Bean就可以被应用的系统使用,并讲保留在BeanFactory工厂中直到不再需要为止.但我们也可以通过9或者10进行销毁

9、若bean实现了DisposableBean接口,distroy()方法被调用

10、如果指定了destroy-method="close"定制的销毁方法,就调用这个方法

案例分析:

   创建一个实体Bean代码如下:

package www.csdn.spring.dao;


import org.springframework.beans.BeansException;

import org.springframework.beans.factory.BeanFactory;

import org.springframework.beans.factory.BeanFactoryAware;

import org.springframework.beans.factory.BeanNameAware;

import org.springframework.beans.factory.DisposableBean;

import org.springframework.beans.factory.InitializingBean;

import org.springframework.context.ApplicationContext;

import org.springframework.context.ApplicationContextAware;


public class HelloDaoImpl implements BeanNameAware, BeanFactoryAware,

InitializingBean, ApplicationContextAware, DisposableBean {


private String content;


public HelloDaoImpl() {

System.out.println("----------HelloDaoImpl实例化");

}


public void setContent(String content) {

System.out.println("----------通过依赖注入的内容是:" + content);

this.content = content;

}


@Override

public void setBeanName(String beanId) {

System.out.println("----------输出BeanId:" + beanId);

}


@Override

public void setBeanFactory(BeanFactory factory) throws BeansException {

System.out.println("----------factory:" + factory.getClass());


}


@Override

public void setApplicationContext(ApplicationContext applicationContext)

throws BeansException {

System.out.println("----------" + applicationContext);


}


@Override

public void afterPropertiesSet() throws Exception {

System.out.println("----------afterPropertiesSet");

}


public void init() {

System.out.println("----------初始化方法");

}


@Override

public void destroy() throws Exception {

System.out.println("----------bean被销毁");


}


public void close() {

System.out.println("----------close");

}


}


创建BeanPostProcessor实现类

package www.csdn.spring.dao;


import org.springframework.beans.BeansException;

import org.springframework.beans.factory.config.BeanPostProcessor;


public class BeanPostProcessorImpl implements BeanPostProcessor {

@Override

public Object postProcessBeforeInitialization(Object bean, String beanName)

throws BeansException {

System.out.println("我把:" + beanName + "实例化化之前的操作");

return bean;

}


@Override

public Object postProcessAfterInitialization(Object bean, String beanName)

throws BeansException {

System.out.println("我把:" + beanName + "实例化化之后的操作");

return bean;

}


}

在配置文件中配置实体BeanBeanPostProcessorImpl 特殊的Bean

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://www.springframework.org/schema/beans

           http://www.springframework.org/schema/beans/spring-beans.xsd">



<!-- spring容器 就是负责创建、管理、维护Bean 并且能够依赖注入到相应组件上 -->

<bean id="helloDaoImpl" class="www.csdn.spring.dao.HelloDaoImpl"

scope="singleton" lazy-init="false" init-method="init" destroy-method="close">

<!-- 通过set方法注入 -->

<property name="content" value="陈老师早上好!" />

</bean>


<!-- BeanPostProcessor与当前的bean都进行关联 -->

<bean class="www.csdn.spring.dao.BeanPostProcessorImpl" />


</beans>


创建测试类BeanTest 

package www.csdn.spring.bean.cycle;


import org.junit.Test;

import org.springframework.context.ApplicationContext;

import org.springframework.context.ConfigurableApplicationContext;

import org.springframework.context.support.ClassPathXmlApplicationContext;


public class BeanTest {


@Test

public void test() {

ApplicationContext context = new ClassPathXmlApplicationContext(

"classpath:spring-dao.xml");

// 强制造型

ConfigurableApplicationContext cont = (ConfigurableApplicationContext) context;

// 执行关闭 可以考到 destory-method的方法的执行

cont.close();


}

}


执行结果如下:

总结:在ApplicationContextBean的生命周期

2、在 BeanFactoryBean的生命周期

     在BeanFactoryBean的生命周期与ApplicationContextbean的生命周期唯一不同的是:若bean实现了ApplicationContextAware()接口,在ApplicationContextbean的生命周期中setApplicationContext()方法会被调用,而在BeanFactoryBean的生命周期此方法不会被调用。

案例采用上个案例:测试类中测试代码如下:

// 创建资源对象

ClassPathResource resource = new ClassPathResource("spring-dao.xml");

// 采用BeanFactory初始化容器

ConfigurableBeanFactory cbf = new XmlBeanFactory(resource);

// bean后置处理器必须通过addBeanPostProcessor(new BeanPostProcessorImpl())手动添加

cbf.addBeanPostProcessor(new BeanPostProcessorImpl());

//在配置文件中给BeanPostProcessorImpl的bean加上id="beanPostProcessorImpl" //cbf.addBeanPostProcessor(cbf.getBean("beanPostProcessorImpl", BeanPostProcessorImpl.class));

// 获取Bean对象

cbf.getBean("helloDaoImpl", HelloDaoImpl.class);

// 销毁

cbf.destroySingletons();


执行结果:同上


总结:在BeanFactoryBean的生命周期

另外说明:

     应用上下文与bean工厂的另一个重要区别是关于单例bean如何被加载。

bean工厂延迟加载所有bean,直到getBean()方法被调用。

应用上下文会在启动后预载入所有单例bean.这样可确保应用不需要等待他们被创建。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring 基础教程之三:JavaBean生命周期 的相关文章

  • 解决CSGO出现加载某些地图时,进入载入界面闪退游戏的问题

    关于这个问题 我经过steam技术客服的回复后 关键问题在于 我的内存不够用 导致游戏在加载地图资源的时候 内存溢出 导致游戏崩溃 你可以用WIN X在事件查看器 windows日志 应用程序 中看到csgo崩溃的时候留下的错误信息 关于这
  • 原码、反码、补码、移码的作用

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 原码 反码 移码 补码的概念 二 深入理解原码和补码的转换 前言 因为一直不是很清楚原码反码的运算和符号位的关系 故想借此机会一举打好计算机数据表示与处理
  • 灰灰-1081-检查密码

    本题要求你帮助某网站的用户注册模块写一个密码合法性检查的小功能 该网站要求用户设置的密码必须由不少于6个字符组成 并且只能有英文字母 数字和小数点 还必须既有字母也有数字 输入格式 输入第一行给出一个正整数 N 100 随后 N 行 每行给
  • 视频人脸识别和图片人脸识别的关系

    首先解释下视频人脸识别和图片人脸识别的区别 视频人脸识别是基于视频流进行人脸识别 用户的感觉就是直接在视频中就可以识别出人脸 而图片人脸识别 是用户直接上传图片 输出识别结果 图片人脸识别可以描述为 给定某一场景下的静态图象或者动态序列 根
  • ESP32 之 ESP-IDF 教学(十九)—— 在工程或组件中嵌入二进制数据

    本文章 来自原创专栏 ESP32教学专栏 基于ESP IDF 讲解如何使用 ESP IDF 构建 ESP32 程序 发布文章并会持续为已发布文章添加新内容 每篇文章都经过了精打细磨 通过下方对话框进入专栏目录页 CSDN 请求进入目录 O
  • 均值方差分析与风险资产组合

    文章目录 引言 对均值和方差的解释 资产组合的均值方差特性 小结 引言 在前面的文章中 初步介绍了债券和股票的价值评估方法 从中可以看见 用什么样的贴现率来估计未来现金流的现值 是资产定价的关键 在引入不确定性后 贴现率的确定变得更加困难
  • 三极管NPN和PNP的区别

    三极管NPN和PNP的区别 NPN和PNP三极管 其中n表示在高纯度硅中加入磷 指取代一些硅原子 并且在电压的刺激下所产生的自由电子进行导电 而p主要是加入硼取代硅 以此来产生大量的空穴利于导电 两者主要电源极性不同外 其他原理都是一样的
  • 打印出1-10000之间的所有对称数(如121,1331,2442)

    自己想的 for var i 0 i lt 10000 i fn i function fn num var n num toString if n length lt 2 return var prev n substring 0 Mat
  • cesium加载倾斜摄影模型全流程

    ContextCapture构建倾斜摄影模型 先打开ContextCapture Engine软件 这个是Master运行的必要软件 1 打开ContextCapture Master 新建工程 2 影像 添加影像 检查影像文件 3 导入位
  • 最小栈的实现

    实现一个栈 要求实现Push 出栈 Pop 入栈 Min 返回最小值 要求时间复杂度为O 1 可以借助两个栈来解决这个问题 一个栈用来存放栈的数据 其栈顶元素即为当前栈的 另外一个用来存放当前栈的最小元素 具体实现方法如下 首先定义该栈 t
  • 流体动力学控制方程(详细推导)

    CFD建立在流体力学基本控制方程 连续性方程 动量方程 能量方程的基础上 这些方程式任何流动都必须遵守的3个基本物理学原理 这三个方程是这些原理的数学描述 质量守恒定律 牛顿第二定律 能量守恒定律 全部CFD都是基于这些方程的 在开展研究之
  • 解决8080端口被占用导致报错的问题

    win R 输入cmd 回车 输入指令 netstat ano findstr 8080 找到端口对应 输入 taskkill pid 7244 f
  • Original error: gsmCall method is only available for emulators

    在夜神模拟器执行报错 self driver make gsm call 5551234567 GsmCallActions CALL 意思是gsmCall这个命令不支持 只支持下面这些命令 selenium common exceptio
  • Linux和Windows之间传输文件sftp命令

    将win10中的文件 上传到linux系统 Dos中的sftp命令 在dos窗口中输入 sftp cent 10 xx xx 43 根据提示输入用户的密码 在sftp中输入 put hadoop 2 8 5 tar gz home cent
  • Python+Vue计算机毕业设计银行助学贷款管理系统0o571(源码+程序+LW+部署)

    该项目含有源码 文档 程序 数据库 配套开发软件 软件安装教程 项目运行环境配置 Python3 7 7 Django Mysql5 7 pip list HBuilderX Vscode也行 Vue Pychram社区版 项目技术 Dja
  • Python Pandas 图形绘制(一):折线图,柱状图

    Pandas 图形绘制 一 折线图 柱状图 一 折线图 Line Chart 1 1 默认绘制折线图 df plot 1 2 绘制多条折线 二 柱状图 Bar Chart 2 1 垂直柱状图 df plot bar 2 2 叠加柱状图 st

随机推荐

  • 安全测试-优秀测试工程师必备的4项安全测试方法!

    用您5分钟时间阅读完 希望能对您有帮助 一 安全性测试 1 安全性测试方法 测试手段可以进行安全性测试 目前主要安全测试方法有 1 静态的代码安全测试 主要通过对源代码进行安全扫描 根据程序中数据流 控制流 语义等信息与其特有软件安全规则库
  • Couldn‘tparse bundle asset‘“D: \vue\cy_ gw2\dist\js \chunk- vendors.js1Analyzerwi 11usemodule

    报错信息 Couldn tparse bundle asset D vue cy gw2 dist js chunk vendors js1Analyzerwi 11usemodule 报错截图 报错原因 未安装less和less load
  • 从React源码来学hooks是不是更香呢

    本文将讲解 hooks 的执行过程以及常用的 hooks 的源码 hooks 相关数据结构 要理解 hooks 的执行过程 首先想要大家对 hooks 相关的数据结构有所了解 便于后面大家顺畅地阅读代码 Hook 每一个 hooks 方法都
  • 2D平面上的二连杆机器臂反向运动模拟(matlab代码示例)

    2D平面上的二连杆机器臂反向运动模拟 matlab上先下载 robotics system toolbox工具箱 robot rigidBodyTree DataFormat column MaxNumBodies 3 L1 1 the l
  • opencv+python物体检测【03-模仿学习】

    仿照练习 原文链接 步骤一 准备图片 正样本集 正样本集为包含 识别物体 的灰度图 一般大于等于2000张 尺寸不能太大 尺寸太大会导致训练时间过长 负样本集 负样本集为不含 识别物体 的任何图片 一般大于等于5000张 尺寸比正样本集稍大
  • Egg 使用 Sequelize

    npm install save egg sequelize mysql2 在 config plugin js 中引入 egg sequelize 插件 exports sequelize enable true package egg
  • 人工智能与教育融合的文献总结

    一般来说 人工智能与教育融合 首先要重塑教育理念 这是实现 教育 人工智能 的前提 格物斯坦提示 越是科技发达 越需要人性的支撑 教育的本质也是一种能力 生命和智能反映的是个体能力 这是亘古不变的科学原理 人工智能的观点来源于人们对于人工计
  • 数字型字符串千分位加逗号

    在数字型字符串千分位加逗号 param str return public static String addComma String str boolean neg false if str startsWith 处理负数 str str
  • 回调函数(入门篇)

    首先 我们回忆一下 标准库函数printf是如何被我们调用的 1 包含库函数所在的头文件 include
  • Linux sed 利剑之探索

    sed Linux sed命令是利用script来处理文本文件 sed可依照script的指令 来处理 编辑文本文件 Sed主要用来自动编辑一个或多个文件 简化对文件的反复操作 编写转换程序等 语法 sed hnV e
  • Linux防火墙开关命令

    关闭防火墙 systemctl stop firewalld service 停止firewall systemctl disable firewalld service 禁止firewall开机启动 开启端口 firewall cmd z
  • LeetCode算法题 :第三大的数thirdMax

    给定一个非空数组 返回此数组中第三大的数 如果不存在 则返回数组中最大的数 要求算法时间复杂度必须是O n 示例 1 输入 3 2 1 输出 1 解释 第三大的数是 1 示例 2 输入 1 2 输出 2 解释 第三大的数不存在 所以返回最大
  • 区块链笔记4--BTC实现

    1 UTXO 区块链是一个去中心化的账本 比特币采用了 基于交易的账本模式 然而 系统中并无显示记录账户包含BTC数 实际上其需要通过交易记录进行推算 在比特币系统中 全节点需要维护一个名为 UTXO UnspentTransaction
  • Android技术功底不够如何去面试,已整理成文档

    IT行业的前景 近几年来 大数据 人工智能AI 物联网等一些技术不断发展 也让人们看到了IT行业的繁荣与良好的前景 越来越多的高校学府加大了对计算机的投入 设立相应的热门专业来吸引招生 当然也有越来越多的人选择从事这个行业 希望能从这个行业
  • 线性回归介绍及分别使用最小二乘法和梯度下降法对线性回归C++实现

    回归 在这类任务中 计算机程序需要对给定输入预测数值 为了解决这个任务 学习算法需要输出函数f Rn R 除了返回结果的形式不一样外 这类问题和分类问题是很像的 这类任务的一个示例是预测投保人的索赔金额 用于设置保险费 或者预测证券未来的价
  • 进入U盘PE系统无法识别硬盘分区的原因分析和解决方法

    进入U盘PE系统无法识别硬盘分区的原因分析和解决方法 时间 2015 07 15 来源 http www xitongtiandi com 复制网址 进入U盘PE系统无法识别硬盘分区的原因分析和解决方法分享给大家 PE Windows PE
  • Sqli-labs靶场详细攻略Less 23-28a

    Less 23 28a Less 23 GET Error based strip comments 这一关还是使用get方法进行注入 不过这次对 这些用于注释的字符做了过滤 这样我们可以使用两个 进行绕过 第一个 用于闭合原代码语句中的前
  • 【建议收藏】11+实战技巧,让你轻松从Vue过渡到React

    前言 在这个卷神辈出的时代 只是熟练Vue的胖头鱼 已经被毒打过多次了 面试中曾被质疑 你居然不会React 我无语凝噎 不知说啥是好 这篇文章尝试将Vue中一些常见的功能在React中实现一遍 如果你恰巧是Vue转React 或者Reac
  • Shell笔记--Shell使用系统变量、自定义变量、特殊变量和运算符

    目录 1 Shell使用系统变量 2 Shell使用自定义变量 3 特殊变量 3 1 n 3 2 3 3 和 3 4 4 运算符 1 Shell使用系统变量 常用的系统变量有 HOME PWD SHELL USER 等 echo HOME
  • Spring 基础教程之三:JavaBean生命周期

    Spring中Bean 的生命周期 在学习 spring 的过程中 bean 的生命周期理解对学习 spring 有很大的帮助 下面我就分别介绍在 ApplicationContext 和 BeanFactory 中 Bean 的生命周期