Springダイナミック生成ビーンの定義-ビーンDefinitionソース解析(転送)

4345 ワード

BenFactory PostProcessor BenDefinitionRegistryPostProcessor ImportBeanDefinitionRegistrar
ある時、私達はspringを運行する時、必要に応じて前に定義していないspringのbeanを動的に添加して、たとえばmybatisはあるカバンの下のインターフェースをスキャンして、Mapper Beanに転化します.
Beanの定義はSpringの中のコンポーネントの名前:BeanDefinitionです.BeanDefinionを作成すると、BeanDefinitionRegistryインターフェースを通じて、新しいBeanDefinitionをspringコンテキストに登録できます.void register BeanDefinition(String beanname、BeanDefinition beanDefinition)
BenFactoryPostProcessor(Bean工場のバックプロセッサ)というインターフェースの役割は、Springコンテキストの登録Beanで定義された論理が全部走り終わった後であるが、Beanは全て実際化する前に呼び出していない.void postProcessBeanFactory(Configrable Listable BeanFactory)throws BensException;この方法の主な用途は,注入したBenFactoryによって,Beanを本格的に初期化する前に,springコンテキストに動的な修正を行うことである.いくつかのBean定義の値を追加または修正し、さらにいくつかのBenDefinitionを動的に作成することもできます.デモ:
@Override public void postProcess BeanFactory(final Configrable Listable BenFactory BeanFactory)throws BensException{Genese BeanDefinition beanDefinition=getGeneraminDefinition);
((DefaultListableBeanFactory) beanFactory)
    .registerBeanDefinition("dynamicUser", beanDefinition);
Provate GeneratitGeneractDefinition(){GeneramiBenDefinition beanDefinition=new GeneneneneneneneneraicBeanDefinition();beanDefinititionClass(User.class);beanDefinitinititititition. getProtProttyValalalalalalalalalalaattttfinidededededededededededededededededededededededededededededededededededededededededefinininition(((()))"""""""""""""""";beanaaaadedededeバックプロセッサ)上記のようにUserというBeanに関する定義を定義し、このBeanを予め設定しておくName属性値は「張三」であり、最後にbeanFactoryに登録される.
このためSpringは、より具体的なサブインターフェースBenDefinitionRegistryPostProcessorというサブインターフェースの方法を提供しています.でも、実はこの2つの方法は全部注入されたspringの文脈で、ただタイプが違っているだけです.だからできることはそっくりです.
privte Generance Definition getGeneranition(){GeneraicBeanDefinition beanDefinition=new Genenerance Definition();beanDefinitions.set BeanClass(User.class);beanDefinitions.Generation.Generance.GenerancicBenDefinict.Definition."
@Override public void postocess BeanDefiniation Registry(final BenDefinitionRegistry registry)throws BensException{Genercation beanDefinition=getGenersicBenDefinition);registry.registry-Beanfinitionこれは、コンテキストで呼び出されます.
public static void main(String[]args){ConfigrablblaplicationConttexxtx=SprigAppplication.run(DemoAppplication.class,args);User dynamicUser=ctx.getBeaビン(「dynamicUser」,User.User.User,Userprprprprininintttttttttttttttttttttttttttttdddddddycccccccccccccccccccccccccccccdddddddy2」User.class;System.out.println(dynamicUser 2)BenDefinitionBullderの作成者モードはBeanDefinitionを作成します.2.5以降は元々のRootBenDefinitionとChildBenDefinitionに代わりました.私たちは通常GeneraicBenDefinitionを使えば十分です.私たちはBuiderモードを通じてBenDefinitionを設置するためのいくつかの一般的な方法:
//ビーンの構造関数が入ってくるパラメータ値を設定します.putblic BenDefinitionBulder addContstruct ArgValue/構造関数を設定して他のBean putblic BenDefinitionBurder addContstructure ArgReference/この方法を参照します.public BenDefinitionBulder set DestroyMethodName/設定単例/複数例public BenDefinitionBullder set Scape/設定は抽象的なBenDefinitionかどうか、もしSptrueならば、このBeanDefinitionを引き継ぐことはできないことを示します.public BenDefinitionBuider set Abstract/怠惰負荷かどうかは、デフォルトではfalse public BenDefinitionBuider setLazy Init/自動注入依存のモードで、デフォルトではpublic BenDefinitionBulder setwiretointには注入されません.public BenDefinitionBuider set DependencyCheck以上、参考資料:http://www.logicbig.com/tutorials/spring-framework/spring-core/bean-definition/
ImportBeanDefinitionRegistarというインターフェースの実現類の役割は、このインターフェースの実現類が@Importインターフェースにあるマークされた@Configrationの登録クラスを導入すると、この類のすべての注釈が得られ、その後いくつかの動的登録Beanのことができます.例えば、spring cloud feignコンポーネントを使う時、私達はこれらを書きました.
@Spring BootAplication@EnbaleFeign Clients(basePackages=「newbie.yf.service.appi.appi」)public class Aplication{EnbuleFeign Clintsこの注釈の中に「@Import(FeignCliction Clintar.stration)インターフェースを使っています.
@Override
public void registerBeanDefinitions(AnnotationMetadata metadata,
        BeanDefinitionRegistry registry) {
    registerDefaultConfiguration(metadata, registry);
    registerFeignClients(metadata, registry);
}
この中のAnnotationMetadataには一体何が含まれていますか?実はImportにマークされたAppplicationという登録ファイルのすべてのコメントです.注釈のいくつかの構成情報を入手することによって、BenDefinitionを動的に生成することができます.Feignの役割を熟知すれば、主にFeignのクライアントインターフェースのMock Beanであり、mybatisのように考えられます.
イメージ.png
作者:lazygyリンク:https://www.jianshu.com/p/899bd8089352 ソース:簡書著作権は著者の所有になります.商業転載は作者に連絡して授権してください.商業転載ではなく、出典を明記してください.