Назад к вопросам
Middle
101
questionbank

Каков жизненный цикл объекта, создаваемого в Spring?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

  1. Instantiate: Spring создает экземпляр объекта.
  2. Populate Properties: Внедряются зависимости (поля, помеченные @Autowired, @Value и т.д.) через сеттеры или поля.
  3. Aware Interfaces: Если бин реализует BeanNameAware, BeanFactoryAware, ApplicationContextAware или другие Aware-интерфейсы, Spring вызывает соответствующие методы (setBeanName, setBeanFactory, setApplicationContext и т.д.), передавая контекст.
  4. BeanPostProcessors (pre-initialization): Перед вызовом методов инициализации вызывается postProcessBeforeInitialization зарегистрированных BeanPostProcessor.
  5. Initializing Bean:
    • Если бин реализует InitializingBean, вызывается его метод afterPropertiesSet().
    • Если указан метод инициализации через @Bean(initMethod="...") или init-method в XML, вызывается этот метод.
  6. BeanPostProcessors (post-initialization): После инициализации вызывается postProcessAfterInitialization зарегистрированных BeanPostProcessor. На этом этапе часто создаются прокси-объекты (например, для транзакционности или безопасности).
  7. Ready to Use: Объект считается полностью сконфигурированным и готов к использованию.
  8. Destroy:
    • Если бин реализует DisposableBean, вызывается его метод destroy().
    • Если указан метод уничтожения через @Bean(destroyMethod="...") или destroy-method в XML, вызывается этот метод.
    • Вызывается метод, помеченный @PreDestroy.
  9. 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 {
        // ...
    }
}