Spring执行流程和Bean的生命周期

news2024/11/18 8:26:48

  • 1、Spring执行流程
  • 2、Bean的生命周期(重点)
    • 2.1、实例化和初始化的区别
    • 2.2、为什么先设置属性再进行初始化呢?

1、Spring执行流程

Spring执行流程(Bean执行流程):1、在启动类中遇到了ApplicationContext的时候就会启动 Spring 容器 -> 2、根据容器设置的配置文件,去找相应的配置文件; ->3、如果有base-package,那么就去base-package里循环找所有的类,看有没有五大类注解和方法注解; ->4、 如果有注解,进行初始化和属性依赖赋值

在这里插入图片描述

2、Bean的生命周期(重点)

所谓生命周期是指一个对象从创建到销毁的过程。

Bean的生命周期可分为以下5大部分:

  1. 实例化Bean:为Bean分配空间

  2. **设置属性:**为Bean注入属性和装配属性

  3. Bean初始化:

    • 实现各种通知方法:BeanNameAware、BeanFactoryAware、ApplicationContextAware的接口方法。

    • 执行前置方法(BeanPostProcessor接口)

    • 执行初始化方法(设置了才会执行)

      • 注解方式:@PostConstruct,依赖注入后被执行(优先级高,主流方式)
      • xml方式:init-method ⽅法
    • 执行后置方法(BeanPostProcessor接口)

4.使用Bean

5.销毁Bean:@PreDestroy、DisposableBean 接⼝⽅法、destroy-method。

图示化流程:
在这里插入图片描述

伪代码流程(xml方式):

public class BeanLife implements BeanNameAware, BeanFactoryAware, BeanPostProcessor {
    /*
        各种通知
     */
    @Override
    public void setBeanName(String s) {
        //s 是设置的Bean名称
        System.out.println("执行了通知:BeanNameAware - > BeanName = "+s);
    }
    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        System.out.println("执行了通知:BeanFactoryAware");
    }
    /*
        前置方法 :默认情况不会显式调用
     */
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("执行了前置方法:postProcessBeforeInitialization");
        return bean;
    }
    /*
        初始化
     */
    public void myInit(){
        System.out.println("执行了xml方式的初始化 - > init-method");
    }
    @PostConstruct
    public void doPostConstruct(){
        System.out.println("执行了注解的初始化 - > PostConstruct");
    }
    /*
        后置方法 :默认情况不会显式调用
     */

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("执行了后置方法:postProcessAfterInitialization");
        return bean;
    }

    //使用Bean
    public void sayHi(){
        System.out.println("使用Bean -> sayHi()");
    }
    
    /*
        销毁方法
     */
    @PreDestroy
    public void doPreDestroy(){
        System.out.println("执行了销毁方法:PreDestroy");
    }


}

前置方法和后置方法: 默认不会显式调用

​ 1.可以把作用域改为prototype

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 id="beanLife" class="com.spring.demo.BeanLife" scope="prototype" init-method="myInit"></bean>
</beans>

启动类:

public class App {
    public static void main(String[] args) {
        //此处使用ClassPathXmlApplicationContext,因为ApplicationContext没有销毁方法
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring.config.xml");
        BeanLife beanLife = context.getBean("beanLife",BeanLife.class);
       //使用bean
        beanLife.sayHi();
        //销毁容器(bean也就销毁了)
        context.destroy();
    }
}

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

2.1、实例化和初始化的区别

实例化和属性设置是java级别的系统“事件”,其操作过程不可人为干预和修改;而初始化是给开发者提供的,可以在实例化之后,类加载完成之前进行自定义“事件”处理。

2.2、为什么先设置属性再进行初始化呢?

因为在初始化阶段可能会用到bean的属性和方法;如果不先设置属性,先初始化,那么在初始化阶段使用属性,就报错了;因为属性此时还没装配呢。

@Controller
public class BController {
    @Autowired
    private User user1;//设置属性

    @PostConstruct//初始化
    public void say(){
        //再初始化中使用了user1里的属性
        System.out.println(user1.toString());
    }
}
vate User user1;//设置属性

    @PostConstruct//初始化
    public void say(){
        //再初始化中使用了user1里的属性
        System.out.println(user1.toString());
    }
}

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

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

相关文章

【微服务】在window下安装nacos以及可能遇到的问题

介绍 这里是小编成长之路的历程&#xff0c;也是小编的学习之路。希望和各位大佬们一起成长&#xff01; 以下为小编最喜欢的两句话&#xff1a; 要有最朴素的生活和最遥远的梦想&#xff0c;即使明天天寒地冻&#xff0c;山高水远&#xff0c;路远马亡。 一个人为什么要努力&a…

【029】C++静态成员和 this 指针详解

C静态成员和 this 指针详解 引言一、静态成员1.1、静态成员变量1.2、静态成员变量的使用示例1.3、静态成员函数1.4、单例模式设计 二、C面向对象模型2.1、成员变量和函数的存储2.2、this 指针2.3、this 指针的应用2.4、const修饰成员函数 总结 引言 &#x1f4a1; 作者简介&…

.NET6创建Windows服务

之前的文章已经写过了创建Windows服务。 C#创建Windows服务_c# 创建windows服务_故里2130的博客-CSDN博客 不过之前使用的是.NET Framework创建的Windows服务。现在已经2023年了&#xff0c;其中vs2022有新的方法去创建Windows服务&#xff0c;本次使用.NET6创建Windows服务。…

网络层:虚拟专用网VPN和网络地址转换NAT

1.网络层&#xff1a;虚拟专用网VPN和网络地址转换NAT 笔记来源&#xff1a; 湖科大教书匠&#xff1a;虚拟专用网VPN和网络地址转换NAT 声明&#xff1a;该学习笔记来自湖科大教书匠&#xff0c;笔记仅做学习参考 1.1 虚拟专用网VPN 专用网和公用网的特点 专用网络&#xff…

远程访问VPN配置与验证实验:构建安全的远程连接

远程访问VPN配置与验证实验&#xff1a;构建安全的远程连接 【实验目的】 理解远程访问 VPN的含义。掌握远程访问 VPN的含义。掌握VPN Client软件的使用。验证配置。 【实验拓扑】 实验拓扑如下图所示。 实验拓扑 设备参数表如下表所示。 设备参数表 设备 接口 IP地址 …

【软件设计】模块设计耦合的七种类型

一.什么是高内聚、低耦合&#xff1f; 在结构化分析与模块设计方法中&#xff0c;模块化是一个很重要的概念&#xff0c;它是将一个待开发的软件分解成为若干个小的模块&#xff0c;每个模块可以独立地开发、测试。使得复杂问题的“分而治之”&#xff0c;令程序的结构清晰、易…

ubuntu 20.04 linux6.3.8 qemu arm64 平台 制作ext4根文件系统

前言 可以参考 ubuntu 20.04 qemu linux6.0.1 制作ext4根文件系统 因为需要验证 aarch64 平台下的 glib 库&#xff0c;所以重新搭建了 Linux qemu arm64 的 测试环境 这一篇&#xff0c;开始制作 rootfs 根文件系统&#xff0c;让qemu arm64 平台上的 Linux 系统跑起来 开…

一个springboot项目的jenkins持续集成配置

目录 1.项目基本情况 2.jenkins的下载 1) 安装jdk 2&#xff09;下载、启动和配置jenkins 3. 启动Jenkins 4. 安装Jenkins插件 5. 重启jenkins 6.jenkins工具的配置 1&#xff09; jdk的路径配置 7.创建springboot项目的持续集成任务 1) 新建项目 2&#xff09;代…

倒闭了

前两天在群里听到有人发消息&#xff0c;说是「有陪」倒闭了&#xff0c;然后我去看了相应的消息&#xff0c;看到了下面的图。 一些老的读者可能知道我之前有一段创业经历&#xff0c;这段创业经历就是有陪&#xff0c;我从恒大的时候就开始给有陪做事&#xff0c;那时候我一个…

stm32 滑膜观测器+PLL 锁相环 FOC 无感无刷电机控制

上一期为大家介绍了滑膜观测器正反切的应用案例&#xff0c;收到不少小伙伴的反馈是否有PLL的案例&#xff0c;大概看了一下网上的资料&#xff0c;讲理论的很多&#xff0c;能转化成源码的几乎没有。前半年工作和家里的事情都比较多&#xff0c;一拖再拖&#xff0c;终于在6月…

Attention U-Net:Learning Where to Look for the Pancreas论文总结和代码实现

论文&#xff1a; https://arxiv.org/abs/1804.03999 中文版&#xff1a;https://blog.csdn.net/hhw999/article/details/110134398 源码&#xff1a; https://github.com/ozan-oktay/Attention-Gated-Networks 目录 一、论文背景和出发点 二、创新点 三、Attention U-Net的…

【5G MAC】5G中传输块(TBS)大小的计算方式

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 本人就职于国际知名终端厂商&#xff0c;负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作&#xff0c;目前牵头6G算力网络技术标准研究。 博客…

【学习日记2023.6.18】之 分布式缓存redis持久化_redis主从_reids哨兵_redis分片集群

文章目录 分布式缓存1. Redis持久化1.1 RDB持久化1.1.1 执行时机1.1.2 RDB原理1.1.3 小结 1.2 AOF持久化1.2.1 AOF原理1.2.2 AOF配置1.2.3 AOF文件重写 1.3 RDB与AOF对比 2 Redis主从2.1 搭建主从架构2.1.1 准备实例和配置2.1.2 启动2.1.3 开启主从关系2.1.4 测试 2.2 主从数据…

计算服务资源调度管理

文章目录 前言总体架构“ULT”和“KLT”抽象“内核”“容器”“虚容器” 内存抽象虚拟存储&#xff08;容器调用&#xff09; 多机器调度 前言 今天复习了一下操作系统&#xff0c;系统过了一下&#xff0c;感觉还有点时间&#xff0c;那么顺便来讨论一下&#xff0c;关于我的…

.maloxx勒索病毒数据怎么处理|数据解密恢复,malox/mallox

导语&#xff1a; 随着科技的快速发展&#xff0c;数据成为了企业和个人不可或缺的财富。然而&#xff0c;网络安全威胁也日益增多&#xff0c;其中Mallox勒索病毒家族的最新变种.maloxx勒索病毒的出现给我们带来了巨大的困扰。但不要担心&#xff01;91数据恢复研究院将为您揭…

一、Docker介绍

学习参考&#xff1a;尚硅谷Docker实战教程、Docker官网、其他优秀博客(参考过的在文章最后列出) 目录 前言一、Docker是什么&#xff1f;二、Docker能干撒&#xff1f;三、容器虚拟化技术 和 虚拟机有啥区别&#xff1f;1.虚拟机2.容器虚拟化技术3.对比 四、Docker组成4.1 镜像…

python自动化办公——定制化将电子签名批量签写到PDF文件

python自动化办公——定制化将电子签名批量签写到PDF文件 文章目录 python自动化办公——定制化将电子签名批量签写到PDF文件1、安装依赖2、需求分析3、代码 1、安装依赖 首先需要下载所需要的库 pip install pdf2image pip install img2pdf pip install opencv-python此外还…

【工作记录】基于可视化爬虫spiderflow实战天气数据爬取@20230618

前言 之前写过一篇关于可视化爬虫spiderflow的文章&#xff0c;介绍了基本语法并实战了某校园新闻数据的爬取。 还有一篇文章介绍了基于docker-compose快速部署spiderflow的过程&#xff0c;需要部署的话可参考该文章。 文章链接如下: 可视化爬虫框架spiderflow入门及实战【…

基于SpringBoot+Vue+微信小程序的电影平台

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&#xff1a; 研究背景&#xff1a;…

【通过Data Studio连接openGauss---快速入门】

【通过Data Studio连接openGauss---快速入门】 &#x1f53b; 一、访问openGauss&#x1f530; 1.1 确认连接信息&#xff08;单节点&#xff09;&#x1f530; 1.2 使用gsql访问openGauss&#xff08;本地连接数据库&#xff09;&#x1f530; 1.3 使用gsql访问openGauss&…