1. Federkonfigurationsübersicht
1.1. Überblick
Spring Container liest Bean -Konfigurationsinformationen aus der XML -Konfiguration, der Java -Annotation und der Federannotation, um eine Bean -Definition -Registrierung zu bilden.
Definieren Sie das Register, um die Bohne gemäß der Bohne zu instanziieren;
Setzen Sie Bean -Instanzen in den Bohnen -Cache -Pool;
Die Anwendung verwendet Bohnen.
1.2. XML-basierte Konfiguration
(1) Übersicht über die XML -Datei
xmlns ------------------------------------------------------------------------------------------------------------------------------
XMLNS: XSI ------------ Standard-Namespace, verwendet, um die Schema-Datei des benutzerdefinierten Namespace anzugeben
xmlns: xxx = "aaaaa" ------------ benutzerdefinierte Namespace, xxx ist ein Alias und der folgende Wert AAAA ist der vollständige Name
XSI: Schemalokation -------- Geben Sie eine bestimmte Schema-Datei für jeden Namespace an, Format: Der Namespace Vollname-Dateiadresse. . . Mit Räumen getrennt
2. Grundlegende Bean -Konfiguration
2.1. Benennung von Bohnen
(1) Sowohl ID als auch Name können mehrere Namen angeben, und die Namen werden durch Kommas, Semikolons oder Räume getrennt.
<beanname = "#car, 123, $ car" class = "xxxxxxxxx">
Benutzer können GetBean ("#Car"), GetBean ("123"), GetBean ("$ car") zu GetBean verwenden.
(2) Wenn keine ID- und Namensattribute angegeben sind, verwendet die Spring automatisch den voll qualifizierten Namen der Klasse als Name der Bean
(3) Wenn mehrere anonyme Bohnen vorhanden sind, gibt es keine <Bean/> mit ID und Namen angegeben, vorausgesetzt, der voll qualifizierte Name der Klasse beträgt XXX.
Holen Sie sich dann die erste Bean mit GetBean ("xxx"), holen Sie sich die zweite Bean mit GetBean ("xxx#1") und holen Sie sich die dritte Bean mit GetBean ("xxx#2").
3. Abhängigkeitsinjektion
3.1. Attributinjektion
(1) Attributinjektion erfordert, dass die Bean einen Standardkonstruktor bereitstellt und eine Settermethode für die Attribute bereitstellt, die injiziert werden müssen. Spring ruft den Standardkonstruktor auf, um das Bean -Objekt zu instanziieren, und ruft dann die Setter -Methode auf, um den Eigenschaftswert durch Reflexion zu injizieren.
(2) Feder prüft nur, ob in der Bean eine entsprechende Settermethode vorhanden ist und es werden keine Anforderungen daran erfolgen, ob in der Bean eine entsprechende Attributvariable vorhanden ist.
(3) Spezielle Spezifikationen von Javabein für Attributbenennungen: Die ersten 2 Buchstaben einer Variablen sind entweder alle Großbuchstaben oder alle Kleinbuchstaben.
3.2. Konstruktorinjektion
(1) Die Konfigurationsreihenfolge der Konstruktorparameter wirkt sich nicht auf die Konfigurationsergebnisse aus. Die Konfigurationsdatei von Spring übernimmt eine Richtlinie, die nicht mit der Reihenfolge der Elementetiketten zusammenhängt. Diese Strategie kann die Sicherheit der Konfigurationsinformationen in gewissem Maße sicherstellen.
(2) Übereinstimmung Parameter mit dem Index
Wenn der Eintragsparameter -Typ des Konstruktors gleich ist, müssen Sie den sequentiellen Index der Parameter angeben, andernfalls kann die entsprechende Beziehung nicht bestimmt werden. wie:
<constructor-argindex = "0" value = "xxxxxx"> <constructor-argindex = "1" value = "xxxxxx">
Der Index beginnt bei 0.
(3) Problem mit kreisförmiger Abhängigkeit
Wenn die Konstruktorkonfiguration von 2 Bohnen von der anderen Partei abhängt, tritt ein Faden -Deadlock -Problem auf.
Die Lösung besteht darin, die Konstruktorinjektion auf die Attributinjektion zu ändern.
3.3. Fabrikmethode Injektion
(1) Nicht-statische Fabrikmethode
Da die Fabrikmethode nicht statisch ist, müssen Sie zunächst eine Instanzbohne der Fabrikklasse erstellen und die Fabrik-Bean nutzen, um sie zu verweisen
<beanid = "cirfactory" class = "factory class"/> <beanid = "car5" factory-bean = "carbactory" factory-methode = "createCar"/>
(2) Statische Fabrikmethode
<beanid = "car5" class = "factory class" factory-method = "createcar"/>
3.4. Detaillierte Erläuterung der Injektionsparameter
(1) 5 Sonderzeichen in XML
| Besondere Symbole | Fluchtsequenz | Besondere Symbole | Fluchtsequenz |
| < | < | "" " | |
| > | > | '' | '' |
| & | & |
(2) <! [CDATA []]>
Der Zweck von <! [CDATA []]> besteht darin, den XML -Parser die Zeichenfolge im Tag als normaler Text behandeln zu lassen.
(3) Nullwert mit dem <null/> Tag injizieren
(4) Caskading -Attribute
<beanid = "übergeordnet" class = "xxxxxxx"> <PropertyName = "child.xxx" value = "Eigenschaftswert des Abhängigkeitsobjekts"/> </bean>
Vor dem Spring3.0 muss das Abhängigkeitsobjektkind zuerst instanziiert werden, andernfalls wird eine Ausnahme ausgelöst. Nach Spring3.0 müssen keine Instanziierung angezeigt werden. Der Federcontainer instanziiert automatisch das Abhängigkeitsobjekt.
(5) Sammlung verschmelzen
<setMerge = "true"/>
Häufig in Unterklassen verwendet, um Sammelelemente der Elternklasse zu verschmelzen
(6) Konfigurieren Sie Bohnen vom Typ Sammlung über den Util -Namespace
Wenn Sie eine Sammlungstyp -Bean anstelle einer Sammlungstyp -Eigenschaft konfigurieren möchten, können Sie sie über den Util -Namespace konfigurieren.
3.5. Automatische Montage
(1) Das <Bohnen/> -Element liefert ein Attribut, das den Autowire -Typ angibt
3.6. Methodeninjektion
Wenn wir Prototyp-Bohnen in Singleton-Mode-Bohnen injizieren und hoffen, jedes Mal, wenn wir sie nennen, eine neue Bohne zurückzugeben, ist es nicht möglich, herkömmliche Injektionsmethoden anzuwenden, da die Wirkung von Singleton-Mode-Bohnen, die zugehörige Bohnen injizieren, nur einmal auftritt.
(1) Eine optionale Lösung besteht darin, der Host -Bean die Implementierung der BeanfactoryAware -Schnittstelle zu ermöglichen, damit die Hostbohne auf die Referenzen des Containers zugreifen kann, damit die GET -Methode geändert und der Container des Containers geändert werden kann
FACTORY.GETBEAN ("Abgeordnete Bean") Methode, Sie können jedes Mal die neueste Bean erhalten.
(2) Die obige Methode passt unseren Code und unseren Frühling, was der schlechteste Weg ist, und wir können durch Methodeninjektion entkoppeln.
Wir müssen nur eine Schnittstelle definieren und eine abstrakte Methode definieren, um abhängige Bohnen in der Schnittstelle zu erhalten. Die Federkonfiguration ist wie folgt:
<beanid = "car" class = "Abhängige Bean"/> <beanid = "host" class = "interface bean"> <Lookup-MethodeName = "getCar" Bean = "Car"/> </bean>
Das Lookup-Methoden-Element-Tag bietet eine dynamische Implementierung für GetCar () von Schnittstellenbohnen. Die Implementierung der Methodeninjektion beruht hauptsächlich auf der dynamischen Bytecode -Technologie des CGGLIB -Pakets.
3.7. Methodeersatz
Verwenden Sie Bean2, um die GetCar -Methode von Bean1 zu ersetzen, vorausgesetzt, Bean2 muss die MethodReplacer -Schnittstelle implementieren und die Konfiguration lautet wie folgt:
<beanid="bean1"class="aaaaaaaaa"><replaced-methodname="getCar"replacer="bean2"/></bean><beanid="bean2"class="bbbbbbbbbb"/>
4. Die Beziehung zwischen <Bean>
4.1. Nachlass
Die Konfiguration der übergeordneten Bean kann durch Unterklassen vererbt werden, um wiederholte Definitionen zu vermeiden. Die Konfiguration ist wie folgt:
<beanid = "Elternbean" class = "aaaaaa" contacct = "true"/> <beanid = "Child Bean" class = "bbbbbb">
Unterklassen können die Konfiguration der übergeordneten Klasse überschreiben. Wenn der Abstract = "True" der übergeordneten Klasse nicht angegeben ist, wird die übergeordnete Bean instanziiert.
4.2. Abhängigkeit
Einige Bohnen sind sofort von anderen Bohnen abhängig, und andere Bohnen müssen instanziiert werden, bevor sie die Wirtsbohne instanziieren können. Spring liefert das Abhängigkeitsattribut und gibt an, dass die Abhängigkeitsbohne zuerst instanziiert wird, wie z. B.:
<beanid="host"class="aaaaaa"depends-on="b1"/><beanid="b1"class="bbbbbbbb"/>
Wenn es mehrere Vorabhängigkeitsbohnen gibt, können Sie den Namen der Bohne nach Kommas, Räumen oder Semikolonen erstellen.
4.3. Bohnenbereich
(1) Der Federbehälter instanziiert alle Bohnen, wenn er begonnen wird. Wenn Sie nicht im Voraus instanziieren möchten, kann die Eigenschaft von Lazy-init = "True" von <bean/> die verzögerte Instanziierung steuern. Wenn jedoch die Bean von anderen Bohnen verwiesen wird, auf die im Voraus instanziiert werden muss, ignoriert der Frühling auch die verzögerte Instanziierungseinstellung.
(2) Anwendungsumfang im Zusammenhang mit Webanwendungen
Wenn der Benutzer Anforderungs-, Sitzungs- und GlobalSession -Umfang verwendet, muss die zusätzliche Konfiguration zuerst im Web -Container erfolgen:
In niedrigeren Versionen von Webcontainern (vor Servlet 2.3) können Sie die HTTP -Anforderungsfilterkonfiguration verwenden:
<filter> <filter-name>requestContextFilter</filter-name> <filter-class>org.springframework.web.filter.RequestContextFilter</filter-class> </filter> <filter-mapping> <filter-name>requestContextFilter</filter-name> <url-pattern>/*</url-pattern> </filtermapping>
In höheren Versionen von Webcontainern können Sie den HTTP -Anforderungshörer zum Konfigurieren verwenden:
<Hörer> <Hörer-Klasse> org.springframework.web.context.request.requestContextListener </Listener-Klasse> </Listener>
(3) Problem mit Abhängigkeit von Umfang
Verwenden Sie beispielsweise AOP, wenn Sie Web-Scoped-Bohnen in Singleton- oder Prototyp-Bohnen injizieren:
<bean id = "web1" Scope = "Request"> <AOP: Scoped-Proxy/> </bean> <bean id = "Singleton1"> <Eigenschaft name = "z1" ref = "web1"/> </bean>
4.4. Fabrikbean
Im Allgemeinen verwendet Spring das Klassenattribut von <bean/>, um die Implementierungsklasse -Instanziierungsbohne durch den Reflexionsmechanismus anzugeben. In einigen Fällen ist der Prozess der Instanziierung einer Bohne jedoch komplizierter. In der traditionellen Weise ist eine große Menge an Konfigurationsinformationen in der <Bohnen> erforderlich. Die Flexibilität der Konfigurationsmethode ist begrenzt und eine einfache Lösung kann durch Verwendung von Codierungsmethoden erhalten werden.
Spring bietet dafür eine org.springframework.bean.factory.FactoryBean Factory Class -Schnittstelle, und Benutzer können die Logik der Instanziierung von Bohnen durch die Implementierung dieser Schnittstelle anpassen.
Wenn die Implementierungsklasse, die durch das Klassenattribut von <Bean/> konfiguriert ist, FactoryBean und seine Unterklasse ist, gibt die Rückgabe der FactoryBean () -Methode die FactoryBean und ihre Unterklasse selbst nicht zurück, sondern das von der FactoryBean getObject () -Methode zurückgegebene Objekt.
Wenn Sie das Objekt der FactoryBean und seiner Unterklasse selbst erhalten möchten, präfixen Sie den Beanname explizit mit einem "&" -Präfix wie GetBean ("& car5"), wenn die GetBean (Beanname) -Methode.
5. Annotationsbasierte Konfiguration
5.1. Annotationstyp
@Component ----- native Annotation
Ableitungsanmerkungen:
@Repository: Annotate DAO
@Service: Etikettendienst
@Controller: Annotation Controller
5.2. Verwenden Sie Annotationskonfigurationsinformationen, um den Federcontainer zu starten
(1) Nach dem Frühjahr 2.5 wurde der Kontext -Namespace eingeführt, der die Anwendung von Anmerkungen zum Definieren von Bohnen durch Scannen des Klassenpakets bietet:
<Context: component-scan base-package = "xxxxxxxxxx" ressourcenpattern = "xxxx/*. Klasse">
Das Ressourcenmusterattribut wird verwendet, um Klassen unter bestimmten Paketen anzugeben, die im Basispaket gescannt werden müssen
(2) Es gibt leistungsstärkere Filter-Unterkleider
<context:component-scan base-package="xxxxxxxxxx" > <context:include-filter type="xxxx" expression="xxxxxxxxxxxxxxxx"/> <context:exclude-filter type="xxxx" expression="xxxxxxxxxxxxxxx"/></context:component-scan>
Von allen Typen ist die Filterfähigkeit von Aspektj die mächtigste.
5.3. Automatische Montage von Bohnen
(1) @autowired
@Autowired Matches für Typ standardmäßig. Wenn der Container keine passende Bohne gibt, wird eine Ausnahme ausgelöst, wenn der Federbehälter startet. Sie können @autowired (erforderlich = falsch) zur Annotation verwenden, und es wird keine Ausnahme ausgelöst.
Verwenden Sie @Autowired, um die Methodenparameter direkt zu kommentieren. Wenn eine Methode standardmäßig mehrere Parameter enthält, wählt Feder automatisch Beans aus, die dem Parametertyp für die Injektion entsprechen.
Mit @autowired Annotation von Sammlungsvariablen können Sie alle Bohnen injizieren, die dem Elementtyp der Sammlung entsprechen, der sehr leistungsfähig ist.
Mit @Autowired Assembler -Eigenschaft kann es keine Setter -Methode geben.
(2) @Qualifiler
Wenn sich im Container mehr als eine passende Bohne befindet, kann der Name der Bohne durch die @Qualifiler -Annotation qualifiziert werden.
(3) Unterstützung für Markierung und Annotation
Spring unterstützt auch @Resource, definiert von JSR-250 und @Inject Annotations, definiert von JSR-330
@Resource verlangt, dass die Namensattributbean einer Bean angegeben ist. Wenn das Attribut leer ist, wird der variable Name oder der Methodenname automatisch als Name der Bean verwendet.
(4) Schlüsselpunkte:
Wenn Sie nur @AutowRed verwenden, müssen wir den <Bohnenknoten im XML immer noch explizit definieren. Der Federbehälter deaktiviert die Annotationsbaugruppe standardmäßig. Die Möglichkeit, es zu aktivieren, besteht darin, den <context: Annotation-Config/> Element im XML zu konfigurieren.
Der Frühling bietet aber auch einen weiteren Trick. Mit dem Element <Kontext: Komponenten-scan/> erkennt der Federcontainer die Bean automatisch, ohne den <Bohnen/> Knoten explizit zu definieren.
Spring kommentiert die Annotationsklasse über @Component, @Repository, @Service und @Controller, damit <Kontext: Komponenten-scan/> weiß, welche Klassen als Springbean registriert werden müssen.
Wenn Sie ein JAR-Paket von Drittanbietern verwenden und automatisch Klassen in das JAR-Paket von Drittanbietern injizieren möchten, auch wenn das JAR-Paket von Drittanbietern sie nicht mit Annotationen annotiert, kann das Filterelement <Kontext <Kontext: Include-filter> Include-Filter> die Annotationsbasis-Scan-Richtlinien ersetzen, die die Ausdrucksausdrücke mit der Annotations-Scan-Ausdrücke entsprechen.
5.4. Bean der Handlungs- und Lebensprozessmethode
(1) @Scope ("xxxx")
Der Standardbereich der durch Annotation konfigurierten Bohnen ist Singleton.
Frühling bietet @Scope Annotation. Wenn es um die Klasse geht, entsprechen die Annotationsparameter dem Wert des Umfangsattributs in XML.
(2) Vergleich von Lebensprozessmethoden
| <Bean> | Anmerkung |
| Init-Method | @Postconstruct |
| Destory-Method | @Predestroy |
Differenz: Anmerkungen können mehrere Methoden in einer Klasse definieren, und die Methoden werden in der Reihenfolge ausgeführt
6. Java-basierte Konfiguration
6.1. Verwenden Sie Java -Kurse, um Bean -Definitionsinformationen bereitzustellen
(1) Gewöhnliches Pojo kann Bean -Definitionsinformationen für Frühlingscontainer bereitstellen, solange die @Configuration -Annotation markiert ist. Jede mit @Bean gekennzeichnete Methode entspricht der Bereitstellung von Bean -Definitionsinformationen.
(2) @Bean
Die Art einer Bean wird durch den Rückgabewerttyp der von @Bean kommunischen Methode bestimmt
Der Standardname der Bean entspricht dem Methodennamen und kann auch explizit von @Bean (name = "xxx") angegeben werden.
Sie können @Scope bei @Bean verwenden, um den Umfang der Verwendung der Bohne anzugeben
(3) @Configuration
Da die Annotationsklasse @Configuration selbst mit @Component Annotation markiert wurde, kann jede Klasse mit @Configurtion automatisch mit @autowired in andere Klassen zusammengestellt werden.
6.2. Starten Sie den Federcontainer mithilfe von Konfigurationsinformationen basierend auf der Java -Klasse
(1) Frühling bietet eine AnnotationConfigapplicationContekt -Klasse, mit der der Federbehälter über die annotierte @Configuration -Annotation direkt starten kann.
(2) Wenn mehrere Konfigurationsklassen vorhanden sind
Sie können sich nacheinander über die Registermethode der AnnotationConfigApplicationContect registrieren und dann die Aktualisierungsmethode aufrufen, um den Container zu aktualisieren, um diese registrierten Konfigurationsklassen anzuwenden.
Sie können auch @import (xxx.class) Annotation verwenden, um alle anderen Konfigurationsklassen in eine Konfigurationsklasse einzuführen, damit Sie nur eine Konfigurationsklasse registrieren müssen.
(3) Siehe Konfiguration von @Configuration über die XML -Konfigurationsklasse
<Kontext: Komponent-scanbase-package = "..." Ressourcenpuster = "Konfigurationsklassenname">
(4) Referenz -XML -Konfigurationsinformationen in der Konfigurationsklasse
Verwenden Sie @Importresource ("ClassPath: ............") unter @Configuration, um die XML -Konfigurationsdatei zu importieren
6.3. Vergleich von 3 Konfigurationsmethoden
| Xml | Anmerkung | Java -Klasse |
| Die Implementierungsklasse von Bean ist die aktuelle Projektentwicklung | Steuern |
Zusammenfassen
Das obige ist alle detaillierten Erklärungen der Feder zusammengebenden Bohnen in IOC -Behältern. Ich hoffe, es wird für alle hilfreich sein. Interessierte Freunde können weiterhin auf diese Seite verweisen:
Eine detaillierte Erklärung der drei Bean -Konfigurationsmethoden in Spring 3.x
Eine kurze Diskussion über den Unterschied zwischen Spring Singleton Bean und Singleton Muster
Detaillierte Erläuterung des Lebenszyklus der Frühlingskonfigurationsverwendung
Wenn es Mängel gibt, hinterlassen Sie bitte eine Nachricht, um darauf hinzuweisen. Vielen Dank an Freunde für Ihre Unterstützung für diese Seite!