Kontener Spring IoC jest rdzeniem Spring Framework. Kontener tworzy obiekty, łączy je ze sobą, konfiguruje i zarządza ich pełnym cyklem życia od utworzenia do zniszczenia. Kontener Spring wykorzystuje wstrzykiwanie zależności (DI) do zarządzania komponentami, które tworzą aplikację.
Spring dostarcza następujące dwa typy kontenerów.
- Kontener BeanFactory
- Kontener ApplicationContext
Czytaj więcej: Inversion of Control and Dependency Injection
BeanFactory
A BeanFactory jest w zasadzie niczym więcej niż interfejsem dla zaawansowanej fabryki zdolnej do utrzymywania rejestru różnych fasolek i ich zależności.
Formuła BeanFactory
umożliwia nam odczytywanie definicji fasoli i dostęp do nich za pomocą fabryki fasoli.
1.1. Jak utworzyć BeanFactory
Gdy używamy tylko BeanFactory
możemy utworzyć jedną i wczytać niektóre definicje beanów w formacie XML w następujący sposób:
Inne sposoby tworzenia fabryki beanów są jak poniżej:
Podstawowo to wszystko. Używając getBean(String)
, możesz pobierać instancje swoich fasolek; widok po stronie klienta BeanFactory
jest zaskakująco prosty.
1.2. Metody BeanFactory
Interfejs BeanFactory
ma tylko sześć metod do wywołania przez kod klienta:
-
boolean containsBean(String)
: zwraca true, jeśliBeanFactory
zawiera definicję fasoli lub instancję fasoli, która pasuje do podanej nazwy -
Object getBean(String)
: zwraca instancję fasoli zarejestrowaną pod podaną nazwą. W zależności od tego, w jaki sposób bean został skonfigurowany przez konfiguracjęBeanFactory
, zwrócona zostanie albo singleton, a więc współdzielona instancja, albo nowo utworzony bean. ABeansException
zostanie rzucony, gdy albo nie można było znaleźć beana (w takim przypadku będzie toNoSuchBeanDefinitionException
), albo podczas instancjonowania i przygotowywania beana wystąpił wyjątek -
Object getBean(String, Class)
: zwraca beana, zarejestrowanego pod podaną nazwą. Zwrócony bean zostanie rzutowany na podaną klasę. Jeśli bean nie może być rzutowany, zostaną rzucone odpowiednie wyjątki (BeanNotOfRequiredTypeException
). Ponadto obowiązują wszystkie zasady metodygetBean(String)
(patrz wyżej) -
Class getType(String name)
: zwracaClass
beana o podanej nazwie. Jeśli nie udało się znaleźć żadnego beana odpowiadającego podanej nazwie, zostanie wyrzuconyNoSuchBeanDefinitionException
-
boolean isSingleton(String)
: określa, czy definicja beana lub instancja beana zarejestrowana pod podaną nazwą jest singletonem. Jeśli nie można znaleźć żadnego beana odpowiadającego podanej nazwie, zostanie wyrzuconyNoSuchBeanDefinitionException
-
String getAliases(String)
: Return the aliases for the given bean name, if any were defined in the bean definition
ApplicationContext
Kontener ApplicationContext dodaje więcej funkcjonalności specyficznych dla przedsiębiorstw, takich jak możliwość rozwiązywania wiadomości tekstowych z pliku właściwości oraz możliwość publikowania zdarzeń aplikacji do zainteresowanych słuchaczy zdarzeń. Kontener ten jest zdefiniowany przez interfejs org.springframework.context.ApplicationContext.
Kontener ApplicationContext zawiera całą funkcjonalność kontenera BeanFactory, więc jest ogólnie zalecany ponad BeanFactory. BeanFactory
może być nadal używany dla lekkich aplikacji, takich jak urządzenia mobilne lub aplikacje oparte na apletach, gdzie ilość i szybkość danych jest znacząca.
2.1. Typy ApplicationContext
Najczęściej używane ApplicationContext
implementacje to:
- FileSystemXmlApplicationContext – Ten kontener ładuje definicje fasoli z pliku XML. W tym przypadku należy podać pełną ścieżkę do pliku konfiguracyjnego XML fasoli do konstruktora.
- ClassPathXmlApplicationContext – Ten kontener ładuje definicje fasoli z pliku XML. W tym przypadku nie trzeba podawać pełnej ścieżki do pliku XML, ale trzeba odpowiednio ustawić CLASSPATH, ponieważ ten kontener będzie szukał pliku XML z konfiguracją fasoli w CLASSPATH.
- WebXmlApplicationContext – Ten kontener ładuje plik XML z definicjami wszystkich fasolek z poziomu aplikacji internetowej.
2.2. Jak utworzyć ApplicationContext
Przykładowy kod do instancjonowania kontekstu aplikacji będzie wyglądał tak.
.