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

news2024/11/18 17:49:20

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");
    }

    @Override
    public void setBeanClassLoader(ClassLoader classLoader) {
        System.out.println("这个Bean的类加载器:"+classLoader);
    }

    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        System.out.println("这个Bean的BeanFactory:"+beanFactory);
    }

    @Override
    public void setBeanName(String name) {
        System.out.println("这个Bean的Name:"+name);
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("InitializingBean的afterPropertiesSet方法");
    }

    @Override
    public 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.coloradmin.cn/o/1035961.html

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

相关文章

乐得瑞推出1拖2功率分配快充线方案,支持数据传输

随着PD3.1协议的市场应用越来越多,一些充电器的Type-C接口的输出功率达到百瓦及以上,如何充分利用好这类充电器设备,乐得瑞电子推出1拖2快充线缆解决方案,支持智能功率分配策略。 上图是乐得瑞1拖2功率分配快充线样线实物&#…

力扣刷题-链表-设计链表

题意: 在链表类中实现这些功能: get(index):获取链表中第 index 个节点的值。如果索引无效,则返回-1。 addAtHead(val):在链表的第一个元素之前添加一个值为 val 的节点。插入后,新节点将成为链表的第一个节…

哈希 -- 开散列(哈希桶)

拉链法 这里我们要是用string(string来做key)来取模,再增加一个模板参数,配一个取模的仿函数即可

leetcode 133. 克隆图

leetcode 133. 克隆图 给你无向 连通 图中一个节点的引用,请你返回该图的 深拷贝(克隆)。 图中的每个节点都包含它的值 val(int) 和其邻居的列表(list[Node])。 class Node { public int val;…

Flex布局是什么?

一、Flex布局是什么? Flex是Flexible Box的缩写,意为”弹性布局”,用来为盒状模型提供最大的灵活性。 注意,设为Flex布局以后,子元素的float、clear和vertical-align属性将失效。 二、基本概念 采用Flex布局的元素…

基于JavaWeb(Servlet+jsp)的个人通讯录管理系统(含实验报告)

基于JavaWeb(Servletjsp)的个人通讯录管理系统(含实验报告) 项目简介项目获取开发环境项目技术运行截图 项目简介 本项目为简单的基于Javaweb实现的个人通讯录管理系统,实现主要功能为用户注册登录、首页展示、用户联…

C++——如何正确的使用STL中的vector?

什么是vector? 在STL(标准模板库)中,vector是一种动态数组容器,可根据需要自动增长或缩小。它可以存储任意类型的元素,并且支持快速的随机访问。 vector是表示可变大小数组的序列容器vector采用的是连续的…

Java面试题整理(带答案)

目录 TCP和UDP的区别 get和post的区别 Cookie和session的区别 Java的基本类型有哪些? 抽象类和接口区别? 对于堆栈的理解 和equals区别 如何理解Java多态? 创建线程都有哪些方式 脏读、不可重复度、幻读都是什么? Jav…

YUM 升级 PHP7

文章目录 YUM 升级 PHP71. 查看当前 PHP 信息2. YUM 安装 PHP73. 查看 PHP 版本4. 启动PHP-FPM YUM 升级 PHP7 参考地址:网站地址 参考地址:网站地址 1. 查看当前 PHP 信息 # 查看 PHP 版本信息 php -v# 查看 yum 源中 PHP 信息 yum list | grep php2. …

最美壁纸小程序源码全新修复版 带激励广告

最美壁纸小程序源码全新修复版,带激励广告,刚刚修复的,程序包里有安全域名与广告id配置说明,这个源码无PHP后台发布后添加合法域名就可以了。 源码下载:https://download.csdn.net/download/m0_66047725/88368720

【vscode设置ctrl+滑轮调节代码字体大小】

vscode设置ctrl滑轮调节代码字体大小 打开设置之后在搜索框中输入"editor.mouseWheelZoom": true,勾选上对勾就OK了! “editor.mouseWheelZoom”: true

左神高阶进阶班4 (尼姆博弈问题、k伪进制、递归到动态规划、优先级结合的递归套路、子串的递归套路,子序列的递归套路,动态规划的压缩技巧)

目录 【案例1 尼姆博弈问题】 【题目描述】 【思路解析】 【代码实现】 【案例2 k伪进制问题】 【题目描述】 【思路解析】 【代码实现】 【案例3 最大路径和】 【题目描述】 【思路解析】 【代码实现】 【案例4 优先级的递归套路】 【题目描述】 【思路解析】…

【Vue】ElementUI实现登录注册+axios全局配置+CORS跨域

目录 一、搭建项目 1.1 安装 Element-UI 1.2 导入组件 1.3 创建登录、注册界面 二、后台交互 2.1 引入axios 2.2 添加vue-axios的全局配置 2.2 ssm项目准备 (后端) 2.2.1 准备数据表 2.2.2 导入ssm项目 2.2.3 编写控制器 2.3 前端编写 2.4 登入测试 2.5 注册测试…

亚马逊云科技携手西门子运用生成式AI之力,打破数据孤岛

2023年,以基于GPT模型对话应用为代表的生成式AI浪潮席卷全球,引起企业广泛关注。自此,由生成式AI引导的企业变革序幕全面展开,企业向数智化转型迈出了坚实的一步。 西门子股份公司(以下简称“西门子”)是一…

《C++ primer》练习6.54-6.56:函数指针定义并调用

《C primer》里面讲到函数指针定义并调用&#xff0c;做一下练习6.54-6.56&#xff0c;题目如下&#xff1a; vector元素的类型是函数指针的类型是int (*)(int, int)&#xff0c;指向的元素是有两个int形参&#xff0c;返回类型也是int的函数。 #include <vector> #incl…

如何利用人才测评系统提升企业招聘效率

公司需要的是能产出价值的员工&#xff0c;但是要想找到完全符合条件的员工&#xff0c;其实并不容易&#xff0c;尽管应聘的人数很多&#xff0c;但不是跳槽的&#xff0c;就是转行的&#xff0c;要么就只能从应届生培养开始了。 从招聘流程上&#xff0c;以现在的模式&…

使用 PyTorch 的计算机视觉简介 (6/6)

一、说明 本文主要介绍CNN中在pytorch的实现&#xff0c;其中MobileNet 网络&#xff0c;数据集来源&#xff0c;以及训练过程&#xff0c;模型生成和存储&#xff0c;模型调入等。 二、轻量级网络和移动网络 我们已经看到&#xff0c;复杂的网络需要大量的计算资源&#xff0c…

4位密码锁可修改密码及错误报警VHDL

名称&#xff1a;4位密码锁可修改密码及错误报警&#xff08;代码在文末付费下载&#xff09; 软件&#xff1a;Quartus 语言&#xff1a;VHDL 要求&#xff1a; 按键包括&#xff0c;0~9&#xff0c;确认&#xff0c;重置&#xff0c;修改,密码4位 要能设定密码&#xff0c…

【PowerQuery】Python自动刷新本地数据

Python数据刷新是开发爱好者和开发人员开发的PowerBI刷新模块进行数据刷新的手段,Python进行数据刷新是通过刷新PowerBI Desktop 的模式进行数据刷新。目前常用的Python的数据刷新模块是PbixRefresher,图为相关的模块和版本。 由于当前的脚本基于英文版本的PowerBI Desktop进…

罗德里格斯公式

1.点乘 A ⃗ ⋅ B ⃗ ∣ A ⃗ ∣ ∣ B ⃗ ∣ c o s ⟨ A ⃗ , B ⃗ ⟩ \vec{A} \cdot \vec{B} \left | \vec{A} \right | \left | \vec{B} \right | cos\left \langle \vec{A}, \vec{B} \right \rangle A ⋅B ​A ​ ​B ​cos⟨A ,B ⟩ 对应几何意义&#xff1a;向量 A ⃗…