Der Umfang einer staatenlosen Bohne ist eine Singleton -Instanz. Wenn wir Bohnen B des Prototyps in Bohnen A von Singleton injizieren und hoffen, dass eine neue Bean B jedes Mal zurückgegeben werden kann, wenn der GetBeanB () von Bean A aufgerufen wird, kann diese Anforderung nicht mit herkömmlichen Injektionsmethoden erreicht werden. Da die Wirkung von Singletons Bohneninjektion von zugehörigen Bohnen nur einmal auftritt, obwohl der Bereich von Bohnen B Prototyptyp ist, ist das Objekt, das durch getBeanb () zurückgegeben wurde, immer noch die Bean B, die zu Beginn injiziert wurde.
Wenn Sie also jedes Mal, wenn Sie Beanas GetBeanB () anrufen, eine neue BeanB zurückgeben möchten, besteht eine optionale Lösung darin, Beana die Schnittstelle beanfactoryAware implementieren zu lassen, damit Sie auf den Container zugreifen und sie dann auf die folgende Weise implementieren können.
Konfigurieren Sie zuerst XML:
<bean id = "Autor" scope = "prototyp"/> <bean id = "book" p: name = "veil"> </bean>
Der Bereich des Bean -Autors ist auf Prototyp eingestellt.
Die Buchklasse implementiert die BeanfactoryAware -Schnittstelle:
Public Class Book implementiert beanfactoryAware {...@oversidepublic void setBeArfactory (beanfactory beanfactory) löst beansexception {this.factory = beanfactory;} öffentlicher Autor getPrototypeAthor () {return (Autor) Factory.getBean ("Autor"); }}Unit -Tests:
ApplicationContext context; @BeFOREMethodpublic void setup () löst Ausnahme aus {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.getPrototypeAthor (). HashCode ()); System.out.println (book.getPrototypeAthor (). HashCode ());Testergebnisse
Aus den Ergebnissen können wir feststellen, dass nur die von den Beanfactory erhaltenen Autorinstanzen unterschiedlich sind.
Diese Implementierung bindet die Anwendung mit dem Spring Framework. Gibt es eine bessere Lösung? Ja, es ist die Injektionsmethode.
1 Injektionsmethode
Springbehälter sind auf CGGLIB -Bibliotheken angewiesen, sodass die Bytecode der Klasse während der Laufzeit dynamisch betrieben werden kann, z. B. dynamische Erstellung von Unterklassen oder Implementierungsklassen von Bohnen.
BookInterface -Schnittstelle:
public interface bookInterface {Autor getAuthor ();}XML -Konfiguration:
<!-Methodinjektion-> <bean id = "Autor" Scope = "Prototyp" p: name = "maugham"/> <bean id = "book2"> <Lookup-Method name = "getAthor" bean = "Autor"/> </bean>
Unit -Tests:
BookInterface book = (bookInterface) context.getBean ("book2"); assert.assertequals ("maugham", book.getAuthor (). GetName ());Durch diese Konfigurationsmethode kann die dynamische Implementierung für die Schnittstelle bereitgestellt werden, und die auf diese Weise zurückgegebenen Beer sind alle neuen Instanzen.
Wenn Sie also eine Prototyp -Bean in einer Singleton -Bohne erhalten möchten, können Sie die Suche nach der Injektionsmethode verwenden.
2 Ersatzmethode
Im Frühjahr können Sie eine Methode einer bestimmten Bohne verwenden, um eine andere Methode einer Bohne zu ersetzen.
Angenommen, es gibt eine GetName () -Methode im Buch, um den Titel zu erhalten:
/*** Buchtitel*/privater Zeichenfolge Name; public String getName () {return name;}Wir erstellen jetzt eine neue Bean, die die MethodeReplacer -Schnittstelle implementiert, um die Methode von GetName () im Buch zu ersetzen:
public class book4 implementiert methodReplacer {@Override public Object REimplement (Object OBJ, Methode Methode, Object [] args) löst Throwable {return "Alive" aus; }}Konfiguration:
<bean id = "book3" p: name = "leuchtendausend Suns"> <ersetzt-method name = "getName" Ersatz = "book4"/> </bean> <bean id = "book4"/>
prüfen:
Book book = (book) context.getbean ("book3"); assertequals ("living", book.getName ()); Zusammenfassen
Die oben genannte Implementierung der Injektions- oder Ersatzmethode im vom Editor eingeführten Spring -Framework. Ich hoffe, es wird für alle hilfreich sein. Wenn Sie Fragen haben, hinterlassen Sie mir bitte eine Nachricht. Der Herausgeber wird alle rechtzeitig antworten!