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

Spring学习笔记7 Bean的生命周期

Spring学习笔记6 Bean的实例化方式_biubiubiu0706的博客-CSDN博客

Spring其实就是一个管理Bean对象的工厂.它负责对象的创建,对象的销毁.

这样我们才可以知道在哪个时间节点上调用了哪个类的哪个方法,知道代码该写在哪里

Bean的生命周期之粗略5步

Bean生命周期的管理可以参考Spring的源码:

AbstractAutowireCapableBeanFactory

Bean的生命周期之粗略7步

比前面增加了两步,这两步放在上面第三步:初始化Bean  自定义init方法的前后

可以假如"Bean后处理器"

需要这个类实现BeanPostProcessor类,并重写before和after方法

Bean的生命周期10步

就是又增加了三个接口

Aware相关的接口包括:BeanNameAware,BeanClassLoaderAware,BeanFactoryAware

当Bean实现了BeanNameAware,Spring会将Bean的名字传递给Bean

当Bean实现了BeanClassLoaderAware,Spring会将加载该Bean的类加载器传递给Bean

当Bean实现了BeanFactoryAware,Spring会将Bean工厂对象传递给Bean

测试以上十步,让类实现5个接口,并实现所有方法:

BeanNameAware

BeanClassLoaderAware

BeanFactoryAware

InitializingBean

DisposableBean

package com.example.bean;import org.springframework.beans.BeansException;
import org.springframework.beans.factory.*;/*** Bean的生命周期按照粗略的5步:* 1.实例化Bean(调用无参构造方法)* 2.给Bean属性赋值(调用set方法)* 3.调用init方法,注意这个init方法需要自己写,自己配(方法名随意)* 4.可以使用bean* 5.销毁Bean,会调用destroy方法,需要自己写,自己配(方法名随意)* @author hrui* @date 2023/9/24 3:16*/
public class User implements BeanNameAware, BeanClassLoaderAware, BeanFactoryAware, InitializingBean ,DisposableBean{private String name;public void setName(String name) {System.out.println("第二步:给对象属性赋值");this.name = name;}public User() {System.out.println("第一步,无参构造方法执行");}public void initBean(){System.out.println("第三步:调用initBean方法");}public void destoryBean(){System.out.println("第五步:destoryBean方法销毁Bean");}@Overridepublic void setBeanClassLoader(ClassLoader classLoader) {System.out.println("这个Bean的类加载器:"+classLoader);}@Overridepublic void setBeanFactory(BeanFactory beanFactory) throws BeansException {System.out.println("这个Bean的BeanFactory:"+beanFactory);}@Overridepublic void setBeanName(String name) {System.out.println("这个Bean的Name:"+name);}@Overridepublic void afterPropertiesSet() throws Exception {System.out.println("InitializingBean的afterPropertiesSet方法");}@Overridepublic void destroy() throws Exception {System.out.println("DisposableBean的destroy方法");}
}

Bean的生命周期中,不同的作用域有不同的管理方式

Spring是根据Bean的作用域来选择管理方式的.

对于singleton作用域的Bean,Spring能够精确地知道该Bean何时被创建,合适初始化,以及何时被销毁

而对于protoType作用域的Bean,Spring只负责创建,当容器创建了Bean的实例后,Bean的实例就交给客户端代码管理,Spring容器将不再跟踪其生命周期.

Spring容器只对singleton的bean进行完整的生命周期管理

如果是prototype作用域的Bean,Spring容器只负责将该Bean初始化完毕.等客户端程序一旦获取到该Bean之后,Spring容器就不再管理该对象生命周期

也就是说scope是prottype的Bean执行完"Bean后处理器"交给客户端使用后就不管了

将自己new的对象让Spring管理

有时候可能会遇到这样的需求,某个java对象是我们自己new的,然后我们希望这个对象被Spring容器管理,怎么实现.

之前都是Spring配置文件中配置,然后纳入Spring容器管理

如果我们想让该对象让Spring容器管理,但是又不想在配置文件里配置怎么办

例如

但是这个Bean并不由Spring管理

怎么办?用

DefaultListableBeanFactory注册

相关文章:

Spring学习笔记7 Bean的生命周期

Spring学习笔记6 Bean的实例化方式_biubiubiu0706的博客-CSDN博客 Spring其实就是一个管理Bean对象的工厂.它负责对象的创建,对象的销毁. 这样我们才可以知道在哪个时间节点上调用了哪个类的哪个方法,知道代码该写在哪里 Bean的生命周期之粗略5步 Bean生命周期的管理可以参考S…...

React 如何导出excel

在现代的Web开发中,数据导出是一个非常常见的需求。而在React应用中,我们经常需要将数据导出为Excel文件,以便用户可以轻松地在本地计算机上查看和编辑。本文将介绍如何在React应用中实现导出Excel文件的功能。 章节一:安装依赖 …...

Texlive2020 for win10 宏包更新

用命令提示符更新texlive的宏包,这个方法非常简单实用 1.以管理员身份打开命令提示符 2.系统自动选择镜像网站 tlmgr option repository ctan 3.更新宏包 tlmgr update --self --all 其中–self参数表示升级tlmgr本身,–all表示升级所有宏包,这样就可以将所有宏包更新了 4.列…...

Ps 在用鼠标滚轮缩放图片时,速度太快?

1.原因 在于安装了第三方鼠标优化软件Mos,它起着对第三方鼠标全局浏览效果的优化,使浏览更加顺滑,而不精确,消除了mac使用第三方鼠标浏览页面时的卡顿问题。这也使得像ps、ai这类软件,在进行页面缩放时,变得…...

基于docker进行Grafana + prometheus实现服务监听

基于docker进行Grafana Prometheus实现服务监听 Grafana安装Prometheus安装Jvm监控配置服务器主机监控(基础cpu,内存,磁盘,网络) Grafana安装 docker pull grafana/grafanamkdir /server/grafanachmod 777 /server/grafanadocker run -d -p…...

模型层及ORM介绍

模型层及ORM介绍 模型层 负责跟数据库之间进行通信 配置MySQL,下载MySQLclient 创建数据库 进入mysql数据库执行create database 数据库名 default charset utf8通常数据库名跟项目名保持一致settings.py里进行数据库的配置修改 DATABASES 配置项的内容&#x…...

QQ邮箱怎么设置SMTP接口服务器?

在现如今信息快速传递的时代,邮件已成为我们工作、学习和生活中必不可少的一部分。而作为每位用户必备的一款邮箱,QQ邮箱一直以其稳定、高效、安全的特点深受大家的青睐。但是你是否觉得每次发邮件都需要打开QQ邮箱网页,进行繁琐的操作很是麻…...

【操作系统笔记四】高速缓存

CPU 高速缓存 存储器的分层结构: 问题:为什么这种存储器层次结构行之有效呢? 衡量 CPU 性能的两个指标: 响应时间(或执行时间):执行一条指令平均时间 吞吐量,就是 1 秒内 CPU 可以…...

uniapp获取openid

要获取用户的openid,需要使用微信小程序的登录API。以下是一个简单的示例代码: // 在page中引入wx-login组件 import wxLogin from /components/wx-loginexport default {components: { wxLogin },data() {return {openid: }},methods: {// wxLogin组件…...

测试工程师面试之设计测试用例

以下的问题答案,仅供参考,如小伙伴们有更好的答案,欢迎大家评论区留言,谢谢大家 测试工程师面试之设计测试用例 1、请说一说简单用户界面登陆过程都需要做哪些分析2、 请对此系统设计测试用例:一个系统,多个…...

html页面仿word文档样式(vue页面也适用)

目录 文章title&#xff1a; 标题&#xff1a; 正文&#xff1a; 完整代码&#xff1a; 页面效果&#xff1a; 文章title&#xff1a; <div><h3 style"display: flex;justify-content: center; align-items: center; color: #000;">实验室招新报名公…...

如何在控制台打印sql语句

步骤一&#xff1a; log4j2.xml中做以下配置 <logger name"xxx.infrastructure.mysql.mapper"level"debug" additivity"false"><appender-ref ref"Console"/></logger>步骤二&#xff1a;IDEA下载Free Mybatis Plu…...

【Vue3 源码解析】reactive 全家桶

// 泛型约束&#xff1a;只能传入引用类型 export function reactive<T extends object>(target: T): UnwrapNestedRefs<T> // 判断只读&#xff0c;否则创建reactive响应式对象 export function reactive(target: object) {// if trying to observe a readonly pr…...

目标检测YOLO实战应用案例100讲-基于YOLO的遥感目标检测(续)

目录 3.4 YOLOv3 3.5 YOLOv4 3.6 YOLOv5 改进的YOLOv4算法 4.1 Triple Loss损失函数的应用...

7.5 通过API判断进程状态

进程状态的判断包括验证进程是否存在&#xff0c;实现方法是通过枚举系统内的所有进程信息&#xff0c;并将该进程名通过CharLowerBuff转换为小写&#xff0c;当转换为小写模式后则就可以通过使用strcmp函数对比&#xff0c;如果发现继承存在则返回该进程的PID信息&#xff0c;…...

你写过的最蠢的代码是?

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页: &#x1f405;&#x1f43e;猫头虎的博客&#x1f390;《面试题大全专栏》 &#x1f995; 文章图文并茂&#x1f996…...

MySQL与PostgreSQL对比

MySQLPostgreSQL数据类型支持支持JSON&#xff0c;但不如PostgreSQL支持更多的数据类型&#xff0c;如数组、hstore、JSON、JSONB、范围类型等扩展性有一些扩展性&#xff0c;但不如PostgreSQL支持自定义数据类型、函数、操作符&#xff0c;具有强大的扩展性SQL兼容性遵循SQL标…...

AD拼板技巧

AD拼板设置 如图&#xff0c;有一个需要拼板的PCB&#xff0c;想要在生产是拼接生产&#xff0c;节省材料。 操作如下&#xff1a; 1、全选如下&#xff0c;按复制CtrlC。 2、把输入法调整至英文&#xff0c;按快捷键E&#xff08;先&#xff09;&#xff0c; A&#xff08;后…...

Android滑动片段

本文所有的代码均存于 https://github.com/MADMAX110/BitsandPizzas 回到BitsandPizzas应用&#xff0c;之前已经创建过创建订单和发出反馈等功能。 修改披萨应用&#xff0c;让它使用标签页导航。在工具条下显示一组标签页&#xff0c;每个选项对应一个不同的标签页。用户单击…...

【力扣-每日一题】337. 打家劫舍 III

class Solution { public:pair<int,int> dfs_rob(TreeNode *root){//如果为根节点if(rootnullptr)return {0,0};auto [l,l_n]dfs_rob(root->left);auto [r,r_n]dfs_rob(root->right);int ol_nr_nroot->val;//当前节点偷&#xff0c;所获得的利益,子节点不能偷in…...

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

css实现圆环展示百分比,根据值动态展示所占比例

代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...

练习(含atoi的模拟实现,自定义类型等练习)

一、结构体大小的计算及位段 &#xff08;结构体大小计算及位段 详解请看&#xff1a;自定义类型&#xff1a;结构体进阶-CSDN博客&#xff09; 1.在32位系统环境&#xff0c;编译选项为4字节对齐&#xff0c;那么sizeof(A)和sizeof(B)是多少&#xff1f; #pragma pack(4)st…...

ssc377d修改flash分区大小

1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...

基于当前项目通过npm包形式暴露公共组件

1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹&#xff0c;并新增内容 3.创建package文件夹...

【JavaSE】绘图与事件入门学习笔记

-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角&#xff0c;以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向&#xff0c;距离坐标原点x个像素;第二个是y坐标&#xff0c;表示当前位置为垂直方向&#xff0c;距离坐标原点y个像素。 坐标体系-像素 …...

ArcGIS Pro制作水平横向图例+多级标注

今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作&#xff1a;ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等&#xff08;ArcGIS出图图例8大技巧&#xff09;&#xff0c;那这次我们看看ArcGIS Pro如何更加快捷的操作。…...

MySQL用户和授权

开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务&#xff1a; test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...

OPENCV形态学基础之二腐蚀

一.腐蚀的原理 (图1) 数学表达式&#xff1a;dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一&#xff0c;腐蚀跟膨胀属于反向操作&#xff0c;膨胀是把图像图像变大&#xff0c;而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...

NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合

在汽车智能化的汹涌浪潮中&#xff0c;车辆不再仅仅是传统的交通工具&#xff0c;而是逐步演变为高度智能的移动终端。这一转变的核心支撑&#xff0c;来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒&#xff08;T-Box&#xff09;方案&#xff1a;NXP S32K146 与…...