Springは、BeanPostProcessor、BeanFactoryPostProcessor、BeanValidationPostProcessor、その他のポストプロセッサなど、開発者が拡大するための多くのポストプロセッサを提供します。それらの使用方法のほとんどは似ています。それらの1つを理解し、使用方法を習得すると、他の方法は類推によって理解できます。
ここでは、beanpostprocessorを使用して、使用方法を示す例として使用します。
BeanPostProcessorインターフェイスは、開発者がカスタマイズする2つの方法を提供します:プロセス後の前触覚化とプロセッアフテラのポストプロセス。
PostProcessBeforeInitialization:この方法は、主にBeanが初期化されたときに初期化方法を呼び出す前にプロセスをカスタマイズするためのものです。
ポストプロセッアフテテリティアル化:この方法は、主にBeanの初期化時に初期化方法を呼び出した後、プロセスをカスタマイズするためのものです。
サンプルコード:
/** *テストbean */public class cat {private string name;プライベートインクエイジ; public void say(){system.out.println( "name:" + name); System.out.println( "age:" + age); } public string getname(){return name; } public void setName(string name){this.name = name; } public int getage(){return age; } public void Setage(int age){this.age = age; }} /***カスタムポストプロセッサ*/パブリッククラスのcatbeanpostprocessorはbeanpostprocessor {@nullable @override public object postprocessbeasseforeinitialization(object bean、string beanname)beansection {if(bean instance of cat){// output cat cat =(cat)bean; cat.say();豆を返します。 } return bean; } @nullable @Override public Object postprocessafterinitialization(object bean、string beanname)throws beansexception {if(bean instance of cat){//属性値を変更し、cat cat =(cat)beanを返します。 cat.setname( "hello maomi"); cat.setage(3);猫を返します。 } return bean; }} /** run */public class run {public static void main(string [] args){applicationContext ApplicationContext = new ClassPathxMLApplicationContext( "Spring-Bean.xml"); cat cat =(cat)applicationContext.getBean( "cat"); cat.say(); }}XML構成情報
<! - bean and initialize-> <bean id = "cat"> <プロパティ名= "name" value = "hellokitty" /> <プロパティ名= "age" value = "1" /> < /bean> <bean id = "catbeanpostprocessor" />>
出力結果:
名前:Hellokitty
年齢:1
名前:こんにちはマオミ
年齢:3
ポストプロセッサを介して処理されたBean情報が変更されたことがわかります。最後に、ソースコードでカスタム実装を呼び出す方法を見てみましょう。
初期化Beanメソッド:AbstractAutowireCapableBeanFactory.java
/** *初期化Bean */保護されたオブジェクトInitializeBean(最終的な文字列beanName、最終オブジェクトBean、@nullable rootbeandefinition mbd){//無関係なコードオブジェクトwrappedbean = beanの一部を省略します。 //初期化の前にif(mbd == null ||!mbd.issynthetic()){lappedbean = applbeanpostprocessorsbeforeInitialization(lappedbean、beanname); } try {//初期化メソッドを呼び出してBean InvokeInitMethods(beanname、lappedbean、MBD)を初期化します。 } catch(throwable ex){新しいbeancreationexception((mbd!= null?mbd.getResourcedescription():null)、beanName、「init method of init methoded failed」、ex); } // if(mbd == null ||!mbd.issynthetic()){rappedbean = applybeanpostprocessorsafterinitialization(lappedbean、beanname); } return lappedbean; } // postProcessBeForeInitializationメソッド@OverrideパブリックオブジェクトApplyBeanPostProcessorsBeArforeInitialization(Object expstinceBean、String BeanName)Throws BeanSexception {Object Result = expstinceBean; for(beanpostprocessor beanprocessor:getbeanpostprocessors()){//カスタムポストプロセスの前面化メソッドオブジェクトを呼び出すcurrent = beanprocessor.postprocessbeforeinitialization(result、beanname); if(current == null){return result; } result = current; } return result; } // postProcessafterInitializationメソッド@OverrideパブリックオブジェクトApplyBeanPostProcessorsOrsORSORSORINITIALIZAITION(Object expstingBean、String BeanName)Throws BeanSexception {object result = expstincebean; for(beanpostprocessor beanprocessor:getbeanpostprocessors()){//カスタムポストプロセッサフテリニアル化メソッドはオブジェクトcurrent = beanprocessor.postprocessafterinitialization(result、beanname); if(current == null){return result; } result = current; } return result; }上記は、カスタムメソッドを実装するためのスプリングの呼び出しプロセスです。私はそれがすべての人の学習に役立つことを願っています、そして、私は誰もがwulin.comをもっとサポートすることを願っています。