Закоулки мозга

Application context

  • BeanFactory - центральный IoC интерфейс, предоставляет низкоуровневые функции
  • ApplicationContext - расширяет BeanFactory, добавляет ряд функций из других интерфейсов (является фасадом для нескольких функциональных интерфейсов), например, обработку событий, интеграцию с AOP, работу с ресурсами и т.п.

XML-конфигурация

При создании контексту можно передать несколько конфигурационных xml-файлов. Главное пространство имен в xml-конфигурации - это пространство beans, для которого существует xsd-схема - ее нужно добавить в элемент <beans/>. Версия схемы корректно выводится из используемой версии Spring, поэтому лучше ее явно не указывать в xml, чтобы не приходилось изменять конфигурацию после смены версии Spring на проекте. Пространство имен beans обязательно для каждого файла конфигурации.

Особенности конфигурации:

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