在SpringBean生命周期中加入钩子函数(翻译)_第1页
在SpringBean生命周期中加入钩子函数(翻译)_第2页
在SpringBean生命周期中加入钩子函数(翻译)_第3页
在SpringBean生命周期中加入钩子函数(翻译)_第4页
在SpringBean生命周期中加入钩子函数(翻译)_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、在SpringBean生命周期中加入钩子函数(翻译)1前言提供一个控制反转功育S是in匡架的核心功能之一。Spring在其应用程序上下文中编排并管理这些ean的生命周期。在本教程中,我们将研究这些eai的生命周期以及如何在其生命周期中加入这些钩子函数。代码示例他的文章附有上的工作代码示例。2什么是SpringBea?n让我们从基础开始在创建、编排和销毁方面受ng的ppiain控制的每个对象都称为SpringBean定义Springea最常见的方法是使用pn注解:pnenaSpringBean如果启用了Spring的自动扫描,则会在应用程序上下文中添加一个SpringBe对象。另一种方法是使用S

2、pring的配置类结合Bean注解进行配置:nigrainaSpringnigrainBeanpiSpringBeanSpringBean)rernneSpringBean)3SpringBean的生命周期当我们观赛pringea的生命周期时,我们可以看到从对象实例化到销毁的多个阶段。SPRINGBEANLIFECYCLECREATIONInstantiation士川川川川DESTRUCTIONPopulatingPropertiesPre-DestroyPre-Initialization接下来让我更详细地解释上图中的这些阶段。1)Bean的创建阶段Beanisreadyan(实例aingr

3、填充属性):在实例化对象后,Spring会扫描实现其方oSpring实例化eari对象,就像我们手动创建a对象实例一样。ar接口,回调ar的回调方法,并开始为其相关属性进行设值。re外,niia预初始化nSpringBeai后处理器n注解的方法在其之后被调用。Beanr在这个阶段开始工作,pring调初始化前处理方法erper标隹初始化)Spririg,行实现niiai泊接卿的aerrperi方的法e这是正式的初始化。ni(i自定义初始化n:戈们用器Bean,an注解的inie属性指定的初始化方法。r在这个阶段再次工作。此阶段触发其初始化后处理方:2)Bean的销毁阶段注解标记的方法。接口的r

4、e_e预销毁Spr在此阶段触发reee标准销毁:Spring执行ea实现ipa接M的ee自定义销毁)nSprin在此阶段触发Bean注解的er属性指定的方法,Post-Imtiarzationr方法。:。Spring将在最后一个阶段运行它们。DestroyCustomDestructioneriniiaiaieBeandestroyedBereni此iaiain)4如何在Bean生命周期中加入钩子函数?在Spring应用程序中,我们有多种方法可以将钩子函数加入到eai生命周期的各个阶段。让我们看看一些例子。1)使用springs供的回调接口我们可以实现Spring的nitiaiingBeat在

5、标准初始化阶段运行自定义操作:oponentcassSpringBeanipeentsnitiaiingBeanerriepicoiaterPropertiesSet)同样,我们可以实现isposabeB接口让Spring在标准销毁阶段调用estro方法oponentcassSpringBeanipeentsisposaeBeanerriepicoiestro)2)使用JSR-25注解Sprin官方支持中的PostonstancPreestro注解。因此,我们可以使用它们在预初始化和销毁阶段加入钩子函数oponentcassSpringBeanPostonstrctpicoipostonstr

6、ct)Preestropicoipreestro)3)使用Bean注解的相关属性此外,当我们定义pringBear时,我们可以在Ja2配置类中设置Bean注解的initetoddestroet属性:onigrationcassSpringonigrationBeaninitetoonnitiaieestroetoonestro)picSpringBeanSpringBean)retrnneSpringBean)我们应该注意,如果我们的ean中有一个名为cose或)sto的公共方法,那么默认情况下它会被当成自定义销毁方法不用显式指定)oponentcassSpringBeanpicoicose)

7、但是,如果我们不希望这种行为,我们可以将)Bean注解的estroet属性设为空字符串即estroeto)=以此来禁用这种默认行为。onigrationcassSpringonigrationBeanestroeto)picSpringBeanSpringBean)retrnneSpringBean)配置对于遗留应用程序,我们可能仍会在配置中保留一些ean幸运的是,我们仍然可以在中配置这些属性。4)使用Bear后处理器BeanPostprocessor我们可以利甩eanPostProce接口在Spring初始化之前或之后运行任何自定义操作,甚至返回修改后的cassBeanPostProcess

8、oripeentsBeanPostProcessorerriepicectpostProcessBeorenitiaiationecteanStringeanae)trosBeansceptionretrneanerriepicectpostProcessternitiaiationecteanStringeanae)trosBeansceptionretrneanBeanrCe是针0对一个特定的Bean我们应该注意,Spring的Beanr是针对rprin上下文中定义的所有ear。5)使用Aware口另一种方法是使用war接口:pnenaSpringBeanipeenBeanaeAwareA

9、ppiainneAwareerriepiieBeanaeSringnae)erriepiieAppiainneAppiainneappiainne)rwBeanepin我们可以使用一些Aware接口将Spring上下文的某些特性如Beana、EBeana等)注入到我们的ean中。5为什么我们需要在Bean生命周期中加入钩子函数?当我们需要根据新的需求扩展我们的软件时,对于找到最佳实践来保持我们的代码库的长期可维护性而言至关重要。在Spring框架中,在大多数情况下,添加钩子函数到eai生命周期是扩展我们的应用程序的好方法。1)获取Bear的相关属性用法之一是在运行时获取eai属性(如ean名称

10、)。例如,当我们需要做一些日志记录时:pnenaaeSpringBeanipeenBeanaeAwareggerggerggerargeggeraeSpringBeana)piieBeanaeSringnae)ggerinnaereae)2)动态改变SpringBea实例在某些情况下,我们需要以编程方式定义ngean当我们需要在运行时重新创建和更改eari实例时,这可能是一个比较实用的解决方案。接下来让我们创建一个pai服务实例该服务实例能够按需动态更新paaaeep到最新版本:SerieapainSerieipeenBeanarAwareeaiaeBeanariaeBeanarpaaaeep

11、iripaaaeepirerriepiieBeanarBeanareanar)rwBeanepiniaeBeanareaiaeBeanar)eanarpaepaaae)piipaepaaae)Sringpaerpwniaaem/ip-dataAraBeaneiniineiniinBeanefinitionBildergeneriBeaneiniinpaaaeepository.class)arperaeiepaeUrl)geBeaneiniin)aeBeanarregierBeaneiniinipaaaeepsitory,einiion)ipaaaeepirialeBeanFactorygeB

12、eanpaaaeepiory.lass);我们可以在Beanar接口的辅助下访问到Beana实例。因此,我们使用最新的数据库文件动态创建我们的paaaeepean并通过将其注册到Spring上下文来更新我们的ear定义。此外,我们在eBeana方法中获取Beana实例后立即调用我们的paepa方法n因此,我们可以在Spring上下文启动之初就创建paaaeepirear的个实例。3)从Spring上下文的外部访问Bean另一种情况是/Spring上下文外部访问Appiain或nBeena实例。例如,我们可能希望将Beana注入到非Spring容器管理的类中,以便能够访问该类中的Springea

13、或其他的一些配置。Spring和ar库之间的集成是展示这种用法的一个很好的例子:AwireapaenSpringBeanpeenAppianContextAwarepriaeAwireapaeBeanareanatory;erriepiieAppiainneinaAppiaionConteeanarnegeAwireapaeBeanatory();ntext)ndle)erriepreeereaenaneinariggerireBnerwepininaeperreaenanene)eanarawireBean)rern在这个例子中,我们使用nn接口来访问rnc并使用n自动装配最初不受Sprin

14、g管理的中的依赖项。此外,常见的Spring之间的集成是另一个有代表性的例子:nigrinignfigpriirppipplipppnrirgiinngrginn用Springnigr注解将r的程序在启动时可注册这些an6DSPring钩子函数的执行顺序标记为ig-个配置类,我们注入ppn实例,并以此实例查找由注解标记的所有下面我们写一个Spring来查看其生命周期各个阶段钩子函数的执行顺序:niSpringingpplipriringringringgrnrriprinringnrrippliprinppprinrriprininiprininiPrprinrrirprinptionrprin此外,我们还创建了一个ro它在r的初始化之前和之后会被回调:rrirnrrirnninninnin,StringnprinnprinnSpringnpinSpringnni接下来,我们编写一个Spring配置类来定义我们的nigrinSpringigurationrnnniniSpringrnnSpringiniSpringnnnininSring最后,我们使用注解来编写一个测试类:看我们的最终结果,我们的测试方法记录了生命周期之间钩子函数的执行先后顺

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论