Definitives Ziel
Lassen Sie mich kurz das Problem beschreiben, das dieser Artikel lösen möchte: So verwenden Sie Spring nicht mehr, um Bean -Instanzen im Frühjahr zu erstellen, sondern übertragen Sie den Bean -Erstellungsprozess an die Entwickler.
Klares Denken
So erstellen Sie eine Bean -Instanz:
1) durch den Konstruktor (mit oder ohne Parameter)
Methode: <bean id=""/>
2) durch die statische Fabrikmethode
Methode: <bean id="" factory-method="静态工厂方法"/>
Hinweis: Die Factory -Klasse -Instanz wird nicht erstellt
3) über die Instanzfabrikmethode (nicht statische Methode)
Weg:
<bean id="factory"/>
<bean id="" factory-bean="factory" factory-method="实例工厂方法"/>
Hinweis: Die Factory -Klasse -Instanz wird erstellt
Praktische Methode
Beispiel 1 :
brauchen:
1 Ich möchte die Bean nicht instanziieren, wenn bean.xml geladen ist, aber ich möchte die geladene Bean.xml vom sofortigen Objekt trennen.
2 Singleton Bean implementieren
In den oben genannten Situationen können Bohnen über die Fabrikmethode erzeugt werden.
Auf diese Weise wird die Bean nicht direkt instanziiert, wenn Bean.xml geladen wird, wird jedoch nur wirklich instanziiert, wenn die Methode, auf die die Fabrik-Methode genannt wird, aufgerufen wird.
Implementierung: Erstellen Sie eine Singleton-Bohne durch Spring Factory-Methode
Erstellen Sie zuerst ein Singleton -Objekt durch eine statische innere Klasse
Paket com.spring.test.factoryMethod; öffentliche Klasse Stufe {public void Perform () {System.out.println ("show start ..."); } private Stage () {} private statische KlassenstagessingLetonholder {statische Stage Instance = new Stage (); } public static Stage getInstance () {return stagesingletonholder.instance; }}Geben Sie die Lademethode in der Federkonfigurationsdatei GETInstance an
<? XSI: Schemalocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-Beans-3.0.xsd"
Erhalten Sie Instanz, indem Sie Bohnen im Anwendungskontext anrufen
Paket com.spring.test.factoryMethod; import org.springframework.context.ApplicationContext; import org.springframework.context.support.classpathxmlApplicationContext; public class test {public static void Main (String [] args) {{{applicationcontext ctx ClassPathXmlApplicationContext ("bean.xml"); Stage Stufe = ((Stufe) ctx.getbean ("thestage")); //. GetInstance (); Stage.Perform (); }}Ausführungsergebnisse
24. Januar 2015 18:38:18 Uhr org.springframework.context.Support.AbstractApplicationContext PrepareResh Informationen: Aktualisieren orgs Wurzel des Kontext hierarchyjan 24, 2015 18:38:19 PM org.springframework.bean.factory.xml.xmlbeandefinitionReader Loadbeandefinitionsinformationen: Laden XML Bean Definitionen aus der Klassenpfad -Ressource [Bean.xml] 24. Januar, 2015, 2015 6:38:19 pm PM PM PMPR org.springframework.beans.factory.support.DefaultListableBeanFactory PreinstantiateSingletons Informationen: Voranbau Singletons in org.springFramework.beans.factory.support.DefaultListableBeanFactory@2d1879ea: Definition Beans [Duke, Sonnet29, poet1879ea: Definition BEANNEN, [DUKEL, SONNET29, THOTH1879EA: Wurzel der Fabrik Die Hierarchieleistung beginnt ...
Einführung in die Fabrikmethodeerstellung Bean
1. Erstellen Sie eine Bohne mit einer statischen Fabrikmethode
Beim Erstellen einer Bean -Instanz unter Verwendung der statischen Fabrikmethode muss auch das Klassenattribut angegeben werden, aber zu diesem Zeitpunkt ist das Klassenattribut nicht die Implementierungsklasse, die die Bean -Instanz, sondern die statische Fabrikklasse angibt. Weil der Frühling wissen muss, mit welcher Fabrik die Bean -Instanz erstellt werden soll. Darüber hinaus müssen Sie die Werksmethoden verwenden, um den Namen der statischen Fabrikmethode anzugeben. Die Spring nennt die statische Fabrikmethode (kann eine Reihe von Parametern enthalten), um eine Bean -Instanz zurückzugeben. Sobald die angegebene Bean -Instanz erhalten wurde, sind die Verarbeitungsschritte nach der Feder genau mit der Erstellung der Bean -Instanz mit normalen Methoden überein. Es ist zu beachten, dass diese Fabrik-Methode bei der Verwendung statischer Fabrikmethoden zur Erstellung von Bohnen statisch sein muss. Diese Passage klingt ein wenig schwindelig, ohne viel zu sagen, fügen Sie bitte den Code hinzu:
Definieren Sie zuerst eine Schnittstelle, und die statische Methode erzeugt eine Instanz der Schnittstelle:
public interface Animal {public void Sayshello ();}Hier sind zwei Implementierungsklassen der Schnittstelle:
öffentliche Klasse Cat implementiert Animal {private String msg; // Die Setzermethode, die während der Abhängigkeitsinjektion erforderlich ist, öffentliche void setMSG (String msg) {this.msg = msg; } @Override public void SayShello () {System.out.println (msg + ", meow ~ meow ~"); }} public class Dog implementiert Animal {private String msg; // Die Setzermethode, die während der Abhängigkeitsinjektion erforderlich ist, öffentliche void setMSG (String msg) {this.msg = msg; } @Override public void SayShello () {System.out.println (msg + ", strong ~ strong ~"); }}Die folgende Animalfactory Factory enthält eine statische Methode von GetAnimal, die feststellt, welches Objekt basierend auf den übergaber Parametern erstellt werden soll. Dies ist ein typisches statisches Fabrikdesignmuster.
public clas AnimalFactory {public static Animal GetAnimal (String -Typ) {if ("cat" .EqualSignoreCase (Typ)) {return New Cat (); } else {return New Dog (); }}}Wenn Sie angeben müssen, dass Spring AnimalFactory verwendet, um Tierobjekte zu generieren, können Sie Folgendes in der Federkonfigurationsdatei konfigurieren:
<!-Konfigurieren Sie die GetAnimal-Methode des GetAnimalFactory, um CAT zu generieren-> <bean id = "cat" factory-method = "getArimal"> <!-Konfigurieren Sie die Parameter der statischen Werksfabrikmethode, die GetAnimal-Methode erzeugt Cat-type-Objekte-> <Constructor-Arg-Value = "Cat" /> <! value = "cat" /> < /bean> <!-Konfigurieren Sie die GetAnimal-Methode des GetArimalfactory, um Hund zu erzeugen-> <bean id = "hunde" fabrikmantethod = "getArimal"> <!-Konfigurieren Sie die Parameter der Static Factory-Methode, die GetAnimal-Methode, die Hundeart-Type-Objekte in den DogyPe-Objekten erzeugt-> <constructor-<constructor-<constructor-<constructor-<constructor-<constructor-<constructor-<constructor-<constructor-<constructor-<constructor-a.-struktur-~ <-> < Setter-> <Eigenschaft name = "msg" value = "hunde" /> < /bean>
Aus der obigen Konfiguration können wir feststellen, dass die Klasse und die Fabrik-Methode der beiden Beans-Konfigurationen von Katze und Hund genau gleich sind, da beide Instanzen unter Verwendung derselben statischen Fabrikklasse und derselben statischen Fabrikmethode erzeugt werden. Es ist nur so, dass die für diese statischen Fabrikmethode angegebenen Parameter unterschiedlich sind. Verwenden Sie das Element <Constructor-Arg />, um Parameter für die statische Fabrikmethode anzugeben.
Die Methode des Hauptprogramms, um zwei Bohneninstanzen zu erhalten, bleibt Katze und Hund unverändert. Sie müssen nur GetBean () des Frühlingsbehälters anrufen:
public class test {public static void main (String args []) {applicationContext context = new classMlMlmlApplicationContext ("applicationContext.xml"); Animal a1 = context.getBean ("Cat", Animal.class); a1.sayhello (); Animal A2 = context.getbean ("Hund", Animal.Class); a2.sayhello (); }}Ausgangsergebnis:
<Code> Katze, miau ~ meow ~ hund, stark ~ stark ~ </code>
Beim Erstellen einer Instanz mit einer statischen Fabrikmethode müssen Sie die Fabrikklasse und die statische Fabrikmethode bereitstellen, die die Instanz generiert. Beim Erstellen einer Instanz über eine statische Fabrikmethode müssen Sie die folgenden Änderungen an der Federkonfigurationsdatei vornehmen.
Das Klassenattribut ist nicht die Implementierungsklasse der Bean -Instanz, sondern die statische Fabrikklasse, die die Bean -Instanz generiert
Verwenden Sie Fabrik-Methoden, um eine statische Fabrikmethode für die Erzeugung einer Bean-Instanz anzugeben
Wenn die statische Fabrikmethode Parameter erfordert, verwenden Sie das Element <Constructor-Arg />, um es zu konfigurieren
Wenn wir angeben, dass Spring eine statische Fabrikmethode verwendet, um eine Bean -Instanz zu erstellen, analysiert Spring zunächst die Konfigurationsdatei und ruft die statische Fabrikmethode der statischen Fabrikklasse durch Reflexion basierend auf den von der Konfigurationsdatei angegebenen Informationen auf und verwenden den Rückgabewert der statischen Fabrikmethode als Bean -Instanz. In diesem Prozess ist der Frühling nicht mehr für die Erstellung einer Bean -Instanz verantwortlich, und die Bean -Instanz wird durch die vom Benutzer bereitgestellte statische Fabrikmethode bereitgestellt.
2. Erstellen Sie eine Bohne mit der Instanzfabrikmethode
Die Instanzfabrikmethode unterscheidet sich nur ein wenig von der statischen Fabrikmethode: Wenn Sie die statische Fabrikmethode aufrufen, muss nur die Fabrikklasse verwendet werden und die Instanzfabrikmethode aufzurufen, muss die Fabrikinstanz verwenden. Daher gibt es nur einen Unterschied in der Federkonfiguration: Konfigurieren Sie die statische Fabrikmethode, um die statische Fabrikklasse anzugeben, und konfigurieren Sie die Instanzfabrikmethode, um die Fabrikinstanz anzugeben. Das gleiche Beispiel oben ändert Tierfaktorik in:
public clas AnimalFactory {public Animal GetAnimal (String -Typ) {// Hier wird das statische Schlüsselwort nur dann entfernt, wenn ("cat" .EqualSignoreCase (Typ)) {return New Cat (); } else {return New Dog (); }}}Die Federdatei wird geändert an:
<!-Konfigurieren Sie zuerst die Fabrikklasse-> <bean id = "AnimalFactory" /> <!-Hier verwenden wir Fabrikbean, um das Objekt der Instanzfabrikklasse anzugeben. name = "msg" value = "cat" /> < /bean> <bean id = "hunde" factory-bean = "AnimalFactory" factory-methode = "getArimal"> <constructor-arg value = "hunde" /> <Eigenschaft name = "msg" value = "hunde" /> < /> < /bean>
Die Testklasse muss nicht geändert werden, die Ausgangsergebnisse sind die gleichen wie oben.
In vielen Fällen wird <bean id = "bean1" class = "..." /> verwendet, um eine Bohne zu definieren. Auf diese Weise ruft Spring den Standard -Parameter -Konstruktor auf, um eine Bean -Instanz zu erstellen. Darüber hinaus können Sie Fabrik verwenden, um Bean -Instanzen zu erstellen, um die Schöpfung und Verwendung von Bohnen zu trennen und die Bohnenerstellung der Fabrik zu übergeben, um sie zu vervollständigen.
Es gibt drei Möglichkeiten, Fabrikbohnen zu konfigurieren.
Zusammenfassung Schnittstelle:
public interface imusicbox {public void Play (); } 1. Holen Sie sich Bohnenbeispiele für die statische Fabrikmethode
Fabrikkategorie:
public class musicboxFactory {public static imusicbox CreateMusicBox () {neu imusicbox () {public void Play () {System.out.println ("Piano spielen ..."); }}; }}Konfigurationsdatei:
<bean id = "musicbox" factory-methode = "createmusicbox" />
Testklasse:
public static void main (string [] args) {applicationContext ctx = new classPathXmlApplicationContext ("Bean-config.xml"); Imusicbox musicbox = (Imusicbox) ctx.getbean ("MusicBox"); Musicbox.play (); }2. Die Methode der Fabrikinstanz erhält eine Bean -Instanz
Fabrikkategorie:
public class musicboxFactory {public imusicbox CreateMusicBox () {// Keine statische Änderung zurücksende neue Imusicbox () {public void Play () {System.out.println ("Piano ..."); }}; }}Konfigurationsdatei:
<bean id = "factoryBean" /> <bean id = "musicbox" factory-bean = "factoryBean" factory-methode = "createmusicbox" />
Das Attribut "Factory-Bean" gibt die Werksbean an, und das Attribut "Factory-Method" gibt die Fabrikmethode an, um die Bean-Instanz zu erhalten.
Testklasse:
public static void main (string [] args) {applicationContext ctx = new classPathXmlApplicationContext ("Bean-config.xml"); Imusicbox musicbox = (Imusicbox) ctx.getbean ("MusicBox"); Musicbox.play (); } 3. Fabrikklasse implementiert org.springframework.bean.factory.facotrybean -Schnittstelle
Fabrikkategorie:
import org.springframework.beans.factory.factoryBean; public class musicboxFactory2 implementiert factoryBean {public Object getObject () löst Ausnahme aus {return New Imusicbox () {public void Play () {System.out.println ("Piano ..."); }}; } public class getObjecttype () {return iMusicbox.class; } public boolean issingleton () {return false; }}Konfigurationsdatei:
<bean id = "musicBox"/>
Testklasse:
public static void main (string [] args) {applicationContext ctx = new classPathXmlApplicationContext ("Bean-config.xml"); // Nicht hinzugefügt und gibt das "Produkt" des Werks imusicbox musicbox = (IMusicBox) ctx.getbean ("MusicBox"); Musicbox.play (); // Hinzufügen und Rückgabe des Factory Class Instance -Objekts obj = ctx.getbean ("& musicBox"); System.out.println (obj.getClass (). GetName ()); }Klassen, die die FactoryBean -Schnittstelle implementieren, werden nicht als gewöhnliche Bohnen angesehen. Spring erfasst sie automatisch und ruft die GetObject -Methode auf, um die Bean -Instanz zu erhalten.
Zusammenfassen
Dies ist das Ende der Einführung in die Instanziierung von Bohneninstanzen in den Federfabrikmethoden. Wenn Sie Mängel haben, können Sie auf eine Nachricht hinweisen. Vielen Dank an Freunde für Ihre Unterstützung für diese Seite!