Назад к вопросам
Middle
101
questionbank
Каков жизненный цикл объекта, создаваемого в Spring?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
- Instantiate: Spring создает экземпляр объекта.
- Populate Properties: Внедряются зависимости (поля, помеченные
@Autowired,@Valueи т.д.) через сеттеры или поля. - Aware Interfaces: Если бин реализует
BeanNameAware,BeanFactoryAware,ApplicationContextAwareили другие Aware-интерфейсы, Spring вызывает соответствующие методы (setBeanName,setBeanFactory,setApplicationContextи т.д.), передавая контекст. - BeanPostProcessors (pre-initialization): Перед вызовом методов инициализации вызывается
postProcessBeforeInitializationзарегистрированныхBeanPostProcessor. - Initializing Bean:
- Если бин реализует
InitializingBean, вызывается его методafterPropertiesSet(). - Если указан метод инициализации через
@Bean(initMethod="...")илиinit-methodв XML, вызывается этот метод.
- Если бин реализует
- BeanPostProcessors (post-initialization): После инициализации вызывается
postProcessAfterInitializationзарегистрированныхBeanPostProcessor. На этом этапе часто создаются прокси-объекты (например, для транзакционности или безопасности). - Ready to Use: Объект считается полностью сконфигурированным и готов к использованию.
- Destroy:
- Если бин реализует
DisposableBean, вызывается его методdestroy(). - Если указан метод уничтожения через
@Bean(destroyMethod="...")илиdestroy-methodв XML, вызывается этот метод. - Вызывается метод, помеченный
@PreDestroy.
- Если бин реализует
- Cleanup: Spring удаляет бин из контекста.
// Пример бина, участвующего в жизненном цикле
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.BeanNameAware;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
public class MySpringBean implements InitializingBean, DisposableBean, BeanNameAware {
private String beanName;
// 2. Populate Properties (через сеттер)
private Dependency requiredDependency;
public void setRequiredDependency(Dependency requiredDependency) {
System.out.println("2. Setting dependency");
this.requiredDependency = requiredDependency;
}
// 3. Aware Interfaces
@Override
public void setBeanName(String name) {
System.out.println("3. Setting bean name: " + name);
this.beanName = name;
}
// 5. Initializing Bean (из InitializingBean)
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("5. InitializingBean afterPropertiesSet() called");
// Логика инициализации
}
// 5. Initializing Bean (из @PostConstruct)
@PostConstruct
public void postConstructMethod() {
System.out.println("5. @PostConstruct method called");
// Логика инициализации
}
// 5. Initializing Bean (пользовательский initMethod)
public void customInitMethod() {
System.out.println("5. Custom init method called");
// Логика инициализации
}
// 7. Ready to Use
public void doSomething() {
System.out.println("7. Bean is ready and doing something");
}
// 8. Destroy (из DisposableBean)
@Override
public void destroy() throws Exception {
System.out.println("8. DisposableBean destroy() called");
// Логика очистки
}
// 8. Destroy (из @PreDestroy)
@PreDestroy
public void preDestroyMethod() {
System.out.println("8. @PreDestroy method called");
// Логика очистки
}
// 8. Destroy (пользовательский destroyMethod)
public void customDestroyMethod() {
System.out.println("8. Custom destroy method called");
// Логика очистки
}
// Внутренний класс для примера зависимости
public static class Dependency {
// ...
}
}