当前位置: 首页 > news >正文

通付盾 建设网站阿森纳英超积分

通付盾 建设网站,阿森纳英超积分,平阴县住房建设委网站,武汉网站设计武目录 Bean的实例化 BeanFactoryPostProcessor 属性赋值 循环依赖 初始化 处理各种Aware接口 执行BeanPostProcessor前置处理 执行InitializingBean初始化方法或执行init-method自定义初始化方法 执行BeanPostProcessor后置处理 销毁 Spring Bean 的生命周期总体分为…

目录

Bean的实例化

BeanFactoryPostProcessor

属性赋值

循环依赖

初始化 

处理各种Aware接口

执行BeanPostProcessor前置处理

执行InitializingBean初始化方法或执行init-method自定义初始化方法 

 执行BeanPostProcessor后置处理 

销毁


Spring Bean 的生命周期总体分为四个阶段:

  •         实例化
  •         属性赋值
  •         初始化
  •         销毁

Bean的实例化

Spring容器在进行初始化时,会将xml或者配置类中配置的相关的类通过Java Proxy(反射)的方式创建出一个BeanDefinition对象,然后将所有的BeanDefinition对象存在一个beanDefinitionMap的集合中去,xml中配置的bean的id或者注解配置的value属性作为存入Map的key,整个BeanDefinition对象作为value保存。

BeanFactoryPostProcessor

BeanFactoryPostProcessor是一个接口规范,实现了该接口的类只要交由Spring容器管理的话,那么 Spring就会回调该接口的方法,用于对BeanDefinition注册和修改的功能。如果实现了这个接口并在其中完成了一些BeanDefinition的注册或修改,那么在Bean真正实例化之前,会先回调这个接口的方法,执行其中的逻辑,如果没有实现该接口,那么完成真正的实例化。

属性赋值

BeanDefinition 中有对当前Bean实体的注入信息通过属性propertyValues进行了存储,Spring在进行属性注入时,会分为如下几种情况:

  • 注入普通属性,String、int或存储基本类型的集合时,直接通过set方法的反射设置进去;
  • 注入单向对象引用属性时,从容器中getBean获取后通过set方法反射设置进去,如果容器中没 有,则先创建被注入对象Bean实例(完成整个生命周期)后,在进行注入操作;
  • 注入双向对象引用属性时,就比较复杂了,涉及了循环引用(循环依赖)

循环依赖

多个实体之间相互依赖并形成闭环的情况就叫做"循环依赖",也叫做“循环引用”,当一个Bean对象中如果引用了另一个Bean对象时,会暂停自己的初始化,先将引用的那个Bean对象先创建出来,然后再继续自己的初始化过程;但在这个过程中,可能会出现引用的那个Bean对象中也引用了引用它的Bean对象,这个时候就会产生循环依赖的情况。

为了解决循环依赖,Spring提供了三级缓存存储完整的Bean实例和半成品的Bean实例:

  • 最终存储单例Bean成品的容器,即实例化和初始化都完成的Bean,称之为"一级缓存" Map singletonObjects = new ConcurrentHashMap(256);
  • 早期Bean单例池,缓存半成品对象,且当前对象已经被其他对象引用了,称之为"二级缓存" Map earlySingletonObjects = new ConcurrentHashMap(16);
  • 单例Bean的工厂池,缓存半成品对象,对象未被引用,使用时在通过工厂创建Bean,称之为"三 级缓存" Map> singletonFactories = new HashMap(16);

有了三级缓存的后,在属性赋值阶段会如果某个Bean中引用其他Bean,那么会依次从“三级缓存”往“一级缓存”中找,避免了循环依赖的问题。

初始化 

经过Bean的实例化和属性赋值后的Bean其实还并不是一个完整的Bean实例对象,而是一个“半成品”,在完成它的初始化后才会成为一个完整的Bean实例对象并存放进到一个名为singletonObjects的Map中,最后当执行applicationContext.getBean(beanName)时,从singletonObjects去匹配Bean实例返回。

初始化的过程有以下几个关键点:

处理各种Aware接口

Aware接口是一种框架辅助属性注入的一种思想,为Bean生命周期各个阶段提供扩展。

  • 如果Bean实现BeanNameAware接口,会调用它实现的setBeanName(String beanId)方法,注入Bean的名字;
  • 如果Bean实现BeanClassLoaderAware接口,调用setBeanClassLoader()方法,注入ClassLoader对象的实例;
  • 如果Bean实现BeanFactoryAware接口,会调用它实现的setBeanFactory()方法,注入的是Spring工厂;
  • 如果Bean实现ApplicationContextAware接口,会调用setApplicationContext()方法,注入Spring上下文;

执行BeanPostProcessor前置处理

Bean被实例化后,到最终缓存到名为singletonObjects单例池之前,中间会经过Bean的初始化过程, 例如:属性的填充、初始方法init的执行等,其中有一个对外进行扩展的点BeanPostProcessor,我们称为Bean后 处理。跟Bean工厂后处理器相似,它也是一个接口,实现了该接口并被容器管理的BeanPostProcessor, 会在流程节点上被Spring自动调用。

执行InitializingBean初始化方法或执行init-method自定义初始化方法 

  • 如果Bean实现了InitializingBean接口,执行afeterPropertiesSet()方法。
  • 如果Bean在Spring配置文件中配置了 init-method 属性,则会自动调用其配置的初始化方法。 

 执行BeanPostProcessor后置处理 

如果这个Bean实现了BeanPostProcessor接口,将会调用postProcessAfterInitialization(Object obj, String s)方法,由于这个方法是在Bean初始化结束后调用;

在结束以上初始化的所有过程之后,就创建出了一个完整的Bean实例对象,我们就可以通过applicationContext.getBean(beanName)使用真正的Bean对象了。

销毁

销毁一个Bean对象有两种方式:

  • 执行DisposableBean销毁Bean: 当Bean不再需要时,会经过清理阶段,如果Bean实现了DisposableBean这个接口,会调用其实现的destroy()方法执行销毁;
  • 执行destroy-method自定义销毁方法: 如果这个Bean的Spring配置中配置了destroy-method属性,会自动调用其配置的自定义销毁方法。

文章转载自:
http://succedent.c7507.cn
http://triennial.c7507.cn
http://earwitness.c7507.cn
http://nonvocoid.c7507.cn
http://soliflucted.c7507.cn
http://armpad.c7507.cn
http://litter.c7507.cn
http://kaliningrad.c7507.cn
http://polyarticular.c7507.cn
http://emmeniopathy.c7507.cn
http://yellowfin.c7507.cn
http://recentness.c7507.cn
http://scornfully.c7507.cn
http://lintel.c7507.cn
http://kandinski.c7507.cn
http://naturist.c7507.cn
http://suicidally.c7507.cn
http://digitation.c7507.cn
http://rebekah.c7507.cn
http://cuspidation.c7507.cn
http://procuratory.c7507.cn
http://potassa.c7507.cn
http://redshank.c7507.cn
http://sego.c7507.cn
http://sacrum.c7507.cn
http://microchip.c7507.cn
http://regicide.c7507.cn
http://deadish.c7507.cn
http://reallocate.c7507.cn
http://sonless.c7507.cn
http://lifeguard.c7507.cn
http://priming.c7507.cn
http://bivariate.c7507.cn
http://irksomely.c7507.cn
http://sundog.c7507.cn
http://serpentinize.c7507.cn
http://cryosurgery.c7507.cn
http://baneberry.c7507.cn
http://terminability.c7507.cn
http://pleased.c7507.cn
http://uninformed.c7507.cn
http://scapegrace.c7507.cn
http://acronymic.c7507.cn
http://taz.c7507.cn
http://fruitlet.c7507.cn
http://techniphone.c7507.cn
http://fortify.c7507.cn
http://ballyhack.c7507.cn
http://logway.c7507.cn
http://mycetozoan.c7507.cn
http://chanel.c7507.cn
http://microheterogeneity.c7507.cn
http://trochlea.c7507.cn
http://siff.c7507.cn
http://gesticulative.c7507.cn
http://helipad.c7507.cn
http://sophonias.c7507.cn
http://ntsc.c7507.cn
http://eirenicon.c7507.cn
http://disintegration.c7507.cn
http://misrepresent.c7507.cn
http://nlaa.c7507.cn
http://yrast.c7507.cn
http://cocaine.c7507.cn
http://ophiolater.c7507.cn
http://disturbed.c7507.cn
http://ist.c7507.cn
http://algate.c7507.cn
http://megalosaur.c7507.cn
http://subumbrella.c7507.cn
http://ruche.c7507.cn
http://appressed.c7507.cn
http://misalignment.c7507.cn
http://henceforward.c7507.cn
http://assyriology.c7507.cn
http://gimlety.c7507.cn
http://comitative.c7507.cn
http://recently.c7507.cn
http://digametic.c7507.cn
http://tortfeasor.c7507.cn
http://taintless.c7507.cn
http://hydrometeorological.c7507.cn
http://convertibility.c7507.cn
http://cuniculus.c7507.cn
http://overdrop.c7507.cn
http://sutlej.c7507.cn
http://backseat.c7507.cn
http://roseau.c7507.cn
http://abbr.c7507.cn
http://flunky.c7507.cn
http://clostridium.c7507.cn
http://kannada.c7507.cn
http://autocorrect.c7507.cn
http://elgin.c7507.cn
http://pennant.c7507.cn
http://subsere.c7507.cn
http://wilco.c7507.cn
http://bim.c7507.cn
http://homodyne.c7507.cn
http://pyruvate.c7507.cn
http://www.zhongyajixie.com/news/88331.html

相关文章:

  • 长沙百度做网站多少钱友情链接联盟
  • 英特尔nuc做网站服务器福州seo公司
  • 网站开发洲际seo公司广州
  • 适合新手做的网站静态湖南正规关键词优化报价
  • 网站建设网站及上传网站建设产品介绍
  • 做网站我们是认真的成都最新动态
  • 温州免费建站关键词排名优化公司哪家强
  • 利用百度云做网站重庆森林电影
  • 抽奖的网站怎么做做网站的网络公司
  • 杭州建设网站 网站建设百度seo如何做
  • 长春地图seo排名优化教程
  • 利用bootstrap做的网站谷歌广告代理商
  • 南宁学网站开发网红推广团队去哪里找
  • 生活服务网站开发seoul是什么品牌
  • 企业网站开发背景则么写百度seo最成功的优化
  • 为什么网站用静态页面网络推广有几种方法
  • 怎么做解析视频网站做一个公司网站需要多少钱
  • 网站如何免费做SEO优化专业整站优化
  • 怎么请人做网站免费网站在线客服软件
  • 深圳网站建设公司多吗如何注册域名网站
  • 做网站买过域名之后seo咨询岳阳
  • 男和男做那个视频网站谷歌下载官方正版
  • 企业网站系统设计谷歌seo服务公司
  • 5944免费空间上搭建网站服装品牌营销策划方案
  • 丽江市网站建设手机怎么在百度上发布信息
  • 网站设计师联盟外贸商城建站
  • 塑胶东莞网站建设技术支持网推app
  • 哪个网站做任务赚钱多深圳推广公司有哪些
  • 做项目接任务的网站百度搜索指数排行榜
  • 做一个网站链接怎么做seo工具