Wiosna - dziedziczenie definicji fasoli
Definicja komponentu bean może zawierać wiele informacji o konfiguracji, w tym argumenty konstruktora, wartości właściwości i informacje specyficzne dla kontenera, takie jak metoda inicjalizacji, nazwa metody fabryki statycznej itd.
Definicja podrzędnego komponentu bean dziedziczy dane konfiguracyjne z definicji nadrzędnej. Definicja podrzędna może w razie potrzeby przesłonić niektóre wartości lub dodać inne.
Dziedziczenie definicji Spring Bean nie ma nic wspólnego z dziedziczeniem klas Java, ale koncepcja dziedziczenia jest taka sama. Definicję nadrzędnego komponentu bean można zdefiniować jako szablon, a inne podrzędne komponenty bean mogą dziedziczyć wymaganą konfigurację z nadrzędnego komponentu bean.
Korzystając z metadanych konfiguracji opartych na języku XML, należy wskazać definicję podrzędnego komponentu bean przy użyciu rozszerzenia parent atrybut, określając nadrzędny komponent bean jako wartość tego atrybutu.
Przykład
Przygotujmy działające środowisko Eclipse IDE i wykonaj następujące czynności, aby utworzyć aplikację Spring -
Kroki | Opis |
---|---|
1 | Utwórz projekt o nazwie SpringExample i utwórz pakiet com.tutorialspoint w obszarzesrc folder w utworzonym projekcie. |
2 | Dodaj wymagane biblioteki Spring za pomocą opcji Dodaj zewnętrzne pliki JAR , jak wyjaśniono w rozdziale Spring Hello World Example . |
3 | Utwórz klasy Java HelloWorld , HelloIndia i MainApp w pakiecie com.tutorialspoint . |
4 | Utwórz plik konfiguracyjny Beans Beans.xml w obszarzesrc teczka. |
5 | Ostatnim krokiem jest utworzenie zawartości wszystkich plików Java i pliku konfiguracyjnego Bean i uruchomienie aplikacji, jak wyjaśniono poniżej. |
Poniżej znajduje się plik konfiguracyjny Beans.xmlgdzie zdefiniowaliśmy bean „helloWorld”, który ma dwie właściwości message1 i message2 . Następna fasola „helloIndia” została zdefiniowana jako element potomny fasoli „helloWorld” przy użyciu metodyparentatrybut. Podrzędny komponent bean dziedziczy właściwość message2 bez zmian , przesłania właściwość message1 i wprowadza jeszcze jedną właściwość message3 .
<?xml version = "1.0" encoding = "UTF-8"?>
<beans xmlns = "http://www.springframework.org/schema/beans"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation = "http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<bean id = "helloWorld" class = "com.tutorialspoint.HelloWorld">
<property name = "message1" value = "Hello World!"/>
<property name = "message2" value = "Hello Second World!"/>
</bean>
<bean id ="helloIndia" class = "com.tutorialspoint.HelloIndia" parent = "helloWorld">
<property name = "message1" value = "Hello India!"/>
<property name = "message3" value = "Namaste India!"/>
</bean>
</beans>
Oto treść HelloWorld.java plik -
package com.tutorialspoint;
public class HelloWorld {
private String message1;
private String message2;
public void setMessage1(String message){
this.message1 = message;
}
public void setMessage2(String message){
this.message2 = message;
}
public void getMessage1(){
System.out.println("World Message1 : " + message1);
}
public void getMessage2(){
System.out.println("World Message2 : " + message2);
}
}
Oto treść HelloIndia.java plik -
package com.tutorialspoint;
public class HelloIndia {
private String message1;
private String message2;
private String message3;
public void setMessage1(String message){
this.message1 = message;
}
public void setMessage2(String message){
this.message2 = message;
}
public void setMessage3(String message){
this.message3 = message;
}
public void getMessage1(){
System.out.println("India Message1 : " + message1);
}
public void getMessage2(){
System.out.println("India Message2 : " + message2);
}
public void getMessage3(){
System.out.println("India Message3 : " + message3);
}
}
Poniżej znajduje się zawartość MainApp.java plik -
package com.tutorialspoint;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MainApp {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");
HelloWorld objA = (HelloWorld) context.getBean("helloWorld");
objA.getMessage1();
objA.getMessage2();
HelloIndia objB = (HelloIndia) context.getBean("helloIndia");
objB.getMessage1();
objB.getMessage2();
objB.getMessage3();
}
}
Po utworzeniu plików źródłowych i konfiguracyjnych komponentów bean uruchom aplikację. Jeśli wszystko jest w porządku z Twoją aplikacją, wydrukuje następujący komunikat -
World Message1 : Hello World!
World Message2 : Hello Second World!
India Message1 : Hello India!
India Message2 : Hello Second World!
India Message3 : Namaste India!
Jeśli zauważyłeś tutaj, nie przekazaliśmy wiadomości message2 podczas tworzenia komponentu bean „helloIndia”, ale została ona przekazana z powodu dziedziczenia definicji fasoli.
Szablon definicji fasoli
Możesz utworzyć szablon definicji Bean, który może być używany przez inne definicje podrzędnych bean bez większego wysiłku. Definiując szablon definicji fasoli, nie należy określać rozszerzeniaclass atrybut i powinien określać abstract atrybut i powinien określać atrybut abstrakcyjny o wartości true jak pokazano w poniższym fragmencie kodu -
<?xml version = "1.0" encoding = "UTF-8"?>
<beans xmlns = "http://www.springframework.org/schema/beans"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation = "http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<bean id = "beanTeamplate" abstract = "true">
<property name = "message1" value = "Hello World!"/>
<property name = "message2" value = "Hello Second World!"/>
<property name = "message3" value = "Namaste India!"/>
</bean>
<bean id = "helloIndia" class = "com.tutorialspoint.HelloIndia" parent = "beanTeamplate">
<property name = "message1" value = "Hello India!"/>
<property name = "message3" value = "Namaste India!"/>
</bean>
</beans>
Nie można samodzielnie utworzyć wystąpienia nadrzędnego komponentu bean, ponieważ jest niekompletny, a także jest wyraźnie oznaczony jako abstrakcyjny . Gdy definicja jest tak abstrakcyjna, można jej używać tylko jako czystej definicji komponentu bean szablonu, która służy jako definicja nadrzędna dla definicji podrzędnych.