Bean :
Бины – это объекты , которые управляются Spring IoC контейнером .
Эти объекты создаются с помощью : POJO(Plain Old Java Object) + конфигурационных метаданных .
Для того чтобы наша конфигурация была понята Spring’ом существует XmlBeanDefinitionReader. Это внутренний компонент Spring’a, который сканирует (парсит) xml и на основе того, что мы там написали создает BeanDefinition’ы. BeanDefinition – это объект, который хранит в себе информацию о бине. Сюда входит: из какого класса его (бин) надо создать; scope; установлена ли ленивая инициализация; нужно ли перед данным бином инициализировать другой и иные проперти, которые описаны в xml. Все полученные BeanDefinition’ы складываются в HashMap, в которой идентификатором является имя бина (установленное вами или присвоенное спрингом) и сам BeanDefinition объект.
После того, как все BeanDefinition’ы созданы на сцену выходит новый герой – BeanFactory. Этот объект итерируется по HashMap’e с BeanDefinition’ами, создает на их основе бины и складывает в IoC контейнер. Здесь есть нюанс, на самом деле, при старте приложения, в IoC контейнер попадут бины, которые имеют scope Singleton (устанавливается по-умолчанию), остальные же создаются, тогда когда они нужны (prototype, request, session).
требования к Bean:
- Класс должен иметь конструктор без параметров, с модификатором доступа public
- Все поля класса должны иметь модификатор private и свойства класса должны быть доступны через get, set
- Класс должен быть сериализуем. implements java.io.Serializable . (не обязательно)
алгоритм инициализации контекста:
- XmlBeanDefinitionReader сканирует наш xml-конфигурационный файл.
- Создает BeanDefinition’ы и кладет их в HashMap.
- Приходит BeanFactory и из этой HashMap отдельно складывает все BeanPostProcessor’ы.
- Создает из BeanDefinition’ов бины и кладет их в IoC-контейнер.
- Тут приходят BPP и настраивают эти бины с помощью 2х методов. (postProcessorBeforeInitialization , postProcessorAfterInitialization)
Свойства Bean:
- class - Этот атрибут является обязательным и указывает конкретный класс Java-приложения, который будет использоваться для создания бина.
- id или name - "id" Уникальный идентификатор бина. “name” как алиас , может содержать одновременно множество имен.
- scope - Это свойство определяет область видимости создаваемых объектов. (singleton , prototype , request )
- constructor-arg - Определяет конструктор, использующийся для внедрения зависимости.
- properties - Определяет свойства внедрения зависимости.
- initialization method - Здесь определяется метод инициализации бина
- destruction method - Метод уничтожения бина, который будет использоваться при уничтожении контейнера, содержащего бин.
- autowiring mode - Определяет режим автоматического связывания при внедрении зависимости.
- lazy-initialization mode - Режим ленивой инициализации даёт контейнеру IoC команду создавать экземпляр бина при первом запросе, а не при запуске приложения.
типы Bean:
- Entity Bean
- Session Bean (stateless , stateful , singleton)
- Message Driven Beans