Application context
BeanFactory
- центральный IoC интерфейс, предоставляет низкоуровневые функцииApplicationContext
- расширяетBeanFactory
, добавляет ряд функций из других интерфейсов (является фасадом для нескольких функциональных интерфейсов), например, обработку событий, интеграцию с AOP, работу с ресурсами и т.п.
XML-конфигурация
При создании контексту можно передать несколько конфигурационных xml-файлов.
Главное пространство имен в xml-конфигурации - это пространство beans
, для
которого существует xsd-схема - ее нужно добавить в элемент <beans/>
. Версия
схемы корректно выводится из используемой версии Spring, поэтому лучше ее явно
не указывать в xml, чтобы не приходилось изменять конфигурацию после смены
версии Spring на проекте. Пространство имен beans
обязательно для каждого
файла конфигурации.
Особенности конфигурации:
- Инициализировать бины можно с помощью setters:
При этом возможна комбинация внедрения через конструктор и через сеттеры. В таком случае сначала внедряются зависимости, объявленные в конструкторе, а затем происходит внедрение через сеттеры. Атрибут<bean id="someID" class="fully.qualified.ClassName"> <property name="fieldName" value="...." /> </bean>
name
являтся обязательным, т.к. определяет название свойства, в которое происходит внедрение. Запись можно сократить с помощью p-namespace. - Бины без конструкторов не требуют дополнительных тегов.
- Бин можно инициализировать с помощью фабричного метода:
в классе должен существовать публичный статичный метод<bean id="someID" factory-method="initialize"> <constructor-arg value="methodArg" /> </bean>
initialize
, возвращающий экземпляр класса бина.initialize
получает на входе параметрconstructor-args
, настраивает создаваемый бин. Этот метод позволяет классу по сути “создавать самому себя”. - Можно использовать для создания бинов Фабрику бинов, похожим образом
конфигурируемый
factory-bean
. С помощью комбинации фабрики бинов и фабричного метода можно создавать пользовательские преобразователи значений для конверсии строк из файлов конфигурации в ООП-объекты любых других типов. - Бины с конструктором можно конфигурировать с помощью тега
constructor-arg
, есть варианты с передачей значений по типу (ref
), по названию аргумента (name
), по очередности (index
). Также существует возможность передать в конструктор примитивное значение (value
). Инъекция через конструктор используется в случаях, когда предоставляемые ООП-объекты обязательны, и бин не может функционировать без них. Также используется в случаях, когда бины создаются на основе классов из сторонних библиотек, не допускающих других методов внедрения зависимостей. Внедрение через конструктор также позволяет создавать неизменяемые ООП-объекты, для которых поля, соответствующие аргументам конструктора, задаются какfinal
. Вместо элемента<constructor-arg>
можно использовать c-namespace напрямую в элементе<bean>
.