package Ġcom . lab ij ie . infra . orm . configuration Ċ Ċ import Ġorg . springframework . beans . Property Values Ċ import Ġorg . springframework . beans . factory . Bean Name Aware Ċ import Ġorg . springframework . beans . factory . config . Configurable List able BeanFactory Ċ import Ġorg . springframework . beans . factory . config . Property Resource Configurer Ċ import Ġorg . springframework . beans . factory . config . Typed StringValue Ċ import Ġorg . springframework . beans . factory . support . Bean Definition Registry Ċ import Ġorg . springframework . beans . factory . support . Bean Definition Registry Post Processor Ċ import Ġorg . springframework . beans . factory . support . Default List able BeanFactory Ċ import Ġorg . springframework . context . ApplicationContext Ċ import Ġorg . springframework . context . ApplicationContext Aware Ċ import Ġorg . springframework . context . Configurable ApplicationContext Ċ import Ġorg . springframework . util . StringUtils Ċ import Ġkotlin . reflect . K Class ĊĊ Ċ class ĠTable Definition Post Processor Ġ: ĠBean Definition Registry Post Processor , ĠApplication Context Aware , ĠBean Name Aware Ġ{ ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġcontext : ĠApplication Context ĊĠĠĠ Ġprivate Ġvar Ġbean Name : ĠString Ġ= Ġ"" ĊĊĠĠĠ Ġoverride Ġfun Ġpost Process BeanFactory ( bean Factory : ĠConfigur able List able BeanFactory ) Ġ{ ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġpackages : ĠString Ġ= Ġ"" ĊĠĠĠ Ġvar Ġprocess Property Place Hold ers Ġ= Ġfalse ĊĠĠĠ Ġvar Ġexclude Classes : ĠString Ġ= Ġ"" ĊĊĠĠĠ Ġoverride Ġfun Ġpost Process Bean Definition Registry ( registry : ĠBean Definition Registry ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġif Ġ( this . process Property Place Hold ers ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Property Place Hold ers () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġscan er Ġ= ĠTable Scanner ( registry , Ġexclude Classes ) ĊĠĠĠĠĠĠĠ Ġscan er . resource Loader Ġ= Ġcontext ĊĊĠĠĠĠĠĠĠ Ġif ( packages . isNotBlank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpackages Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStringUtils . tokenize ToString Array ( packages , ĠConfigur able ApplicationContext . CONFIG _ LOCATION _ DE LIMIT ERS ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscan er . scan (* packages ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġset ApplicationContext ( application Context : ĠApplication Context ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcontext Ġ= Ġapplication Context ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/* ĊĠĠ Ġ* ĠBean Definition Regist ries Ġare Ġcalled Ġearly Ġin Ġapplication Ġstartup , Ġbefore ĠBean Factory Post Processors . ĠThis Ġmeans Ġthat ĊĠĠ Ġ* ĠProperty Resource Configur ers Ġwill Ġnot Ġhave Ġbeen Ġloaded Ġand Ġany Ġproperty Ġsubstitution Ġof Ġthis Ġclass ' Ġproperties Ġwill ĊĠĠ Ġ* Ġfail . ĠTo Ġavoid Ġthis , Ġfind Ġany ĠProperty Resource Configur ers Ġdefined Ġin Ġthe Ġcontext Ġand Ġrun Ġthem Ġon Ġthis Ġclass ' Ġbean ĊĠĠ Ġ* Ġdefinition . ĠThen Ġupdate Ġthe Ġvalues . ĊĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġprocess Property Place Hold ers () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġp rc s : ĠMap < String , ĠProperty Resource Configurer > Ġ= Ġthis . context . get Beans OfType ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠProperty Resource Configurer :: class . java , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse , Ġfalse ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġif Ġ( pr cs . isNotEmpty () Ġ&& Ġcontext Ġis ĠConfigur able ApplicationContext ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmapper Scanner Bean Ġ= Ġ( context Ġas ĠConfigur able ApplicationContext ). bean Factory ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. getBean Definition ( bean Name ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠProperty Resource Configurer Ġdoes Ġnot Ġexpose Ġany Ġmethods Ġto Ġexplicitly Ġperform ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġproperty Ġplaceholder Ġsubstitution . ĠInstead , Ġcreate Ġa ĠBean Factory Ġthat Ġjust ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcontains Ġthis Ġmapper Ġscanner Ġand Ġpost Ġprocess Ġthe Ġfactory . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfactory Ġ= ĠDefault List able BeanFactory () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfactory . register Bean Definition ( bean Name , Ġmapper Scanner Bean ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( prc Ġin Ġp rc s . values ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġp rc . post Process BeanFactory ( factory ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalues : ĠProperty Values Ġ= Ġmapper Scanner Bean . property Values ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . packages Ġ= Ġget PropertyValue ( this :: packages . name , Ġvalues ) Ġ?: Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . exclude Classes Ġ= Ġget PropertyValue ( this :: exclude Classes . name , Ġvalues ) Ġ?: Ġ"" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget PropertyValue ( propertyName : ĠString , Ġvalues : ĠProperty Values ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġproperty Ġ= Ġvalues . getProperty Value ( propertyName ) Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġproperty . value ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( value Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ( value Ġas ? ĠString )?. toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġif Ġ( value Ġis ĠTyped StringValue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue . value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġset Bean Name ( name : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . bean Name Ġ= Ġname ĊĠĠĠ Ġ} Ċ }