Жизненный цикл спринг бина таков:
- В Java программе создается объект BeanFactory
- В нем создаются бины и внедряются зависимости
- Потом вызывается метод указанный в init-method у бина в конфигурационном xml файле
- Потом созданные бины в BeanFactory извлекаются оттуда и используются
- Вызов context.close() завершает работу BeanFactory и при этом уничтожаются бины, но перед этим вызывается метод указанный в destroy-method.
Что же это за init-method
и destroy-method
?
Это что-то типа init и destroy методов в сервлете. Как мы помним, init
метод нужен в сервлете для инициализации каких-то данных при создании объекта сервлета, а destroy
метод нужен для освобождения каких-то ресурсов перед уничтожением объекта сервлета.
init-method и destroy-method, это то же самое, только с бином.
init и destroy методы определяются в классе бина. Могут иметь любое имя. Давайте же добавим их в класс ServerPC
.
ServerPC:
Давайте сконфигурируем два бина. Один будет с scope singleton
, другой с scope prototype
. И определим у них init и destroy методы.
applicationContext.xml:
Теперь давайте в сервлете создадим, извлечем, используем и уничтожим бины в определенной последовательности для демонстрации жизненного цикла бина.
Пример программы:
Компилируем Java файлики. Файл сервлета при этом компилируем с использованием jar файлов спринг:

Запускаем Tomcat и открываем страницу сервлета по пути /springservlet
и смотрим в консоль Tomcаt сервера:

Как видим, сразу создался бин со скоупом синглтон
. об этом говорит строка Bean is Created!, которую выводит конструктор при создании бина serverPCBeanpSingletonScope
.
Сразу после создания этого бина вызывается init
метод, который выводит строку Some initializations.
Создание бина синглтона же случилось при создании Beanfactory
, а не при вызове getBean
этого бина. Это доказывает третья строка в консоли, которая выведена в консоль между созданием объектаа BeanFactory и вызовом getBean бина синглтона.
Далее мы воспользовались этим бином вывели у него значение поля.
Теперь же создается бин serverPCBeanpPototypeScope
со скоупом prototype
когда вызывается getBean
этого бина. При этом, конструктор выводит сообщение при создании бина и сразу после этого вызывается метод инициализации, который тоже выводит сообщение.
После этого этот бин используется. Выводиться значение его поля.
И в конце программы вызывается context.close()
; который перед удалением бинов и объекта BeanFactory
вызывает destroy метод, который выводит последнюю Some Clean Up.
Выводы о Spring Framework
И в итоге можно еще не до конца понимать зачем нужен этот ваш Spring Framework, все эти бины, если создание и внедрение бинов можно с легкостью выполнять в java классе кодом:
Administrator admin = new Administrator();
ServerPC serverPC = new ServerPC(admin);
Таких DI "матрешек"
в обычном (не спринг) веб-приложении с большим количеством классов будет очень много, а Spring Framework предлагает вынести их в отдельный конфигурационный файл и спринг сам будет создавать объекты сконфигурированных бинов и устанавливать зависимости, а java код самого приложения будет чист нам останется лишь только извлечь созданные объекты из пула объектов созданных спрингом.
Может показаться кода в целом стало больше (код конф файла плюс некоторый код для извлечения бинов в самом приложении), но истенный смысл Spring Framework становится очевидным только разработчикам, которым приходилось вручную управлять всеми этими DI «матрёшками» в крупных не-Spring проектах. Когда мы дойдем до Spring аннотаций о смысле Spring Framework не придется задумываться, там не нужно будет конфигурировать бины в отдельном файле и писать много кода, их конфигурация будет происходить простыми аннотациями в коде классов.
Также, поскольку спринг сам берет на себя ответственность за создание объектов, он может и добавлять к ним некоторую доп функциональность (какую-то мы уже видели – добавление скоупов, методов при иниц. или уничтожении).
Функциональность Spring сегодня уже не ограничивается просто созданием и внедрением бинов. Spring сегодня предоставляет огромное количество различных средств для разработки Веб-приложений, которые будут рассмотрены в этом курсе.