首页 > 其他分享 >Spring Bean的生命周期

Spring Bean的生命周期

时间:2023-12-24 14:33:36浏览次数:35  
标签:生命周期 Spring 调用 bean 接口 Bean 实例

在Spring框架中,在IOC容器中管理的Bean分为单例和原型两种,单例Bean在容器启动时就实例化,原型Bean则是每次从容器中请求时才会实例化。而不管是单例还是原型,Bean的生命周期都是基本一致的。

生命周期流程图

Spring Bean的生命周期分为四个阶段:实例化 Instantiation --> 属性赋值 Populate --> 初始化 Initialization --> 销毁 Destruction

实例化bean

对于BeanFactory容器,当用户向容器请求一个尚未初始化的bean时,或初始化bean的时候需要注入另一个尚未初始化的依赖时,容器就会调用createBean进行实例化。对于ApplicationContext容器,当容器启动结束后,通过获取BeanDefinition对象中的信息,实例化所有非懒加载的单例bean。(原型bean是获取的时候才创建的)

设置对象属性(依赖注入)

实例化后的对象被封装在BeanWrapper对象中,紧接着,Spring根据BeanDefinition中的信息 以及 通过BeanWrapper提供的设置属性的接口完成属性设置与依赖注入。

处理Aware接口

Spring会检测该对象是否实现了xxxAware接口,通过Aware类型的接口,可以让我们拿到Spring容器的一些资源:
  • 如果这个Bean实现了BeanNameAware接口,会调用它实现的setBeanName(String beanId)方法,传入Bean的名字;
  • 如果这个Bean实现了BeanClassLoaderAware接口,调用setBeanClassLoader()方法,传入ClassLoader对象的实例。
  • 如果这个Bean实现了BeanFactoryAware接口,会调用它实现的setBeanFactory()方法,传递的是Spring工厂自身。
  • 如果这个Bean实现了ApplicationContextAware接口,会调用setApplicationContext(ApplicationContext)方法,传入Spring上下文;

BeanPostProcessor前置处理

如果想对Bean进行一些自定义的前置处理,那么可以让Bean实现了BeanPostProcessor接口,那将会调用postProcessBeforeInitialization(Object obj, String s)方法。

InitializingBean

如果Bean实现了InitializingBean接口,执行afeterPropertiesSet()方法。

init-method

如果Bean在Spring配置文件中配置了 init-method 属性,则会自动调用其配置的初始化方法。

BeanPostProcessor后置处理

如果这个Bean实现了BeanPostProcessor接口,将会调用postProcessAfterInitialization(Object obj, String s)方法;由于这个方法是在Bean初始化结束时调用的,所以可以被应用于内存或缓存技术;

DisposableBean

当Bean不再需要时,会经过清理阶段,如果Bean实现了DisposableBean这个接口,会调用其实现的destroy()方法;

destroy-method

最后,如果这个Bean的Spring配置中配置了destroy-method属性,会自动调用其配置的销毁方法。

在BeanPostProcessor的子接口中,有一个较为全面的接口:InstantiationAwareBeanPostProcessor。

BeanPostProcessor接口只在bean的初始化阶段进行扩展,而InstantiationAwareBeanPostProcessor接口在此基础上增加了3个方法,把可扩展的范围增加了实例化阶段和属性注入阶段。

  • postProcessBeforeInstantiation:实例化bean之前,相当于new这个bean之前
  • postProcessAfterInstantiation:实例化bean之后,相当于new这个bean之后
  • postProcessPropertyValues:bean已经实例化完成,在属性注入时阶段触发,@Autowired,@Resource等注解原理基于此方法实现
  • postProcessBeforeInitialization:初始化bean之前,相当于把bean注入spring上下文之前
  • postProcessAfterInitialization:初始化bean之后,相当于把bean注入spring上下文之后

标签:生命周期,Spring,调用,bean,接口,Bean,实例
From: https://www.cnblogs.com/xfeiyun/p/17923997.html

相关文章

  • spring加载bean流程解析
    spring加载bean流程解析转载自:https://www.cnblogs.com/wyq178/p/11415877.htmlspring作为目前我们开发的基础框架,每天的开发工作基本和他形影不离,作为管理bean的最经典、优秀的框架,它的复杂程度往往令人望而却步。不过作为朝夕相处的框架,我们必须得明白一个问题就......
  • Spring 解决循环依赖为什么需要三级缓存,而不是两级缓存?
    ......
  • Spring的事务实现原理
    Spring事务Spring本身并不实现事务,Spring事务的本质还是底层数据库对事务的支持,没有数据库事务的支持,Spring事务就不会生效。例如:使用JDBC操作数据库,使用事务的步骤主要分为如下5步:第一步:获取连接Connectioncon=DriverManager.getConnection();第二步:开启事务con.setAutoC......
  • 【Spring教程28】Spring框架实战:从零开始学习SpringMVC 之 请求与请求参数详解
    目录1设置请求映射路径1.1环境准备1.2问题分析1.3设置映射路径2请求参数2.1环境准备2.2参数传递2.2.1GET发送单个参数2.2.2GET发送多个参数2.2.3GET请求中文乱码2.2.4POST发送参数2.2.5POST请求中文乱码欢迎大家回到《Java教程之Spring30天快速入门》,本教程所有示例......
  • 在Spring Cloud中使用OpenFeign完成从一个微服务上传到另一个微服务中
    跨服务上传文件,嘿嘿,来一篇实用性高的,本篇将主要完成在Feign中上传文件到另一个微服务中。步骤如下:我们需要在服务提供者和服务消费者的项目中添加相应的依赖:对于服务提供者的项目,你需要添加SpringBoot的Web依赖和SpringCloud的Feign依赖。在pom.xml文件中添加以下依赖:<dependenci......
  • 在Spring Cloud中实现Feign声明式服务调用客户端
    如果你学过SpringCloud,你应该知道我们可以通过OpenFeign从一个服务中调用另一个服务,我们一般采用的方式就是定义一个Feign接口并使用@FeignClient注解来进行标注,feign会默认为我们创建的接口生成一个代理对象。当我们在代码中调用Feign接口的方法的时候,实际上就是在调用我们Feign......
  • Swagger(一) Swagger/Springfox 入门简介
    转载自:https://blog.csdn.net/donglinjob/article/details/108550636 Swagger/Springfox入门简介一、Swagger 简介1前言接口文档对于前后端开发人员都十分重要。尤其近几年流行前后端分离后接口文档又变成重中之重。接口文档固然重要,但是由于项目周期等原因后端人员经......
  • 将 Spring Boot WAR 部署到 Tomcat 服务器
    Servlet容器期望应用程序满足要部署的某些协定。对于Tomcat,合约是 ServletAPI3.0。为了让我们的应用程序满足这个契约,我们必须对源代码进行一些小的修改。 首先,我们需要打包一个WAR应用程序而不是JAR。为此,我们将使用以下内容更改 pom.xml:<packaging>war</packaging......
  • org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis
    Requestprocessingfailed;nestedexceptionisorg.mybatis.spring.MyBatisSystemException:nestedexceptionisorg.apache.ibatis.binding.BindingException:Parameter'keyWord'notfound.Availableparametersare[keyword,param1] 错误原因:我在mapper里加......
  • Spring Boot框架必知,满满干货!
    1、初识SpringBoot框架1.1SpringBoot框架定义SpringBoot并不是替代Spring框架的解决方案,而是和Spring框架紧密结合用于提升Spring开发者体验的工具,同时SpringBoot还集成了大量常用的第三方库配置,本质上是基于Spring的Web应用程序开发框架。1.2SpringBoot框架的优点可快速构......