Der Spring IoC Container ist das Herzstück des Spring Frameworks. Der Container erstellt die Objekte, verdrahtet sie miteinander, konfiguriert sie und verwaltet ihren kompletten Lebenszyklus von der Erstellung bis zur Zerstörung. Der Spring-Container verwendet Dependency Injection (DI), um die Komponenten zu verwalten, aus denen eine Anwendung besteht.
Spring bietet die folgenden zwei Arten von Containern.
- BeanFactory-Container
- ApplicationContext-Container
Weiterlesen: Inversion of Control und Dependency Injection
BeanFactory
Eine BeanFactory ist im Grunde nichts anderes als die Schnittstelle für eine fortgeschrittene Fabrik, die in der Lage ist, ein Verzeichnis verschiedener Beans und ihrer Abhängigkeiten zu verwalten.
Das BeanFactory
ermöglicht es uns, Bean-Definitionen zu lesen und über die BeanFactory darauf zuzugreifen.
1.1. Wie man eine BeanFactory erstellt
Wenn wir nur die BeanFactory
verwenden, können wir eine erstellen und einige Bean-Definitionen im XML-Format wie folgt einlesen:
Andere Möglichkeiten, eine Bean-Factory zu erstellen, sind wie folgt:
Im Grunde ist das alles, was es gibt. Mit getBean(String)
können Sie Instanzen Ihrer Beans abrufen; die clientseitige Ansicht der BeanFactory
ist überraschend einfach.
1.2. BeanFactory-Methoden
Die BeanFactory
-Schnittstelle hat nur sechs Methoden, die der Client-Code aufrufen kann:
-
boolean containsBean(String)
: gibt true zurück, wenn dieBeanFactory
eine Bean-Definition oder Bean-Instanz enthält, die mit dem angegebenen Namen übereinstimmt -
Object getBean(String)
: gibt eine Instanz der unter dem angegebenen Namen registrierten Bean zurück. Je nachdem, wie die Bean durch dieBeanFactory
-Konfiguration konfiguriert wurde, wird entweder eine singleton und damit gemeinsam genutzte Instanz oder eine neu erstellte Bean zurückgegeben. EinBeansException
wird geworfen, wenn entweder die Bean nicht gefunden werden konnte (in diesem Fall ist es einNoSuchBeanDefinitionException
), oder eine Ausnahme während der Instanzierung und Vorbereitung der Bean aufgetreten ist -
Object getBean(String, Class)
: gibt eine Bean zurück, die unter dem angegebenen Namen registriert ist. Die zurückgegebene Bean wird in die angegebene Klasse gecastet. Wenn die Bean nicht gecastet werden konnte, werden entsprechende Ausnahmen geworfen (BeanNotOfRequiredTypeException
). Außerdem gelten alle Regeln der MethodegetBean(String)
(siehe oben) -
Class getType(String name)
: gibt dieClass
der Bean mit dem angegebenen Namen zurück. Wenn keine Bean mit dem angegebenen Namen gefunden werden konnte, wird einNoSuchBeanDefinitionException
ausgelöst -
boolean isSingleton(String)
: ermittelt, ob die unter dem angegebenen Namen registrierte Bean-Definition oder Bean-Instanz ein Singleton ist oder nicht. Wenn keine Bean, die dem angegebenen Namen entspricht, gefunden werden konnte, wird einNoSuchBeanDefinitionException
ausgelöst -
String getAliases(String)
: Gibt die Aliase für den gegebenen Bean-Namen zurück, falls welche in der Bean-Definition definiert wurden
ApplicationContext
Der ApplicationContext-Container fügt weitere unternehmensspezifische Funktionen hinzu, wie z.B. die Fähigkeit, Textnachrichten aus einer Properties-Datei aufzulösen und die Fähigkeit, Anwendungsereignisse an interessierte Event-Listener zu veröffentlichen. Dieser Container wird durch das org.springframework.context.ApplicationContext-Interface definiert.
Der ApplicationContext-Container enthält alle Funktionen des BeanFactory-Containers, so dass er im Allgemeinen gegenüber der BeanFactory empfohlen wird. BeanFactory
Der ApplicationContext-Container kann dennoch für leichtgewichtige Anwendungen wie mobile Geräte oder Applet-basierte Anwendungen verwendet werden, bei denen Datenvolumen und Geschwindigkeit von Bedeutung sind.
2.1. Typen von ApplicationContext
Die am häufigsten verwendeten ApplicationContext
Implementierungen sind:
- FileSystemXmlApplicationContext – Dieser Container lädt die Definitionen der Beans aus einer XML-Datei. Hier müssen Sie den vollständigen Pfad der XML-Bean-Konfigurationsdatei an den Konstruktor übergeben.
- ClassPathXmlApplicationContext – Dieser Container lädt die Definitionen der Beans aus einer XML-Datei. Hier müssen Sie nicht den vollständigen Pfad der XML-Datei angeben, aber Sie müssen CLASSPATH richtig einstellen, da dieser Container die XML-Konfigurationsdatei der Beans im CLASSPATH suchen wird.
- WebXmlApplicationContext – Dieser Container lädt die XML-Datei mit den Definitionen aller Beans aus einer Webanwendung.
2.2. Wie wird ein ApplicationContext erstellt
Ein Beispielcode für die Instanziierung eines Application Contexts sieht wie folgt aus.