たBeanFactoryは、特定のコンテナが仕様を提供して達成するために、コンテナIOC、IOCの最も基本的な形を提供するためのインタフェースであります
FactoryBeanのも、インターフェースBeanを達成するためにIOCのコンテナに基づいてIOCコンテナ実装豆、FactoryBeanのためのより多くの柔軟な方法を提供し、加えて、単純なファクトリパターン、装飾模様、我々は柔軟のgetObject()メソッドを設定することができます。実際には、春のソースコードの多くのFactoryBeanの実装クラスがあります。
差:たBeanFactoryは、工場で、FactoryBeanの豆、IOCコンテナまたはオブジェクトファクトリです。春には、すべてのBeanがたBeanFactory(すなわちIOCコンテナ)によって管理されます。しかしFactoryBeanの心配、これは、単純なビーンビーンではなく、その実装と設計工場モデルのモデルと修正モードに似たオブジェクト豆の植物を、生産または変更の生成が可能
1、たBeanFactory
それはファクトリクラス(であることを示している工場を終了したBeanFactory、インタフェース工場豆の生産と管理を担当して)、。春では、たBeanFactoryコアインターフェイスはIOCコンテナであり、その責任は、:インスタンス化または構成アプリケーションオブジェクトとそれらのオブジェクト間の依存関係を。たBeanFactoryインタフェースのみではなく、特定の実現IOCコンテナが、Springコンテナは、一般的にXMLおよび出願に記載された目的を達成するために、XmlBeanFactoryに使用さDefaultListableBeanFactory、XmlBeanFactory、ApplicationContextのような、のような多くの実装を与えますオブジェクト間の依存関係。
パッケージorg.springframework.beans.factory。 輸入org.springframework.beans.BeansException。 輸入org.springframework.core.ResolvableType。 輸入org.springframework.lang.Nullable; パブリック インターフェイスたBeanFactory { / **
用于区分FactoryBeanの和豆、后面会讲到
* / ストリングFACTORY_BEAN_PREFIX = "&" 。 / ** 返回BYNAME返回豆的实例* / オブジェクトgetBean(文字列名)がスローBeansExceptionを。 <T> T getBean(文字列名は、クラス<T> requiredType)スローBeansException。 オブジェクトgetBean(文字列名、オブジェクト...引数)スローBeansExceptionは、 <T> T getBean(クラス<T> requiredType)がスローBeansException。 <T> T getBean(クラス<T> requiredType、オブジェクト...引数)をスローBeansException。 / ** *怠惰なオンデマンド検索を可能にし、指定されたBeanのプロバイダを返し 可用性や独自性オプションを含むインスタンスの*、。 * @param requiredType Beanが一致しなければならないタイプ。インタフェースまたはスーパークラスとすることができる * @return 対応プロバイダハンドル * @since 5.1 * @see #getBeanProvider(ResolvableType) / * <T> ObjectProvider <T> getBeanProvider(クラス<T> requiredType) <T> ObjectProvider <T> getBeanProvider(ResolvableType requiredType); / ** それがtrueに返す場合、植物は、ビーン定義指定された名前が含まれているか否かを判断* / ブールcontainsBean(文字列名); / **は シングルトンビーンか否かを判断する* / ブール isSingleton(文字列名)スローNoSuchBeanDefinitionException意志; / **は 複数の実施例ビーンか否かを判断する* / ブール isPrototype(文字列名)スロー; NoSuchBeanDefinitionException意志 / * * 豆指定された名前が指定された一致する持っているタイプを確認してください。 * / ブール isTypeMatch(文字列名、ResolvableType typeToMatch) スロー; NoSuchBeanDefinitionException ブール isTypeMatchを(文字列名、クラスtypeToMatch <?>)スロー; NoSuchBeanDefinitionExceptionを / ** 指定されたBeanインスタンスが見つからない場合は、Beanのクラス指定された名前に戻り、除外* / @Nullable クラス <?>のgetType( )文字列に名前をスローNoSuchBeanDefinitionExceptionであろう; / **は 全て、所与のBeanエイリアス名返す * / 文字列[] getAliases(文字列名); }
2、FactoryBeanの
<豆>を使用して、一般的な、春反射の属性は、Beanクラスのインスタンスのクラスを指定し、特定の状況下で、ビーンインスタンス化プロセスが複雑であり、従来の方法ならば、<豆>で大量に提供することが必要であるに設定情報。符号化方法は、単純な溶液を得ることが使用される場合の配置の自由度が制限されています。春のファクトリクラスは、このためのインタフェースは、ユーザは、このインターフェースのカスタマイズを実装するロジックによってビーンをインスタンス化することができorg.springframework.bean.factory.FactoryBean提供します。スプリングフレームワークのFactoryBeanのインタフェースが重要な位置を占め、春は70以上FactoryBeanの独自の実装を提供します。彼らは、上位のアプリケーションが容易になりに、複雑な豆の例のいくつかの詳細を隠します。Spring3.0開始から、FactoryBeanのは、一般的な、すなわち、インターフェース宣言の代わりにFactoryBeanの<T>の形式をサポートし始めました
それは豆であることを示す、豆を終了豆は、通常とは異なる:それは実現されるFactoryBeanの<T>ビーンインターフェース、ビーンから得られたIDに基づいて、実際に()は、オブジェクトが返さFactoryBeanのたBeanFactoryのgetObjectあります代わりに、自分自身をFactoryBeanのあなたはFactoryBeanのオブジェクトを取得したい場合は、取得するには、IDの前にアンパサンドを追加します。
例えば:私は、スプリングコンテナを初期化する必要があるクラスの車{名前、カラー...等の特性を}定義しました
パブリック クラスの車{ プライベート文字列名; プライベート文字列の色。 パブリック文字列のgetName(){ 返す名前。 } 公共 ボイドのsetName(文字列名){ 名前 = 名前。 } パブリック文字列GETCOLOR(){ 戻り色。 } 公共 ボイドsetColorを(文字色){ この .color = 色。 } @Override パブリック文字列のtoString(){ リターン "カー{" + "NAME = '" +名+ '\'' + "カラー=" '+色+ '\'' + '}' 。 } }
方法a:XMLを介して、その春を設定します。
方法2:インタフェースFactoryBeanのを実装するクラスを定義CarProxy。
パブリック クラス CarProxyは実装 FactoryBeanの<車> { プライベート文字列MSGを; プライベートカーの車。
//重写のgetObject方法、返回实例車 @Override 公共車のgetObject()がスロー例外{ 車の車は = 新しい車を(); 文字列[] magArr = msg.split( "" )。 car.setName(magArr [ 0 ])。 car.setColor(magArr [ 1 ])。 この .CAR = 車。 リターン車; } @Override 公衆<?>クラスgetObjectType(){ 戻り 、この()== .getClassをヌル car.getClass():この.getClass()。 } 公共 ボイドsetMsg(文字列MSG){ この .MSG = MSG。 } }
XML:
<?xml version = "1.0"エンコード= "UTF-8"?> <豆のxmlns = "http://www.springframework.org/schema/beans" のxmlns:XSI = "http://www.w3.org / 2001 / XMLスキーマ・インスタンス」 のxsi:のschemaLocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <ビーンID = "車" クラス = "cn.cg.beanFactory.CarProxy"> <プロパティ名= "MSG"値= "法拉利、红色" /> </豆> </豆>
テスト:
@RunWith(SpringJUnit4ClassRunner クラス) @ContextConfiguration( "クラスパス:applicationContext.xmlを" ) パブリック クラスのMyTest { @Autowired プライベートApplicationContextの交流。 @Test 公共 ボイドFUN1(){ // 車の 車の車=(車)ac.getBean( "車" )。 System.out.println(車)。 } }
コンソール:
車{NAME = 'フェラーリ'、色= '赤'}
注意深い観察: "車" ----> cn.cg.beanFactory.CarProxy
理由ac.getBean(「車」);取得したオブジェクトはCarProxyオブジェクトでなければなりませんが、私は、オブジェクトが車の対象となった変換、および成功した彼らはそれをオーバーライドするのtoString()メソッドを呼び出します?
我々は、特別な治療を達成するためのインタフェースを実装するクラスの春FactoryBeanのをgetBeanときので、
あなたがでgetBean(「車」)、春を呼ぶときCarFactoryBeanがFactoryBeanの界面反射を達成しました、
次にSpringコンテナは、インタフェースメソッドCarFactoryBean#のgetObject()メソッドの戻りを呼び出します。あなたがCarFactoryBeanのインスタンスを取得したい場合は、
「&」プレフィックスはのbeanName前に必要とされるでgetBean(のbeanName)メソッドを使用している場合、表示される:getBeanとして(「&カー」);
なぜデザインを春すべきです
理由の一つ:
たとえば、私たちは、春のMyBatisのを統合する必要があるMyBatisのバネのない状態で(春-MyBatisのは、あなたがシームレスに春にコードを統合するのに役立ちますMyBatisの)、
我々は2つの最も一般的な方法を使用することを考えて、その後、コンテナ春に注入SqlSessionFactoryコアクラスをMyBatisのために必要があります
(1)ノートは、MyBatisのは。春とは何の関係も独立したプロジェクトではありませんので、でき渡し!!!!
(2)XML、依存関係の多くを注入するsqlSessionFacory必要性、不便なメンテナンス
だから、私たちはSqlSessionFactoryBeanの統合春+ MyBatisの中で使用するものですsqlSessionFacoryを、処理するためにプロキシクラスを選択することができます
参考:https://www.cnblogs.com/aspirant/p/9082858.html