Bean的生命周期及演示

news2024/11/25 0:26:31

文章目录

    • 一、介绍
      • 概念
      • 组成:
    • 二、实例演示


一、介绍

概念

Bean的生命周期是指一个Bean对象从创建到销毁的整个存在过程。


组成:

1.实例化Bean(为Bean分配内存空间)
2.属性注入 (Bean注入和装配)
3.Bean的初始化

  • 各种通知:如 BeanNameWare、BeanFactoryAware、ApplicationContextAware 的接口方法。
  • 初始化前置方法
  • 执行初始化方法
    • 注解方式:@PostConstruct
    • xml 方式:init-method 方法
  • 初始化后置方法

4.使用Bean
5.销毁Bean

注:

通过 @PostConstruct 注解方式初始化,需要在配置文件设置扫描路径;
通过 xml 方式初始化,需要在配置文件用标签中的 init-method 属性配置对应类的初始化方法名。


二、实例演示

spring-config.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">
    <content:component-scan base-package="com"></content:component-scan>
    <bean id="beanLifeComponent" 
    class="com.example.BeanLifeComponent" init-method="init"></bean>
</beans>

注:init-method 属性的值是 bean 对应的初始化方法的名称。如果该属性的值不匹配方法名,则在初始化 bean 时会抛出 NoSuchMethodException 异常。此处 ‘init’ 对应下面 xml 方式初始化方法名。

com.example.BeanLifeComponent.java

package com.example;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.beans.factory.BeanNameAware;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;

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

public class BeanLifeComponent implements BeanNameAware, BeanFactoryAware, ApplicationContextAware, BeanPostProcessor {
    /**
     * 执行通知方法
     * @param s
     */
    @Override
    public void setBeanName(String s) {
        System.out.println("执行了BeanNameAware:BeanName = " + s);
    }
    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        System.out.println("执行了BeanFactoryAware:BeanFactory = " + beanFactory);
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        System.out.println("执行了ApplicationContextAware:ApplicationContext = " + applicationContext);
    }

    /**
     * 执行初始化前置方法
     * @param bean
     * @param beanName
     * @return
     * @throws BeansException
     */
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("执行初始化前置方法");
        return bean;
    }

    /**
     * 执行初始化方法
     */
    //xml 方式的初始化方法
    public void init(){
        System.out.println("XML 方式初始化");
    }

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

    /**
     * 执行初始化后置方法
     * @param bean
     * @param beanName
     * @return
     * @throws BeansException
     */
    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("执行初始化后置方法");
        return bean;
    }

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

    /**
     * 销毁Bean
     */
    @PreDestroy
    public void preDestroy() {
        System.out.println("销毁Bean");
    }
}

BeanLifeTest.java

import com.example.BeanLifeComponent;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class BeanLifeTest {
    public static void main(String[] args) {
        //得到 Spring 容器,通过配置文件让Spring容器自动完成对象的实例化和属性注入。
        // 这里使用 ClassPathXmlApplicationContext 而不是 ApplicationContext,因为这个类没有destroy()或者close()方法。
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");

        //获取Bean
        BeanLifeComponent bean = context.getBean("beanLifeComponent", BeanLifeComponent.class);

        //使用Bean
        bean.sayHi();

        //销毁Bean。下面两种方法等效
        //context.destroy();
        context.close();
    }
}

运行 BeanLifeTest.java 打印结果:
在这里插入图片描述
从打印结果我们可以发现:
1.使用注解方式初始化Bean比使用xml的优先级高。
2.为什么没有执行初始化前置和后置方法?
答:因为Bean的作用域默认是单例,Spring会自动调用初始化前置方法和后置方法,我们不能显示调用。要想显示调用,把Bean的作用域改为 prototype 即多例模式。可以在XML配置文件中使用元素的scope属性修改,也可在Bean定义中使用@Scope注解修改。


修改后
在这里插入图片描述
再次运行打印结果:
在这里插入图片描述
可以发现:
1.方法执行了两次。一个是在应用上下文启动时初始化的实例,另一个是在执行 getBean 方法时返回一个新的实例并初始化。
2.为什么没有执行销毁方法?
答:是因为Spring设计,多例模式的 Bean 由于会创建多个实例,因此容器不会自动跟踪和销毁这些实例,而是直接停掉了整个线程。

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

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

相关文章

【Midjourney】Midjourney 辅助工具 ② ( 自定义命令工具 | 设置颜色 | 设置材质 | 设置随机种子 | 设置图片链接 )

文章目录 一、Midjourney Prompt Tool 自定义命令工具1、设置颜色参数2、设置材质参数3、设置随机种子参数4、设置图片链接 Midjourney 提示词命令 可以使用 辅助工具 进行生成 , 辅助工具如下 : Midjourney Prompt Tool 自定义命令工具Midjourney Prompt Generator 命令生成器…

C语言实现【三子棋小游戏】

Hello,各位小伙伴们好啊&#xff0c;这篇博客是用C语言实现了三子棋的游戏&#xff0c;感兴趣的友友可以试试玩哦&#xff5e; 咦&#xff0c;当我们以玩家的身份和电脑玩这个游戏的时候&#xff0c;有哪些步骤呢&#xff1f;那么&#xff0c;反过来&#xff0c;我们设计游戏的…

C++智能指针的原理、分类、使用

1. 智能指针介绍 为解决裸指针可能导致的内存泄漏问题。如&#xff1a; a&#xff09;忘记释放内存&#xff1b; b&#xff09;程序提前退出导致资源释放代码未执行到。 就出现了智能指针&#xff0c;能够做到资源的自动释放。 2. 智能指针的原理和简单实现 2.1 智能指针的原…

『python爬虫』19. aiohttp模块应用之下载图片(保姆级图文)

目录 1. aiohttp库安装2. 代码解析3. 实现代码总结 欢迎关注 『python爬虫』 专栏&#xff0c;持续更新中 欢迎关注 『python爬虫』 专栏&#xff0c;持续更新中 通过爬取下载得到图片 1. aiohttp库安装 pip install aiohttp这个库的作用基本上和request一致&#xff0c;理解…

SpringBoot——RUST风格以及如何快速发送不同方式的请求

RUST风格&#xff1a; 简单来说&#xff0c;RUST就是一种将请求方式融合到路径中的一种请求路径书写风格&#xff0c;注意这里是风格&#xff0c;不是规定&#xff0c;我们也可以不使用他或者不是非常严格的按照他规定的样式来写&#xff0c;但是由于行业中大多数的人在编程的…

Firefox 112 发布:右键单击显示密码、改进标签管理等!

Firefox 发布 112 版本&#xff0c;为我们带来了显示密码的新选择、同时改进了标签管理等。 Mozilla 于 2023 年 4 月 11 日发布了 Firefox 112&#xff0c;新版本包含一些令人兴奋的新功能和改进。该浏览器的最新版本带来了一些功能以增强用户体验和提高性能。 在 Ubuntu 上运…

UNIAPP实战项目笔记69 订单确认时显示为默认地址

UNIAPP实战项目笔记69 订单确认时显示为默认地址 思路 需要用到vuex 默认显示isDefault为1的地址 案例截图 订单结算页面 地址页面 代码 shopcart.vue <template><view class"shop-cart"><template v-if" list.length > 0 "><!-…

【Linux学习笔记】设备驱动模型详解——总线、设备、驱动和类

学习内容 设备驱动模型视频讲解 简介 设备驱动是计算机系统中的重要组成部分&#xff0c;它们允许操作系统与硬件交互。设备驱动模型是一种通用的抽象框架&#xff0c;用于描述操作系统如何管理硬件设备。这里我们将介绍设备驱动模型中的四个关键概念&#xff1a;总线、设备…

GitLab+Drone CI持续集成自动部署web项目

一、环境介绍 1.gitlab服务器 172.16.11.1 搭建参考&#xff1a;Gitlab教程 2.Drone服务器 172.16.11.2 搭建参考: 基于gitlab搭建Drone CI 3.web服务器 172.16.11.3 已配置好nginx相关web服务&#xff0c;这里nginx配置的web目录为/www/test 还有生成ssh key密钥即可&am…

编程的未来

从 ChatGPT 诞生至今&#xff0c;在程序员的圈子里&#xff0c;我们一直有两种讨论&#xff1a; 最开始所恐慌的&#xff1a;编程没有未来&#xff0c;ChatGPT 是不是要取代程序员。编程的方式前所未有地发生了变化。 现如今&#xff0c;GitHub Copilot Chat 可以让开发者们直…

算法修炼之练气篇——练气十八层

博主&#xff1a;命运之光 专栏&#xff1a;算法修炼之练气篇 前言&#xff1a;每天练习五道题&#xff0c;炼气篇大概会练习200道题左右&#xff0c;题目有C语言网上的题&#xff0c;也有洛谷上面的题&#xff0c;题目简单适合新手入门。&#xff08;代码都是命运之光自己写的…

支付系统设计三:渠道网关设计02-客户端报文解析

文章目录 前言一、后台配置管理1.1 渠道配置1.1.1 渠道基本信息新增1.1.2 渠道交易类型配置1.1.3 渠道商户信息配置1.1.4 账户配置1.1.5 交易类型机构配置 1.2 渠道通讯配置1.2.1 内部渠道通讯1.2.1 外部渠道通讯 1.3 资源配置1.4 证书管理1.5 路由配置 二、运行时逻辑处理1. 控…

Fluent的视角设置

1 背景 针对不同设计方案在同一工况下的差异点进行细节分析&#xff0c;其中一个很重要的要求就是需要在同一视角下比较不同设计方案的差异性。设置视角并进行快速重用是很重要的提高仿真效率的方法。 2 视角设置 视角设置有2类方法&#xff1a;手动拖拉和定量指定。 手动拖拉即…

一图看懂 tomli 模块:一个 TOML解析器、使用 mformat -toc 生成的目录,资料整理+笔记(大全)

本文由 大侠(AhcaoZhu)原创&#xff0c;转载请声明。 链接: https://blog.csdn.net/Ahcao2008 一图看懂 tomli 模块&#xff1a;一个 TOML解析器、使用 mformat -toc 生成的目录&#xff0c;资料整理笔记&#xff08;大全&#xff09; &#x1f9ca;摘要&#x1f9ca;模块图&am…

前端开发中,定位bug的几种常用方法

目录 第一章 前言 第二章 解决bug的方法 2.1 百度 2.2 有道翻译 2.3 debugger 2.4 console.log 日志打印 2.5 请求体是否携带参数 2.6 注释页面渲染代码 2.7 其他 第三章 尾声 备注&#xff1a;该文章只是本人在工作/学习中常用的几种方法&#xff0c;如果有不对大家…

智慧园区移动应用发展面临瓶颈,如何解决?

智慧园区移动应用将在多元化服务、生态建设、智能化管理和跨界融合等方面发展&#xff0c;成为园区管理和服务的重要手段之一&#xff0c;为员工和企业提供更加智能化和便捷化的管理和服务。伴随着智慧城市的建设和智慧园区的崛起&#xff0c;智慧园区数字一体化建设成为园区发…

docker搭建nginx负载均衡

一点小背景 docker起了几个服务&#xff0c;没有配置端口映射&#xff0c;导致不能通过网络访问。当然&#xff0c;更简单的方式是加端口映射&#xff0c;笔者的情况更复杂一些&#xff0c;就想到了用nginx映射一下。 Nginx&#xff08;发音同“engine X”&#xff09;是异步框…

避免“文献综抄”,5种写作结构助你完成文献综述→

很多作者可能有过这样的体验&#xff1a;读了很多文献&#xff0c;但在写综述的时候总感觉不像是在写文献综述&#xff0c;更像在写文献总结 如果引用方面不注意&#xff0c;甚至会成为文献综抄。 那么&#xff0c;你可以参考下我们整理的以下资料哦~ 01 文献总结和文献综述的…

DCDC反馈电阻的阻值如何取值?

DCDC芯片的反馈电阻 下图为我们公司现在常用的两款DCDC芯片&#xff0c;TPS54335ADDA/TI和LMR14050SDDA/TI。 其中RFBT和RFBB都是反馈电阻&#xff0c;可以通过调节这两个电阻的比值来输出 预期电压。 FBT&#xff1a;feedback top&a…

保姆级丨XAMPP安装使用

0x00 前言 XAMPP 是一个完全免费&#xff0c;易于安装的 Apache 发行版&#xff0c;包含 MariaDB &#xff0c; PHP 和 Perl 。 XAMPP 开源软件包已经设置为非常容易安装和使用。 0x01 环境说明 Windows 11xampp-windows-x64-8.2.4-0-VS16-installer 0x02 准备工作 首先要访问…