【Java第35期】:Bean的生命周期

news2025/2/26 14:59:28

作者:有只小猪飞走啦

博客地址:https://blog.csdn.net/m0_62262008?type=blog

内容:1,这篇博客要分析Bean生命周期有几个阶段?
2,每个阶段的效果是什么?
3,@PostConstruct 和 @PreDestroy 各自的效果是什么?

在这里插入图片描述

文章目录

  • 前言
  • 一,Bean的生命周期的5个阶段
  • 二,每个阶段的效果
  • 三,@PostConstruct 和 @PreDestroy 各自的效果

前言

本博客内容是小博主在学习之后的总结,如果哪里有错误或者不太完善的都可以私聊我哈,如果哪里你不太理解的也可以来私聊我哦~

一,Bean的生命周期的5个阶段

所谓的⽣命周期指的是⼀个对象从诞⽣到销毁的整个⽣命过程,我们把这个过程就叫做⼀个对象的⽣命周期。所以我们来总结一下,Bean的5个生命周期是什么?
1.实例化 Bean
2.设置属性
3.Bean 初始化
3.1,执行各种通知
3.2,初始化的前置方法【xml里面定义 init-method|@PostConstruct】
3.3,初始化方法
3.4,初始化的后置方法
4.使⽤ Bean
5.销毁 Bean
以上就是Bean的5个生命周期,下面为你们一一解析每个阶段的效果:

二,每个阶段的效果

按上面的各个阶段用代码演示其生命周期:

package com.tom.controller;

import org.springframework.beans.factory.BeanNameAware;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

@Component
public class BeanLifeComponent implements BeanNameAware {
    @Override
    public void setBeanName(String s) {
        System.out.println("执行了 Bean Name 通知:"+s);
    }

    /**
     * 方法命随意定义
     * xml中init-method指定方法
     */
    public void initMethod(){
        System.out.println("执行了 init method 方法");
    }

    @PostConstruct
    public void myPostConstruct(){
        System.out.println("执行了 PostConstruct 方法");
    }

    /**
     * 销毁前执行方法
     */
    @PreDestroy
    public void myPreDestroy(){
        System.out.println("执行了PreDestroy方法");
    }

    public void use(){
        System.out.println("执行了use 方法");
    }
}

xml配置:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:content="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<!--配置存储 Bean 对象的扫描根路径 -->
    <content:component-scan base-package="com.tom"> </content:component-scan>

<!--    <bean id="userConfiguration" class="com.tom.configuration.UserConfiguration"> </bean>-->

    <beans>

    <bean id="beanLife" class="com.tom.controller.BeanLifeComponent"
          init-method="initMethod"> </bean>
    </beans>

</beans>

调用类:

import com.tom.controller.*;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class App {
    public static void main(String[] args) {

        ClassPathXmlApplicationContext context =
                new ClassPathXmlApplicationContext("spring-config.xml");
        BeanLifeComponent component =
                context.getBean("beanLife",BeanLifeComponent.class);
        component.use();
        //关闭容器
        context.destroy();
        }
    }

结果:
在这里插入图片描述

三,@PostConstruct 和 @PreDestroy 各自的效果

1,当Bean被容器初始化之后,会调用@PostConstruct的注解方法。
2,当Bean在容器销毁之前,调用被@PreDestroy注解的方法
如下代码:

 @PostConstruct
    public void myPostConstruct(){
        System.out.println("执行了 PostConstruct 方法");
    }

    /**
     * 销毁前执行方法
     */
    @PreDestroy
    public void myPreDestroy(){
        System.out.println("执行了PreDestroy方法");
    }

所以,PostConstruct 注释用于在依赖关系注入完成之后需要执行的方法上,以执行任何初始化。此方法必须在将类放入服务之前调用。支持依赖关系注入的所有类都必须支持此注释。即使类没有请求注入任何资源,用PostConstruct 注释的方法也必须被调用。只有一个方法可以用此注释进行注释。

PreDestroy 用与在依赖注入完成之前的方法前面执行,遵守准则:
1,该方法不得有任何参数
2,该方法的返回类型必须为 void;
3,该方法不得抛出已检查异常;
4,应用 PostConstruct 的方法可以是 public、protected、package private 或 private;
5,该方法不能是 static;该方法可以是 final;
6,该方法只会被执行一次

以上就是Bean的生命周期的各个阶段,希望对你有帮助!
关注小猪,小猪带你一起学习!
请添加图片描述

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

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

相关文章

如果线性变换可以模仿

&#x1f37f;*★,*:.☆欢迎您/$:*.★* &#x1f37f; 正文 如何模仿一个 行为 假设这个行为是线性变换 A 通过权重w 变换为 B 假设可以通过 如下方式 模仿 A变换到B 线性变换 让 C 变换 D首先 计算A C 的距离 dx 计算 B D 的距离 dy假设 w 是通过等差求解权重的方…

(附源码)计算机毕业设计Java搬家预约系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; Springboot mybatis Maven Vue 等等组成&#xff0c;B/…

Elon Musk 与开发者分享他的第一份代码评审

Elon Musk 比以往任何时候都更致力于 Twitter 2.0 的成功&#xff0c;与开发者分享他的第一份代码评审。 原文 https://ssaurel.medium.com/more-committed-than-ever-to-making-twitter-2-0-succeed-elon-musk-shares-his-first-code-review-a565e8df5e2f 前言 Elon Musk 也是…

第8讲:Python中列表的概念与基本使用

文章目录1.列表的概念1.什么是列表1.2.列表中元素的索引概念2.列表的简单定义3.获取列表中某个元素的索引3.1.如何获取列表中某个元素的索引3.2.各种场景获取列表中元素的索引4.使用运算符in检查列表中是否存在指定元素1.列表的概念 1.什么是列表 Python中的列表其实就是其他…

骨传导蓝牙耳机哪个品牌好,骨传导蓝牙耳机品牌推荐

在选择骨传导耳机时还不知道选择什么品牌好&#xff1f;下面小编就给大家推荐几款做的不错的骨传导耳机&#xff0c;大家要注意&#xff0c;在选择骨传导耳机时&#xff0c;还是要选择一些较大的骨传导品牌&#xff0c;这样无论是耳机体验还是售后服务都有保证。 1、南卡Runne…

【机器学习入门项目10例】(八):贝叶斯网络-拼写检查器

🌠 『精品学习专栏导航帖』 🐳最适合入门的100个深度学习实战项目🐳🐙【PyTorch深度学习项目实战100例目录】项目详解 + 数据集 + 完整源码🐙🐶【机器学习入门项目10例目录】项目详解 + 数据集 + 完整源码🐶🦜【机器学习项目实战10例目录】项目详解 + 数据集 +

pagination分页插件的getResult明明有数据,但是getTotal方法为0

最近把之前毕设的SSM项目改成SpringBoot项目时遇到了明明后端数据库查询到了数据&#xff0c;但是page的getTotal方法却是0的bug 解决办法&#xff1a; 先导入需要的依赖&#xff0c;这里注意ssm项目的依赖和SpringBoot的依赖是不一样的&#xff0c;这个只要导入极少启动依赖…

视频 | 扩增子文库拆分和16S序列合并

点击阅读原文跳转完整教案。基因组中的趣事&#xff08;二&#xff09;- 最长的基因2.7 million&#xff0c;最短的基因只有8 nt却能编码基因组中的趣事&#xff08;一&#xff09;&#xff1a;这个基因编码98种转录本1 Linux初探&#xff0c;打开新世界的大门1.1 Linux系统简介…

Strimzi Kafka Bridge(桥接)实战之二:生产和发送消息

欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码)&#xff1a;https://github.com/zq2599/blog_demos 本篇概览 本文是《Strimzi Kafka Bridge(桥接)实战之》系列的第二篇&#xff0c;咱们直奔bridge的重点&#xff1a;常用接口&#xff0c;用实际操作体验如何用…

27. Ubuntu 20.04 开机自动挂载文件/etc/fstab

自动挂载文件/etc/fstab1.fstab2. 参数含义3.开机自动挂载3.1 查看要挂载的磁盘UUID3.2 向fstab文件中添加不同于热插拔的设备&#xff0c;对于硬盘可能需要长期挂载在系统下&#xff0c;所以如果每次开机都去手动mount是非常痛苦的&#xff0c;当然Ubuntu系统的GNOME桌面自带的…

Map学习笔记——深入理解ConcurrentHashMap

ConcurrentHashMap 是我们日常开发中使用频率最高的并发容器之一了&#xff0c;具有如下特点: 基于JDK8分析 存储结构和HashMap一样&#xff0c;都是数组 链表 红黑树是线程安全的容器&#xff0c;底层是通过CAS自旋 sychronized 来保证的key 和 value 都不允许为空&#xf…

【华为OD机试真题 python】叠积木【2022 Q4 | 200分】

■ 题目描述 【叠积木】 有一堆长方体积木,它们的长度和宽度都相同,但长度不一。 小橙想把这堆积木叠成一面墙,墙的每层可以放一个积木,也可以将两个积木拼接起来,要求每层的长度相同。 若必须用完这些积木,叠成的墙最多为多少层? 如下是叠成的一面墙的图示,积木仅…

太强了,全面解析缓存应用经典问题

1、前言 随着互联网从简单的单向浏览请求&#xff0c;发展为基于用户个性信息的定制化以及社交化的请求&#xff0c;这要求产品需要做到以用户和关系为基础&#xff0c;对海量数据进行分析和计算。对于后端服务来说&#xff0c;意味着用户的每次请求都需要查询用户的个人信息和…

jdk-synchronized源码学习

synchronized介绍java中jdk1.6之前和jdk1.6及之后synchronized完全不一样。1.6之前直接上来都是重量级锁导致java的性能很低效&#xff0c;而1.6及之后甲骨文公司对其进行优化&#xff0c;通过一个锁的升级过程从而来支持一些非复杂的场景。那么本文主要是针对synchronized的源…

Java并发-ThreadLocal的使用

ThreadLocal 概述 当使用 ThreadLocal 维护变量时&#xff0c;ThreadLocal 为每个使用该变量的线程提供独立的变量副本&#xff0c;所以每一个线程都可以独立地改变自己的副本&#xff0c;而不会影响其它线程所对应的副本。当多个线程操作这个变量时&#xff0c;实际操作的是自…

python实现熵权法

原文&#xff1a;https://mp.weixin.qq.com/s/vPNPdbZy11q1qsfEz9etZQ 1 熵权法简介 熵源自于希腊语 “ 变化 ” 表示变化的容量&#xff0c;德国物理学家克劳修斯为了将热力学第二定律格式化而引入熵的概念 。 熵的概念来源于热力学&#xff0c;是用来描述过程的不可逆现象…

sql注入手法详解

sql定义 sql--结构化查询语句 sql注入&#xff1a;首先我们通过前端将我们的payload(恶意代码)传送到后台服务器 传送到后台以后 我们提交的payload拼接到sql语句中 作为sql语句的一部分被执行 从而导致数据库又被脱库甚至删库的风险 使得数据库受损 sql注入手法 sql注入可…

领悟《信号与系统》之 非周期信号的傅里叶变换及性质

非周期信号的傅里叶变换及性质一、非周期信号的傅里叶变换二、 典型信号的傅立叶变换1.单边指数信号2.偶双边指数3. 矩阵脉冲信号4. 奇双边指数5. 符号函数6. 冲激信号7. 阶跃信号三、常用傅里叶变换表这里记录的信号都是非周期信号的傅里叶变化&#xff0c;频谱变换的特点就是…

VsCode 配置eslint,支持typescript的语法检查,及时发现低级语法错误,包括函数未定义等行为

背景 最近学习cocos的小游戏制作&#xff0c;参考游戏管理器的代码进行调试的时候&#xff0c;发现自己运行的结果一直都是跟官方效果不一样&#xff0c;没有自动生成更多的方块。肉眼检查代码差异&#xff0c;基本上代码是一样的&#xff0c;浏览器页面调试的时候也看不出问题…

[附源码]Python计算机毕业设计高校教室申请管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…