Bean 的生命周期

news2024/11/15 16:28:03

观前提示:本篇博客演示使用的 IDEA 版本为2021.3.3版本,使用的是Java8(又名jdk1.8)

电脑使用的操作系统版本为 Windows 10


目录

Spring 的执行流程

1. 启动容器

2. 根据配置完成 Bean 的初始化

3. 注册 Bean 对象到容器中

4. 装配 Bean 的属性

Bean 的生命周期

Bean 的生命周期代码演示


Spring 的执行流程

在看 Bean 的生命周期之前需要先简单了解一下 Spring 的执行流程

1. 启动容器

ApplicationContext 启动容器

2. 根据配置完成 Bean 的初始化

 

加载配置文件:类加载路径下的 Beans.xml 

3. 注册 Bean 对象到容器中

 

扫描 org.example 包. 扫描有没有五大类注解, 只有在包扫描的路径上的类, 且使用 Spring 的注解才可以被注册到容器中. 

4. 装配 Bean 的属性

 

如果 Bean 对象需要使用其他 Bean 对象作为属性, 可以使用注解 @Autowired 和 @Resource

Bean 的生命周期

⽣命周期指的是⼀个对象从诞⽣到销毁的整个⽣命过程,我们把这个过程就叫做⼀个对象的⽣命周期。

Bean 的⽣命周期分为以下 5 ⼤部分:

1. 开辟内存空间: 实例化 ≠ 初始化

2. 设置属性 (注入属性)

3. 初始化

    3.1 各种通知

    3.2 初始化前置方法

    3.3 初始化方法(两种实现方式: xml 方式, 注解方式)

    3.4 初始化后置方法

4. 使用 Bean

5. 销毁对象

 

Bean 的生命周期代码演示

初始化方法演示

先在 com.java.demo.component 创建一个类, 叫做 BeanComponent, 然后再 spring-config.xml 里面设置 Bean

<bean id="beanComponent" class="com.java.demo.component.BeanComponent" ></bean>

这步是初始化的通知

BeanComponent 实现接口 BeanNameAware ,就可以操作下面的 @Override 里面的内容, 比如打印 Bean的名字

package com.java.demo.component;

import org.springframework.beans.factory.BeanNameAware;

public class BeanComponent implements BeanNameAware {
    @Override
    public void setBeanName(String s) {
        System.out.println("执行了通知 BeanName -> " + s);
    }
}

因为初始化方法用得少.所以这步演示前置初始化方法的 xml 方式

在 spring-config.xml 里面写 init-method

可以看到他有很多方法

 

 

这里只需要 init-method 

<bean id="beanComponent" class="com.java.demo.component.BeanComponent" init-method="myInit"></bean>

再回到 BeanComponent 写 myInit 方法, 注意名字保持一致

package com.java.demo.component;

import org.springframework.beans.factory.BeanNameAware;

import javax.annotation.PostConstruct;

public class BeanComponent implements BeanNameAware {
    @Override
    public void setBeanName(String s) {
        System.out.println("执行了通知 BeanName -> " + s);
    }

    // xml 方式的初始化方法
    public void myInit(){
        System.out.println("xml 方式的初始化方法");
    }

    // 注解方式的初始化方法
    @PostConstruct
    public void doPostConstruct(){
        System.out.println("注解方式的初始化方法");
    }

    //使用 Bean
    public void sayHi(){
        System.out.println("执行 sayHi()");
    }
}

到此初始化方法全部执行完,也可以加上销毁

注解的方式执行销毁

@PreDestroy
    public void doPreDestroy(){
        System.out.println("doPreDestroy");
    }

回到 APP 里面执行

import com.java.demo.component.BeanComponent;
import com.java.demo.controller.UserController;
import com.java.demo.controller.UserController2;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class App {
    public static void main(String[] args) {
        //不使用 ApplicationContext 而使用 ClassPathXmlApplicationContext
        //因为 ApplicationContext 没有销毁方法, 而 ClassPathXmlApplicationContext 有销毁方法
        ClassPathXmlApplicationContext context =
                new ClassPathXmlApplicationContext("spring-config.xml");
        BeanComponent component = context.getBean("beanComponent", BeanComponent.class);
        //使用 Bean
        component.sayHi();
        //销毁 Bean
        context.destroy();
    }
}

符合预期

注意: 注解方式的初始化方法优先级比 xml 的初始化方法优先级高,因为主流是 注解

如果,注释掉 

context.destroy();

最后的  doPreDestroy, 就不会执行


本文完,感谢观看,不足之处请在评论区指出 !

 

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

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

相关文章

掌握Python的X篇_2_Python的安装

掌握Python的X篇_2_Python的安装 1. 软件安装包下载1.1 Python版本的区别1.2 同一版本不同安装包的区别 2. 安装过程3. 验证是否安装成功 1. 软件安装包下载 下载地址&#xff1a;https://www.python.org/downloads/ 可以看到最新版本和历史版本 1.1 Python版本的区别 就像…

express的使用(五) 简单的使用mongodb

原文链接 express的使用(五) 简单的使用mongodb 不要脸的求关注&#xff0c;希望能让大家批评我的不足点&#xff0c;一键三连最好了 看前提示 本篇主要描述关于express中使用mongodb以及mongodb的简单介绍还有初步使用&#xff0c;不涉及任何常用的语法&#xff0c;不建议有…

算法刷题-双指针-反转链表

反转链表的写法很简单&#xff0c;一些同学甚至可以背下来但过一阵就忘了该咋写&#xff0c;主要是因为没有理解真正的反转过程。 206.反转链表 力扣题目链接 题意&#xff1a;反转一个单链表。 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2-…

AMD CPU微架构分析

一、SoC架构 1.1 整体架构 Zeppelin 参考链接&#xff1a;wikichip: Zeppelin 通过infinity fabric总线将单die分成多die的SoC架构&#xff0c;每个Die包含两个CPU核&#xff08;CCX&#xff09;、2各DDR通道、USB、低功耗IO以及多个IFOP和IFIS serdes接口。 如下所述中&…

干翻Mybatis源码系列之第十篇:Mybatis Plugins基本概念与拦截概述

给自己的每日一句 不从恶人的计谋&#xff0c;不站罪人的道路&#xff0c;不坐亵慢人的座位&#xff0c;惟喜爱耶和华的律法&#xff0c;昼夜思想&#xff0c;这人便为有福&#xff01;他要像一棵树栽在溪水旁&#xff0c;按时候结果子&#xff0c;叶子也不枯干。凡他所做的尽…

vue jointjs 拓扑图 自定义shape 按需引入

只展示部分核心代码&#xff0c;完整代码见文章尾部连接 import jointjs/dist/joint.core.css;// 类库 包含: Paper Graph Cell CellView Element Link 等等 import { dia } from jointjs/src/core.mjs; // 样式库 包含多个分组(basic standard custom ...) import * as standa…

基于Hexo和Butterfly创建个人技术博客,(11) 使用插件增强博客站点能力

Butterfly官方网站&#xff0c;请 点击进入 本章目标&#xff1a; 掌握常用的plugin插件的用法&#xff0c;本文中是butterfly主题内置集成的第三方插件(部分插件需要再次安装)&#xff1b; 一、建议开启的三方插件 KaTeX-数学公式 katex:enable: true# true 表示每一页都加载…

C# NX二次开发:通过UFUN函数获取刀具描述,目录号,库号等信息

今天要将的是&#xff0c;在NX中对CAM模块进行二次开发的时候&#xff0c;往往需要获取一些关于刀具使用的信息&#xff0c;这些信息用NXOPEN的的方法录制也可以录制出来&#xff0c;但是录制出来的代码&#xff0c;往往都是一种刀具类型会出现一个Builder。这样在你不知道有多…

淘宝买家订单API

目录 下载安装与运行 支持的订单读取方式 请求数据格式一 请求头示例 数据格式说明 数据格式示例 返回数据格式一 返回头示例 数据格式说明 数据格式示例 请求数据格式二&#xff08;根据订单编号&#xff09; 请求头示例 返回数据格式二&#xff08;根据订单编号…

【随笔记】如何获得铁粉(仅供参考)

文章目录 一、前言二、秘籍2.1 良好的个人简介2.2 统一的文章格式2.3 详细的专栏划分2.4 有序的博客排版2.4.1 目录部分2.4.2 正文部分2.4.2.1 标题分级2.4.2.2 正文分段2.4.2.3 善用多级列表2.4.2.4 章节分割 三、总结 一、前言 在这篇随笔记的开始&#xff0c;我想声明一下&a…

ChatGPT将改变教育,而不是摧毁它

01 学校和大学的反应迅速而果断 就在 OpenAI 于 2022 年 11月下旬发布ChatGPT 的几天后&#xff0c;该聊天机器人被广泛谴责为一种免费的论文写作、应试工具&#xff0c;它很容易在作业中作弊。 美国第二大学区洛杉矶联合大学立即阻止了OpenAI网站从其学校网络访问。其他人很…

【Java】Java核心要点总结 67

文章目录 1. 浮点数运运算会有精度损失2. 构造方法特点 & 不能被重写3. 接口和抽象类的异同4. Object 类的常见方法5. hashCode() 有什么用 为什么要有 hashCode() 1. 浮点数运运算会有精度损失 这个和计算机保存浮点数的机制有很大关系。我们知道计算机是二进制的&#x…

面试时一定要确认该岗位的直属领导是否在场,如果不在,千万不要接offer,有坑!...

对于有心人来说&#xff0c;面试时可以看出许多隐形信息&#xff0c;比如下面这位网友的提醒&#xff1a; 面试时一定要确认这个岗位的直接汇报领导是否参与了面试&#xff0c;如果没有参与&#xff0c;千万不要接offer&#xff01; 该职位的直接领导不参与面试&#xff0c;只能…

NLP——Topic Modelling

文章目录 A Brief History of Topic ModelsLatent Dirichlet Allocation &#xff08;LDA&#xff09;潜在狄利克雷分布核心思想LDA inputLDA output LDA 如何学习Sampling-based mothods 基于采样的方法Infer Topics For New Documents超参数 Variational methods 变分方法 Ev…

java协同过滤算法的校园二手图书网站springboot vue

用户&#xff1a;&#xff08;商品推荐算法&#xff09; 1)首页主要由导航栏、图书展示页、分页所组成。访客能浏览网站上的待出售图书的信息&#xff0c;但是若要购买&#xff0c;收藏图书&#xff0c;查看卖家信息则会自动跳转到登录界面&#xff0c;已经登录的用户则可以浏…

WPS AI最全申请与使用手册;AIGC制作游戏音乐;便宜快捷使用完整版SD;人人都能看懂的ChatGPT原理课 | ShowMeAI日报

&#x1f440;日报&周刊合集 | &#x1f3a1;生产力工具与行业应用大全 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; &#x1f916; 面向虚拟世界的生成式AI市场全景图 作者在这篇文章中探讨了生成式AI在虚拟世界的应用&#xff0c;并绘制了 Market Map V3.0 (市场全景…

C++ 有用的资源||19道必须掌握的C++面试题

C 有用的资源 C 有用的资源 以下资源包含了 C 有关的网站、书籍和文章。请使用它们来进一步学习 C 的知识。 C 有用的网站 C Programming Language Tutorials − C 编程语言教程。C Programming − 这本书涵盖了 C 语言编程、软件交互设计、C 语言的现实生活应用。C FAQ −…

chatgpt赋能python:Python中的遍历方法详解

Python中的遍历方法详解 在Python中&#xff0c;遍历是处理数据的常见操作。Python提供了多种遍历方法&#xff0c;本文将逐一介绍这些方法的特点、适用场景及使用方法。 for循环 for循环是Python中最常用的遍历方法之一&#xff0c;可以遍历任何可迭代对象。 # 遍历列表 f…

栈的运用——中缀表达式[Java实现]

⭐作者介绍&#xff1a;大二本科网络工程专业在读&#xff0c;持续学习Java&#xff0c;努力输出优质文章 ⭐作者主页&#xff1a;逐梦苍穹 ⭐所属专栏&#xff1a;数据结构。数据结构专栏主要是在讲解原理的基础上拿Java实现&#xff0c;有时候有C/C代码。 ⭐如果觉得文章写的…

C++【位图/布隆过滤器—海量数据处理】

文章目录 一、位图&#xff08;1&#xff09;位图概念介绍&#xff08;2&#xff09;简单模拟实现&#xff08;3&#xff09;位图应用 二、布隆过滤器&#xff08;1&#xff09;关于布隆过滤器概念及介绍&#xff08;2&#xff09;布隆过滤器的使用场景&#xff08;3&#xff0…