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

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注册

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/140401.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

ardupilot的编译过程

环境 树莓派4b ubuntu20.04 git 2.25.1 python3.8.10 pixhawk2.4.8 下载源码 (已经配置好git环境和ssh) git clone --recurse-submodules gitgithub.com:ArduPilot/ardupilot.gitcd ardupilotgit status使用git status检查是否下载完整 如果不完整&a…

自主研究,开发并产业化的一套UWB精确定位系统源码 UWB源码

UWB (ULTRA WIDE BAND) 技术是一种无线载波通讯技术,它不采用正弦载波,而是利用纳秒级的非正弦波窄脉冲传输数据,因此其所占的频谱范围很宽。UWB定位系统研发团队依托在移动通信,雷达,微波电路,云计算与大数…

黑马JVM总结(二十)

(1)GC_调优老年代 CMS是低响应时间的,并发的一个垃圾回收器 ,有这样一个缺点,因为在垃圾回收的同时,其他的用户线程也在运行,就会产生新的垃圾这个新的垃圾称为浮动垃圾,如果浮动垃…

基于Xml方式Bean的配置-命名空间种类

Spring的标签 Spring的xml标签大体上分为两类&#xff0c;一种是默认标签&#xff0c;一种是自定义标签 默认标签&#xff1a;就是不用额外导入其它命名空间约束的标签&#xff0c;例如<bean>标签 标签作用 <beans> 一般作为xml配置根标签&#xff0c;其他标签都是…

网络防御--防火墙

拓扑 Cloud 1 作为电脑与ENSP的桥梁 防火墙配置 登录防火墙 配置IP地址及安全区域 添加地址对象 配置策略 1、内网可以访问服务器 结果 2、内网可以访问公网 结果 配置NAT策略 结果

uniapp中vue3使用uni.createSelectorQuery().in(this)报错

因为VUE3中使用setup没有this作用域&#xff0c;所以报错 解决办法&#xff1a;使用getCurrentInstance()方法获取组件实例 import { getCurrentInstance } from vue;const instance getCurrentInstance(); // 获取组件实例 const DOMArr uni.createSelectorQuery().in(ins…

在Idea中调试本地Docker

报错&#xff1a; Error running myApp: Unable to open debugger port (localhost:5005): java.net.SocketException "Connection reset" 原因&#xff1a; Docker配置里边没有配置环境变量JAVA_TOOL_OPTIONS. 解决&#xff1a; 在Docker下加入运行时的环境变量JAVA…

如何使用固态硬盘+硬盘盒子+U盘创造移动双系统

本文背景 这学期上了一节鸟水课《大数据实践》&#xff0c;老师要求扩展硬盘盒&#xff0c;以部署大数据工具进行 机器挖掘等大数据领域工作 参考视频链接&#xff1a;无需启动盘&#xff0c;用虚拟机将ubuntu安装到移动硬盘上_哔哩哔哩_bilibili 项目使用设备 1.绿联&#…

Linux 查看权限控制

1、认知权限信息 通过ls -l 可以以列表形式查看内容&#xff0c;并显示权限细节 序号1&#xff0c;表示文件、文件夹的权限控制信息 序号2&#xff0c;表示文件、文件夹所属用户 序号3&#xff0c;表示文件、文件夹所属用户组 2、权限细节 权限细节总共分为10个槽位 举例&…

NodeJs——npm

文章目录 写在前面一、dependencies、devDependencies和peerDependencies区别&#xff1a;二、需要牢记的npm命令2.1 npm2.2 npm config list2.3 npm配置镜像源 三、npm install 的原理四、package-lock.json的作用五、npm run 的原理六、npx6.1 npx是什么6.2 npx的优势6.3 npm…

安防视频/视频汇聚平台EasyCVR使用onvif探测添加设备通道详细步骤来啦!

视频云存储/安防监控EasyCVR视频汇聚平台基于云边端智能协同&#xff0c;支持海量视频的轻量化接入与汇聚、转码与处理、全网智能分发、视频集中存储等。音视频流媒体视频平台EasyCVR拓展性强&#xff0c;视频能力丰富&#xff0c;具体可实现视频监控直播、视频轮播、视频录像、…

Mysql002:(库和表)操作SQL语句

目录&#xff1a; 》SQL通用规则说明 SQL分类&#xff1a; 》DDL&#xff08;数据定义&#xff1a;用于操作数据库、表、字段&#xff09; 》DML&#xff08;数据编辑&#xff1a;用于对表中的数据进行增删改&#xff09; 》DQL&#xff08;数据查询&#xff1a;用于对表中的数…

idea更改java项目名

做了一个普通的java项目&#xff08;使用socket进行网络通信的练手项目&#xff09;&#xff0c;需要更改项目名&#xff0c;更改过程记录在这里。 修改项目名可能会出现很多错误&#xff0c;建议先备份当前项目 1.在idea里&#xff0c;右键项目名——》选择Refactor——》选择…

Nginx 设置禁用 OPTIONS 请求

1、修改 nginx 配置 在 nginx.conf 配置文件中&#xff0c;增加如下内容&#xff1a; if ($request_method ~* OPTIONS) {return 403; }效果如下&#xff1a; 2、重启 nginx 服务 systemctl restart nginx或者 service nginx restart3、功能验证 使用如下命令&#xff…

基于最近电平逼近的开环MMC逆变器MATLAB仿真模型

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 模型介绍&#xff1a; MATLAB21b版本 DC:12kV&#xff0c;N&#xff1d;12&#xff0c; 采用最近电平逼近调制&#xff0c;采用基于排序的均压方法&#xff0c;冒泡排序&#xff0b;桥臂电流方向判断。 连接…

STL-函数对象、谓词、常用算法

函数对象 函数对象概念 重载函数调用操作符的类&#xff0c;其对象常称为函数对象 函数对象使用重载的()时&#xff0c;行为类似函数调用&#xff0c;也叫仿函数 本质&#xff1a; 函数对象&#xff08;仿函数&#xff09;是一个类&#xff0c;不是一个函数 函数对象使用…

git 推送出现fatal: The remote end hung up unexpectedly解决方案

在使用git更新或提交项目时候出现 "fatal: The remote end hung up unexpectedly " 的报错&#xff1b; 报错的原因原因是推送的文件太大。 下面给出解决方法 方法一&#xff1a; 修改提交缓存大小为500M&#xff0c;或者更大的数字 git config --global http.po…

企业申报“专精特新”,对知识产权有哪些要求?

深科信从深圳市中小企业服务局发布的公开数据中了解到&#xff0c;2022年深圳市专精特新中小企业申报8000余家&#xff0c;通过4800余家。2023年深圳市专精特新企业认定火热申报中&#xff0c;10月15日截止。 成为“专精特新”企业有什么好处? 1.国家级资质强力背书&#xff…

Docker搭建DNS服务器--nouse

前言 DNS服务器是(Domain Name System或者Domain Name Service)域名系统或者域名服务,域名系统为Internet上的主机分配域名地址和IP地址。 安装 2.1 实验环境 IP 系统版本 角色 192.168.40.121 Ubuntu 22.10 DNS服务器 192.168.40.122 Ubuntu 22.10 测试机器 2.2 …

尚硅谷wepack课程学习笔记

为什么需要使用打包工具&#xff1f; 开发时使用的框架、es6 语法 、less 等浏览器无法识别。 需要经过编译成浏览器能识别的css、js才可以运行。 打包工具可以帮我们编译&#xff0c;号可以做代码压缩、兼容处理、性能优化。 常见的打包工具有什么&#xff1f; vite、webpac…