专栏电商日志财经减肥爱情
投稿投诉
爱情常识
搭配分娩
减肥两性
孕期塑形
财经教案
论文美文
日志体育
养生学堂
电商科学
头戴业界
专栏星座
用品音乐

spring面试必问bean对象的生命周期

  之前简单记录了下springBean的生命周期,最近翻开来看了下,发现自己遗漏了很多细节,很多点都衔接不上今天重新翻看《spring揭秘》,查资料,补了许多细节。希望能够让自己和大家更容易看懂吧Bean的生命周期的完全实现需要两个阶段容器的启动bean的实例化过程(涵盖了bean生命周期的大部分)
  容器的完全实现
  bean实例化过程容器启动阶段重点是收集到元信息配置信息,即创建bean需要的信息(beanDefinition)通过BeanDefinitionReader,读取到beanDefinition信息,再通过beanDefinitionRegistry,将BeanDefinition注册到其里面这是PropertiesBeanDefinitionReader把从properties文件读取到的配置信息,通过BeanDefinitionRegistry注册BeanDefinition的过程AbstractBeanDefinitionbdBeanDefinitionReaderUtils。createBeanDefinition(parent,className,getBeanClassLoader());bd。setScope(scope);作用域默认singletonbd。setAbstract(isAbstract);是否是抽象默认false如果是抽象的,容器不会实例化bean,而是将beanDefinition信息作为其子类使用bd。setLazyInit(lazyInit);懒加载默认false如果是false,容器一启动就会加载beanbd。setConstructorArgumentValues(cas);构造参数bd。setPropertyValues(pvs);属性信息getRegistry()。registerBeanDefinition(beanName,bd);注册BeandefinitionBeanDefinitionReader有多种,包括:
  PropertiesBeanDefinitionReader读取Properties配置文件
  GroovyBeanDefinitionReader读取Groovy配置文件
  XmlBeanDefinitionReader读取Xml配置文件bean实例化前对beanDefinition做出自定义修改
  BeanFactoryPostProcessor实例化bean之前,可以允许修改beanDefinition信息,下面是spring默认实现的BeanFactoryPostProcessor类:PropertyPlaceholderConfigurer允许我们在XML配置文件中使用占位符(PlaceHolder),并将这些占位符所代表的资源单独配置到简单的properties文件中来加载PropertyOverrideConfigurer覆盖对象的属性值我们可以自己实现BeanFactoryPostProcessor依赖注入beanFactory,修改beanDefinition信息bean实例化阶段
  doCreateBean源码方法(下面仅对beanFactory容器做解析,applicationContext容器其实大同小异)Actuallycreatethespecifiedbean。Precreationprocessinghasalreadyhappenedatthispoint,e。g。checking{codepostProcessBeforeInstantiation}callbacks。pDifferentiatesbetweendefaultbeaninstantiation,useofafactorymethod,andautowiringaconstructor。parambeanNamethenameofthebeanparammbdthemergedbeandefinitionforthebeanparamargsexplicitargumentstouseforconstructororfactorymethodinvocationreturnanewinstanceofthebeanthrowsBeanCreationExceptionifthebeancouldnotbecreatedseeinstantiateBeanseeinstantiateUsingFactoryMethodseeautowireConstructorprotectedObjectdoCreateBean(StringbeanName,RootBeanDefinitionmbd,NullableObject〔〕args)throwsBeanCreationException{Instantiatethebean。BeanWrapperinstanceWrappernull;if(mbd。isSingleton()){instanceWrapperthis。factoryBeanInstanceCache。remove(beanName);}if(instanceWrappernull){instanceWrappercreateBeanInstance(beanName,mbd,args);}实例化beanObjectbeaninstanceWrapper。getWrappedInstance();Classlt;?beanTypeinstanceWrapper。getWrappedClass();if(beanType!NullBean。class){mbd。resolvedTargetTypebeanType;}Allowpostprocessorstomodifythemergedbeandefinition。synchronized(mbd。postProcessingLock){if(!mbd。postProcessed){try{applyMergedBeanDefinitionPostProcessors(mbd,beanType,beanName);}catch(Throwableex){thrownewBeanCreationException(mbd。getResourceDescription(),beanName,Postprocessingofmergedbeandefinitionfailed,ex);}mbd。postProcessedtrue;}}EagerlycachesingletonstobeabletoresolvecircularreferencesevenwhentriggeredbylifecycleinterfaceslikeBeanFactoryAware。booleanearlySingletonExposure(mbd。isSingleton()this。allowCircularReferencesisSingletonCurrentlyInCreation(beanName));if(earlySingletonExposure){if(logger。isTraceEnabled()){logger。trace(EagerlycachingbeanbeanNametoallowforresolvingpotentialcircularreferences);}addSingletonFactory(beanName,()getEarlyBeanReference(beanName,mbd,bean));}Initializethebeaninstance。ObjectexposedObjectbean;try{填充bean对象属性populateBean(beanName,mbd,instanceWrapper);初始化beanexposedObjectinitializeBean(beanName,exposedObject,mbd);}catch(Throwableex){if(exinstanceofBeanCreationExceptionbeanName。equals(((BeanCreationException)ex)。getBeanName())){throw(BeanCreationException)ex;}else{thrownewBeanCreationException(mbd。getResourceDescription(),beanName,Initializationofbeanfailed,ex);}}if(earlySingletonExposure){ObjectearlySingletonReferencegetSingleton(beanName,false);if(earlySingletonReference!null){if(exposedObjectbean){exposedObjectearlySingletonReference;}elseif(!this。allowRawInjectionDespiteWrappinghasDependentBean(beanName)){String〔〕dependentBeansgetDependentBeans(beanName);SetStringactualDependentBeansnewLinkedHashSet(dependentBeans。length);for(StringdependentBean:dependentBeans){if(!removeSingletonIfCreatedForTypeCheckOnly(dependentBean)){actualDependentBeans。add(dependentBean);}}if(!actualDependentBeans。isEmpty()){thrownewBeanCurrentlyInCreationException(beanName,BeanwithnamebeanNamehasbeeninjectedintootherbeans〔StringUtils。collectionToCommaDelimitedString(actualDependentBeans)〕initsrawversionaspartofacircularreference,buthaseventuallybeenwrapped。Thismeansthatsaidotherbeansdonotusethefinalversionofthebean。ThisisoftentheresultofovereagertypematchingconsiderusinggetBeanNamesForTypewiththeallowEagerInitflagturnedoff,forexample。);}}}}Registerbeanasdisposable。try{检查是否实现DisposableBean接口,有的话注册销毁回调方法registerDisposableBeanIfNecessary(beanName,bean,mbd);}catch(BeanDefinitionValidationExceptionex){thrownewBeanCreationException(mbd。getResourceDescription(),beanName,Invaliddestructionsignature,ex);}returnexposedObject;}首先第一步,调用createBeanInstance方法,利用反射调用类的构造方法,实例化bean,返回beanWrapper对象,再调用getWrappedInstance方法得到实例化的bean,beanWrapper对象具有获取对象属性的功能,所以可以调用populateBean用来实现属性填充。
  20230225155458开始实例化bean之前,会检查bean有没有实现过Aware接口,如果有则实现。AbstractAutowireCapableBeanFactory类中的initializeBean方法privatevoidinvokeAwareMethods(StringbeanName,Objectbean){if(beaninstanceofAware){如果Spring容器检测到当前对象实例实现了该接口,会将该对象实例的bean定义对应的beanName设置到当前对象实例。if(beaninstanceofBeanNameAware){((BeanNameAware)bean)。setBeanName(beanName);}如果容器检测到当前对象实例实现了该接口,会将对应加载当前bean的Classloader注入当前对象实例。默认会使用加载org。springframework。util。ClassUtils类的Classloaderif(beaninstanceofBeanClassLoaderAware){ClassLoaderbclgetBeanClassLoader();if(bcl!null){((BeanClassLoaderAware)bean)。setBeanClassLoader(bcl);}}if(beaninstanceofBeanFactoryAware){((BeanFactoryAware)bean)。setBeanFactory(AbstractAutowireCapableBeanFactory。this);}以上几个Aware接口只是针对BeanFactory类型的容器而言}}
  对于ApplicationContext类型容器,会额外实现几个Aware接口BeanPostProcessor阶段
  BeanPostProcessor的概念容易与BeanFactoryPostProcessor的概念混淆。但只要记住BeanPostProcessor是存在于对象实例化阶段,而BeanFactoryPostProcessor则是存在于容器启动阶段,这两个概念就比较容易区分了。
  BeanPostProcessor有两个需要子类实现的方法publicinterfaceBeanPostProcessor{调用bean的init方法之前做的前置处理NullabledefaultObjectpostProcessBeforeInitialization(Objectbean,StringbeanName)throwsBeansException{returnbean;}调用bean的init方法之后做的前置处理NullabledefaultObjectpostProcessAfterInitialization(Objectbean,StringbeanName)throwsBeansException{returnbean;}}
  在initializeBean方法内可以看到BeanPostProcessor的调用顺序protectedObjectinitializeBean(StringbeanName,Objectbean,NullableRootBeanDefinitionmbd){if(System。getSecurityManager()!null){AccessController。doPrivileged((PrivilegedActionObject)(){invokeAwareMethods(beanName,bean);returnnull;},getAccessControlContext());}else{调用实现了Aware接口的对象方法invokeAwareMethods(beanName,bean);}ObjectwrappedBeanbean;if(mbdnull!mbd。isSynthetic()){BeanPostProcessor前置处理wrappedBeanapplyBeanPostProcessorsBeforeInitialization(wrappedBean,beanName);}try{调用bean的init方法invokeInitMethods(beanName,wrappedBean,mbd);}catch(Throwableex){thrownewBeanCreationException((mbd!null?mbd。getResourceDescription():null),beanName,Invocationofinitmethodfailed,ex);}if(mbdnull!mbd。isSynthetic()){BeanPostProcessor后置处理wrappedBeanapplyBeanPostProcessorsAfterInitialization(wrappedBean,beanName);}returnwrappedBean;}
  注意:applcationContext容器中实现BeanPostProcessor接口的postProcessBeforeInitialization中,会对实现了Aware接口的bean进行invoke调用。这里和BeanFactory有些不同,BeanFactory是在BeanPostProcessor之前实现的InitializingBean和initmethod
  这两个方法都是在invokeInitMethods方法里调用,InitializingBean接口需要实现afterPropertiesSet方法允许bean实例在设置完所有bean属性后执行其整体配置验证和最终初始化。initmethod,对于用户来说可以自定义方法的名称,也可以统一设置所有对象的initMethod比较灵活,避免修改代码,耦合性低。DisposableBean与destroymethod
  DisposableBean接口,子类需要实现destroy方法,来销毁对象,只适用于单例对象,不是单例的话,需要交给调用者自己销毁。destroymethod注册销毁函数,作用和destroy方法同理总结
  本文主要讲了bean在BeanFacotry容器的生命周期,applicationContext容器稍微提了几点不同,applicationContext容器增加更多的特性,像事件发布监听,国际化信息支持等。bean的生命周期主要涉及到容器的加载和bean的实例化。
  容器的加载:加载资源文件到beanDefinition(元信息)调用实现了BeanFactoryPostProcessor接口的方法,可以对beanDefinition进行修改。
  bean的实例化:利用反射beanDefinition元信息实例化得到对象populateBean方法填充属性检验对象是否实现过Aware接口,有则调用其实现如果对象有实现BeanPostProcessor接口,需要先实现前置方法调用InitializingBean和initmethod方法如果有实现或标记的话再调用BeanPostProcessor接口的后置方法最后查看对象是否实现DisposableBean与destroymethod来销毁bean(DisposableBean接口只针对单例bean)资料:
  《spring揭秘》王福强

张杰王心凌惊喜空降云南卫视视频号微博3月9日1830首发直播长安智电iDD新品发布会暨智电之夜第二弹!智电之夜ROUND2狂欢来袭3月9日1830云南卫视视频号微博首发直播智电iDD新品重磅发布张杰王心凌惊喜空降智电随行,解锁智电iDD狂欢声浪嘉宾表演节目单新鲜出炉抢先看智电狂欢来明星拍的戏被剪掉正常吗?姚晨拍的脐带也被剪了,听听她解释新浪娱乐资讯网3月11日播报了一则关于姚晨澄清自己在脐带中的一段戏被自己剪了的原因。姚晨说作为一般的演员都肯定会说为什么要剪掉我的戏,其实这部戏她是监制,她是零片酬出演的,就连假发梯田种出旅游饭龙胜大寨村的蝶变之路来源中央广电总台国际在线编辑杨玉国龙胜大寨村梯田景观国际在线报道(记者郭雅雯)广西桂林市龙胜各族自治县龙脊镇大寨村,地处龙脊梯田核心区金坑片区。这里有着2300多年的梯田耕种历史,漫画推荐性教育到底有没有必要普及?众所周知,家长是子女的第一任教师,家长的言行,从某种程度上来说,它影响到了儿童的发展,儿童应该体验懵懂无知的生活,到了学许多东西的阶段,在某些情况下,孩子向家长提出的问题会使家长很上新!龙江路漫画街主题墙绘1LOOK!QINGDAO糖小狐的小幸福充满梦幻氛围的动漫街龙江路,以各种动漫涂鸦出圈,走进这里,就像不小心踏入了宫崎骏的童话世界。最近,龙江路上又添了一组全新主题墙绘马里奥逛玩青岛全身涂白内裤半露漫画腰一口假牙娱圈病态审美,该停停了前言明星艺人们都十分在意自己的外貌,他们的日常穿搭和各种活动造型,都有可能会成为当下的时尚热潮。他们平时的造型大部分都由专门的造型师所设计,从头发丝到指甲到脚都是精心打造的结果。但顺丰持续提速打造差异化服务,使用户不会感到顺丰慢不久前,上海市邮政管理局发布该市2022年第四季度快递发展指数报告。该季度,上海市快递业整体运行平稳有序,市场规模较三季度恢复性增长,服务质效提升明显,对外开放加快推进,海外市场规支付宝收付款有漏洞,导致用户财产损失,已有多人因漏洞被盗刷!支付宝是我们经常使用的支付软件,它确确实实方便了我们的日常生活。但最近支付宝却被爆出存在安全隐患,支付宝收付款功被电信诈骗犯罪分子盯上了,目前已有多人被骗。其中有一位因为支付宝收付周末今晨发生了什么?YiMagazine十四届全国人大一次会议将于3月13日闭幕,中国完成重要人事布局十四届全国人大一次会议在北京人民大会堂举行。(图片来源新华社)3月10日,十四届全国人大一次会议在北京人民大会堂举行第3月换新机,最好一步到位,推荐入手骁龙8手机,体验感拉满如果您喜欢,可以点击上面的关注二字。后续会为您提供更多有价值的内容。今天分享3月换新机,最好一步到位,推荐入手骁龙8手机,体验感拉满第一款荣耀80GT参考价格2999元(12256专栏丨胡代松少年游东洞庭湖观天鹅少年游东洞庭湖观天鹅迎春花发去年枝,北雁欲回飞。巴陵风软,汩罗水暖,邀约理归衣。潇湘虽是江南地,怎奈脍鲈思。一生相携,御风共舞,真爱世间稀。岱松本名胡代松,湖南澧县人。近年来,其诗
我是普通单位员工,已经六七年了,下班了我瞒着单位去别的地方做私活,会违法吗?解答百姓疑惑,追踪社会热点,敬请关注头条号全民普法宣传感谢邀请。随着经济发展,物价也在飞涨,很多人都会选择兼职来养家,但是兼职行为到底违法违法,今天给大家分析一下1我国法律并不禁止第一次从合肥去北京旅游,该怎么玩?我虽然不是北京人,但是去过北京多少次我自己也数不清了,因为离得很近,所以有时间就去玩,我是个旅游爱好者,下面几个地方是建议您必须去看看的!北京故宫第一次来的人,北京故宫是肯定要去的为何感觉古人很容易参透周易八卦,现代人却不能呢?古者伏羲(6000年前)仰观天象,俯查地理,感悟人情,将天地人统一于一体,而各又因时空变幻而有别。此乃万物旁通,触景生情。八卦类比,触类旁通。易经为八卦之精辟解说,不失于本。道法自如何评价摩登兄弟刘宇宁的唱功?喜欢他的歌声,能够吸引人,有人说他靠翻唱走红,但是我觉得那是他本事,翻唱能唱出自己的味道,声音的辨识度很高,现在他有自己EP,也有自己的专辑,都很好听,而且说实话,他的歌听起来简单lol中单英雄carry等级排名,刀妹s级亚索c级,你认同吗?英雄联盟中路一直以来都是最重要的一路,中单英雄也是承担着带节奏后期carry的重担。最近知名博主将各个中单英雄的carry能力进行排名,从s级到e级不等。下调卡牌下调到c,卡牌是节王者荣耀多久没登陆才会送snk英雄?从15年开始玩这个游戏,到现在玩了也有两年了,也算是个老玩家了。基本上游戏里大大小小的活动,什么的都有所耳闻。像你问的这个多久不上线送SNK英雄,我可以明确的告诉你,压根就没有这么DNF同为buff装,金镶玉和高科技相比如何?相差甚微!毕竟89的职业都是用来换装,都是1buff,无非是一个逼格的问题。可能奶妈会有一些蚊子腿的差距,金镶玉的数值要比高科技高!金镶玉翠指环30级技能全部加1,也就没有了高科技父母一次性花10万元买社保,下个月领工资,值吗?值,我爸妈多买了,10W不到一点,大概9。8W左右,我算过相当于一次买断15年,相当于养老基数12月15年,当然现在要10几万了,我爸妈78年前买的,因为现在基数高了好多,这政策在兰州石化职业技术学院和兰州资源环境职业技术学院哪所更有实力?这两天,仔细翻阅了这两所在甘肃乃至全国职教界有一定影响的高职学院。用事实来说,资环学院实力已经完全超越了石化学院。甘肃职业教育实力排名可大致分为三个阶段第一阶段2012年年前,石化不会投三分的中锋,是否很难到杜锋麾下效力?不会投三分的中锋,是否很难到杜锋麾下效力?这道不一定,如周琦,道是也有三分远投,但随着周琦体重增加,三分球还很不稳定,但周琦有着2,16米身高,和2,33米臂展,攻防两端对对方造成6000预算买笔记本电脑买苹果的好还是WINDOWS的好?在这个价位上的笔记本电脑选择的余地很大,建议选用你喜欢的配置即可。6000,还问买苹果笔记本?你是想买一框苹果加两本笔记本吧!我预算10万,请问是买波音好,还是空客好?在线等,很急
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网