無国籍の豆の範囲は、シングルトンのインスタンスです。プロトタイプのBean BをSingletonのBean Aに注入し、Bean AのGetBeanb()が呼び出されるたびに新しいBean Bを返すことができることを願っています。この要件は、従来の注入方法を使用して達成することはできません。関連する豆のシングルトンの豆注入の作用は一度しか発生しないため、豆bの範囲はプロトタイプタイプですが、getbeanb()を介して返されるオブジェクトは、最初に注入された豆bです。
したがって、BeanaのGetBeanb()を呼び出すたびに新しいBeanbを返したい場合は、オプションのソリューションは、BeanaにBeanFactoryAwareインターフェイスを実装して、コンテナにアクセスしてから次の方法で実装できるようにすることです。
最初にXMLを構成します:
<bean id = "著者" scope = "prototype"/> <bean id = "book" p:name = "veil"> </bean>
Bean Authorのスコープはプロトタイプに設定されています。
本のクラスは、BeanFactoryAwareインターフェイスを実装しています。
パブリッククラスの本は、beanfactoryaware {...@overridepublic void setbeanfactory(beanfactory beanfactory)throws beansexception {this.factory = beanfactory;} public Author getPrototypeAuthor(){return(著者)Factory.getBean( "著者"); }}ユニットテスト:
ApplicationContext Context; @beForeMethodpublic void setup()Throws Exception {context = new ClassPathxMLApplicationContext( "BEANS5-5.XML");}@testPublic void test(){book book =(book)context.getBean( "book"); system.out.println(book.getauthor()。hashcode()); system.out.println(book.getauthor()。hashcode()); system.out.println(book.getPrototypeAuthor()。hashcode()); system.out.println(book.getPrototypeAuthor()。hashcode());テスト結果
結果から、BeanFactoryから取得した著者インスタンスのみが異なることがわかります。
この実装は、アプリケーションをSpringフレームワークに拘束します。より良い解決策はありますか?はい、それは注入方法です。
1注入方法
スプリングコンテナはCGLIBライブラリに依存しているため、ランタイム中にクラスのバイトコードを動的に作成したり、サブクラスや豆の実装クラスを作成したりするなど、動的に動作させることができます。
bookinterfaceインターフェイス:
public interface bookinterface {著者getauthor();}XML設定:
<! - メソッドインジェクション - > <bean id = "著者" scope = "prototype" p:name = "maugham"/> <bean id = "book2"> <lookup-method name = "getauthor" bean = "著者"/> </bean> </bean>
ユニットテスト:
bookinterface book =(bookinterface)context.getbean( "book2"); assert.assertequals( "maugham"、book.getauthor()。getname()); assert.asserttrue(book.getauthor()。hashcode()!= book.getauthor()。ハッシュコード()。
この構成方法を通じて、インターフェイスに動的実装を提供でき、この方法で返される豆はすべて新しいインスタンスです。
したがって、Singleton BeanでプロトタイプBeanを取得したい場合は、Lookupを使用して注入方法を実装できます。
2交換方法
春には、特定の豆の方法を使用して、豆の別の方法を置き換えることができます。
本にgetName()メソッドがあるとして、タイトルを取得します。
/*** book title*/private string name; public string getname(){return name;}ここで、本のgetName()メソッドを置き換えるためにMethodReplacerインターフェイスを実装する新しいBeanを作成します。
Public Class Book4を実装MethodReplacer {@Override public Object Reimplement(Object obj、Method Method、Object [] args)スロー可能{return "live"; }}構成:
<bean id = "book3" p:name = "Bright Should Suns"> <交換method name = "getName"代替= "book4"/> </bean> <bean id = "book4"/>
テスト:
book book =(book)context.getbean( "book3"); assertequals( "living"、book.getname());
要約します
上記は、編集者によって導入されたスプリングフレームワークでの注入または交換方法の実装です。私はそれが誰にでも役立つことを願っています。ご不明な点がございましたら、メッセージを残してください。編集者は、すべての人に時間内に返信します!