Жизненный цикл спринг бина таков:
- В 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 сегодня предоставляет огромное количество различных средств для разработки Веб-приложений, которые будут рассмотрены в этом курсе.