[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-spring-kakov-zhiznennyy-tsikl-spring-bean":3},{"id":4,"slug":5,"topicId":6,"topicSlug":7,"topicName":8,"topicEmoji":9,"question":10,"answer":11,"codeLang":12,"codeSrc":12,"important":12,"commonMistakes":12,"modernUsage":12,"difficulty":13,"tags":14,"related":15,"progress":16,"seo":17},609,"kakov-zhiznennyy-tsikl-spring-bean",14,"spring","Spring","🌱","Каков жизненный цикл Spring Bean?","Жизненный цикл Spring Bean -- последовательность этапов от создания до уничтожения объекта в контейнере.\n\n### Полный жизненный цикл (для singleton-бина)\n\n1. Инстанцирование -- контейнер создаёт экземпляр бина (через конструктор)\n2. Установка свойств -- внедряются зависимости (через сеттеры, поля)\n3. `BeanNameAware.setBeanName()` -- если бин реализует `BeanNameAware`\n4. `BeanFactoryAware.setBeanFactory()` -- если реализует `BeanFactoryAware`\n5. `ApplicationContextAware.setApplicationContext()` -- если реализует `ApplicationContextAware`\n6. `BeanPostProcessor.postProcessBeforeInitialization()` -- для всех BeanPostProcessor\n7. `@PostConstruct` -- вызов метода, помеченного аннотацией\n8. `InitializingBean.afterPropertiesSet()` -- если реализует `InitializingBean`\n9. `init-method` -- вызов пользовательского метода инициализации\n10. `BeanPostProcessor.postProcessAfterInitialization()` -- здесь могут создаваться прокси (для `@Transactional`)\n11. Бин готов к использованию\n12. `@PreDestroy` -- при закрытии контейнера\n13. `DisposableBean.destroy()` -- если реализует `DisposableBean`\n14. `destroy-method` -- вызов пользовательского метода уничтожения\n\n\u003Cdetails>\n\u003Csummary>Пример бина с callback-методами\u003C\u002Fsummary>\n\n```java\n@Component\npublic class MyBean implements InitializingBean, DisposableBean {\n\n    @Autowired\n    private SomeDependency dependency;\n\n    @PostConstruct\n    public void postConstruct() {\n        System.out.println(\"3. @PostConstruct -- после внедрения зависимостей\");\n    }\n\n    @Override\n    public void afterPropertiesSet() {\n        System.out.println(\"4. InitializingBean.afterPropertiesSet()\");\n    }\n\n    @PreDestroy\n    public void preDestroy() {\n        System.out.println(\"6. @PreDestroy -- перед уничтожением\");\n    }\n\n    @Override\n    public void destroy() {\n        System.out.println(\"7. DisposableBean.destroy()\");\n    }\n}\n```\n\n\u003C\u002Fdetails>\n\n### BeanPostProcessor\n\nМощный механизм, позволяющий вмешаться в процесс создания каждого бина. Именно через BeanPostProcessor работают многие аннотации Spring (`@Autowired`, `@Transactional`, `@Async`):\n\n```java\n@Component\npublic class CustomBeanPostProcessor implements BeanPostProcessor {\n\n    @Override\n    public Object postProcessBeforeInitialization(Object bean, String beanName) {\n        return bean; \u002F\u002F вызывается перед @PostConstruct\n    }\n\n    @Override\n    public Object postProcessAfterInitialization(Object bean, String beanName) {\n        return bean; \u002F\u002F здесь можно обернуть бин в прокси\n    }\n}\n```\n\n> **На собеседовании:** важно назвать ключевые этапы: конструктор -> внедрение зависимостей -> BeanPostProcessor (before) -> @PostConstruct -> BeanPostProcessor (after, тут прокси). Частая ошибка -- использовать зависимости, внедрённые через поля, в конструкторе (они ещё не установлены). Для инициализации используйте `@PostConstruct` или конструкторное внедрение.","","middle",[7],[],null,{"title":18,"description":19,"ogTitle":18,"ogDescription":19,"keywords":20,"schemaAnswer":19,"featuredSnippetReady":21},"Каков жизненный цикл Spring Bean? — Gymterview","Жизненный цикл Spring Bean -- последовательность этапов от создания до уничтожения объекта в контейнере.",[7,13],true]