springbean生命周期通俗一点_java servlet生命周期

springbean生命周期通俗一点_java servlet生命周期一、springBean的生命周期1、启动spring容器,也就是创建beanFactory(bean工厂),一般用的是beanFactory的子类applicationcontext,applicationcontext比一般的beanFactory要多很多功能,比如aop、事件等。通过applicationcontext加载配置文件,或者利用注解的方式扫描将bean的配置信息加载到spring容器里面。2、加载之后,spring容器会将这些

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

一、springBean的生命周期

1、  启动spring容器,也就是创建beanFactory(bean工厂),
     一般用的是beanFactory的子类applicationcontext,
     applicationcontext比一般的beanFactory要多很多功能,比如aop、事件等。
     通过applicationcontext加载配置文件,或者利用注解的方式扫描将bean
     的配置信息加载到spring容器里面。

 2、  加载之后,spring容器会将这些配置信息(java bean的信息),封装成BeanDefinition对象
      BeanDefinition对象其实就是普通java对象之上再封装一层,
      赋予一些spring框架需要用到的属性,比如是否单例,是否懒加载等等。

3、  然后将这些BeanDefinition对象以key为beanName,
     值为BeanDefinition对象的形式存入到一个map里面,
     将这个map传入到spring beanfactory去进行springBean的实例化。
  
4、  传入到pring beanfactory之后,利用BeanFactoryPostProcessor接口这个扩展点
     去对BeanDefinition对象进行一些属性修改。

5、  开始循环BeanDefinition对象进行springBean的实例化,springBean的实例化也就
     是执行bean的构造方法(单例的Bean放入单例池中,但是此刻还未初始化),
     在执行实例化的前后,可以通过InstantiationAwareBeanPostProcessor扩展点
     (作用于所有bean)进行一些修改。

6、   spring bean实例化之后,就开始注入属性,
      首先注入自定义的属性,比如标注@autowrite的这些属性,
      再调用各种Aware接口扩展方法,注入属性(spring特有的属性),
      比如BeanNameAware.setBeanName,设置Bean的ID或者Name;

7、   初始化bean,对各项属性赋初始化值,,初始化前后执行BeanPostProcessor
      (作用于所有bean)扩展点方法,对bean进行修改。

      初始化前后除了BeanPostProcessor扩展点还有其他的扩展点,执行顺序如下:

        (1). 初始化前                	   postProcessBeforeInitialization()
        (2). 执行构造方法之后                执行 @PostConstruct 的方法
        (3). 所有属性赋初始化值之后           afterPropertiesSet()
        (4). 初始化时              	       配置文件中指定的 init-method 方法
        (5). 初始化后                	   postProcessAfterInitialization()

		先执行BeanPostProcessor扩展点的前置方法postProcessBeforeInitialization(),
		再执行bean本身的构造方法
		再执行@PostConstruct标注的方法
		所有属性赋值完成之后执行afterPropertiesSet()
		然后执行 配置文件或注解中指定的 init-method 方法
		最后执行BeanPostProcessor扩展点的后置方法postProcessAfterInitialization()

8、     此时已完成bean的初始化,在程序中就可以通过spring容器拿到这些初始化好的bean。

9、     随着容器销毁,springbean也会销毁,销毁前后也有一系列的扩展点。
  		销毁bean之前,执行@PreDestroy 的方法
	    销毁时,执行配置文件或注解中指定的 destroy-method 方法。


  		以上就是spring bean的整个生命周期

  		其实就是根据配置文件或注解信息,生成BeanDefinition,
  		循环BeanDefinition去实例化-》注入属性-》初始化-》销毁,在这4个阶段执行前后,
  		spring框架提供了一系列的扩展点。

二、springBean的各种扩展点

(1)、容器级扩展点(作用于所有bean):

	BeanFactoryPostProcessor接口:
	
	在循环初始化springbean之前,对BeanDefinition元数据做扩展处理
	
	InstantiationAwareBeanPostProcessor接口:
	
	在对象实例化前后扩展,作用于所有bean
	
	BeanPostProcessor接口:
	
	在对象初始化化前后扩展,作用于所有bean

(2)、Bean扩展点(作用于单个bean):

	Aware接口:
	
	springBean实例化并且注入自定义属性之后
	
	InitializingBean接口:
	
	springBean初始化时,执行构造方法结束,并且属性赋初始化值结束之后执行
	
	DiposableBean接口:
	
	springBean销毁之前执行。

(3)、Bean自身的方法

	包括了Bean本身调用的方法
	
	通过配置文件中<bean>的init-method和destroy-method指定的方法(或者用注解的方式)
	
	(4)、包括了AspectJWeavingEnabler, 
	 ConfigurationClassPostProcessor, 
	 CustomAutowireConfigurer等等非常有用的工厂后处理器接口的方法。
	 工厂后处理器也是容器级的。在应用上下文装配配置文件之后立即调用。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/191732.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 一个标准的x.509数字证书包括哪些内容?(数字证书的功能是)

    1、什么叫数字签名数字签名:将报文按双方约定的HASH算法计算得到一个固定位数的报文摘要。在数学上保证:只要改动报文中任何一位,重新计算出的报文摘要值就会与原先的值不相符。这样就保证了报文的不可更改性。将该报文摘要值用发送者的私人密钥加密,然后连同原报文一起发送给接收者,而产生的报文即称数字签名2、什么叫数字证书数字证书:数字证书就是互联网通讯中标志通讯各方身份信息的一系列数据,提供了一种在In

    2022年4月15日
  • 大数据_03【大数据基础知识】

    大数据_03【大数据基础知识】大数据_0301大数据概述02什么是大数据?(BigData)03传统数据与大数据的对比04大数据的特点4.1传统数据与大数据处理服务器系统安装对比4.2大数据下服务器系统安装![在这里插入图片描述](https://img-blog.csdnimg.cn/20201006090915426.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV

    2022年5月4日
  • 拉姆达表达式的使用[通俗易懂]

    拉姆达表达式的使用[通俗易懂]1.什么是λ表达式 λ表达式本质上是一个匿名方法。让我们来看下面这个例子:   publicintadd(intx,inty){       returnx+y;   }转成λ表达式后是这个样子:       (intx,inty)-&gt;x+y;参数类型也可以省略,Java编译器会根据上下文推断出来:   (x,y)…

    2022年9月19日
  • sqlformat数字格式化_java怎么输出数字

    sqlformat数字格式化_java怎么输出数字前言以前用到要对数字格式的地方,都是直接到网上搜一下。拿过来能用就行。因为平时用的不多。但是最近的项目对这个用的多了。网上拿来的不够用了。自己看了java源码把这方面恶补了。而且最近也好长时间没有写博客了。正好写一篇抛砖引玉吧。正文如果你对java源码比较了解。你会发现java对文字,数字的格式化,是有一个公共的父类的Format。NumberFormat和DecimalFormat都是它…

    2022年10月8日
  • 移位寄存器之右移位寄存器(Verilog HDL语言描述)

    移位寄存器之右移位寄存器(Verilog HDL语言描述)目录背景测试一VerilogHDL语言描述测试代码仿真波形图测试二VerilogHDL语言描述测试代码仿真图ISE综合RTLSchematic测试三环形移位寄存器(右移)VerilogHDL描述测试代码仿真波形图ISE综合背景之所以单独把这个简单的东西拿出来,就是因为这个东西我可能要用到,不能眼高手低,以为简单就一…

    2022年7月16日
  • Spring进阶之路(1)-Spring核心机制:依赖注入/控制反转

    Spring进阶之路(1)-Spring核心机制:依赖注入/控制反转

    2021年9月13日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号