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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • xmind 使用教程[通俗易懂]

    1.这是刚刚打开xmind后的界面,在中央有一个中心主题,你可以把它替换成你自己的主题,比如图形推理。2、把光标定位到中心主题上,然后连续按3次Tab键,你会看到上面效果。tab键可以帮助你迅速的建立某个主题的子主题。3、下面你在连续按3次回车键,你就可以看到上面的效果,你可以通过回车键,建立同级主题。4、你自己在试一试,玩一玩者两个键吧!(tab键和enter回车键)5、如何改变主题的分布方式,你还要学习使用“右键”,选择一个主题,然后点击“右键”,你会发现有很多选择。6、选

    2022年4月9日
    363
  • GateWay网关 – 环境搭建v2「建议收藏」

    GateWay网关 – 环境搭建v2「建议收藏」目录基础使用Maven依赖application配置Gateway整合Nacos实现服务转发Maven依赖application配置自定义TokenFilter实现参数拦截gateWay高可用集群方式基础使用Maven依赖注意:不能引入spring-cloud-starter-web,会出现错误<parent>…

    2022年9月13日
    2
  • 全球vps交流网站超级vps管理器_phpyun采集

    全球vps交流网站超级vps管理器_phpyun采集今天在写《请珍惜免费资源》这篇文章的时候无意中又发现一款无限流量免费PHP空间「FreeWebHostingArea」,搜索了一下已经有14年的时间,下面老俍就来介绍一下这款免费主机的申请及使用说明。FreeWebHostingArea是美国的一个老牌的免费空间服务商,从2005年开始提供免费PHP空间服务。距今已有14年的时间,真没想到一款免费主机能活这么长时间。FreeWe…

    2022年10月8日
    1
  • java getclassloader_Java中getClassLoader().getResource()和getResource()的区别

    java getclassloader_Java中getClassLoader().getResource()和getResource()的区别在Java中需要加载一个文件时,使用getResource()方法进行加载,会报错[Causedby:java.lang.NullPointerException:Locationisrequired.这是对.getClass().getClassLoader().getResource()和.getClass().getResource()的理解不够深入的原因。经过查询相关资料后终于明…

    2022年6月8日
    38
  • 深入浅出ES6(四):模板字符串

    在上一篇文章中,我说过要写一篇风格迥异的新文章,在了解了迭代器和生成器后,是时候来品味一些不烧脑的简单知识,如果你们觉得太难了,还不快去啃犀牛书!现在,就让我们从最简单的知识学起吧!反撇号(`)基础知识ES6引入了一种新型的字符串字面量语法,我们称之为模板字符串(templatestrings)。除了使用反撇号字符`代替普通字符串的引号’或”外,它们看起来与普通

    2022年4月5日
    125
  • Charles激活成功教程版_charles抓包乱码

    Charles激活成功教程版_charles抓包乱码RegisteredName:https://zhile.ioLicenseKey:48891cf209c6d32bf4

    2025年8月18日
    0

发表回复

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

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