Sobes.tech
Middle

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

sobes.tech AI

Отговор от AI

  1. Създаване: Spring създава екземпляр на обекта.
  2. Попълване на свойства: Зависимостите (полетата, маркирани с @Autowired, @Value и др.) се инжектират чрез сетъри или полета.
  3. Aware интерфейси: Ако бина реализира BeanNameAware, BeanFactoryAware, ApplicationContextAware или други Aware интерфейси, Spring извиква съответните методи (setBeanName, setBeanFactory, setApplicationContext и др.), предавайки контекста.
  4. BeanPostProcessors (преди инициализация): Преди извикването на методите за инициализация се извикват postProcessBeforeInitialization на регистрираните BeanPostProcessor.
  5. Инициализация на бина:
    • Ако бина реализира InitializingBean, се извиква неговият метод afterPropertiesSet().
    • Ако е указана инициализационна метода чрез @Bean(initMethod="...") или init-method в XML, се извиква този метод.
  6. BeanPostProcessors (след инициализация): След инициализацията се извикват postProcessAfterInitialization на регистрираните BeanPostProcessor. В този етап често се създават прокси обекти (например за транзакционност или сигурност).
  7. Готов за използване: Обектът се счита за напълно конфигуриран и готов за използване.
  8. Разпадане:
    • Ако бина реализира DisposableBean, се извиква неговият метод destroy().
    • Ако е указана метод за унищожаване чрез @Bean(destroyMethod="...") или destroy-method в XML, се извиква този метод.
    • Извиква се методът, маркиран с @PreDestroy.
  9. Почистване: 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. Попълване на свойства (чрез сетър)
    private Dependency requiredDependency;

    public void setRequiredDependency(Dependency requiredDependency) {
        System.out.println("2. Настройване на зависимост");
        this.requiredDependency = requiredDependency;
    }

    // Aware интерфейси
    @Override
    public void setBeanName(String name) {
        System.out.println("3. Настройване на име на бина: " + name);
        this.beanName = name;
    }

    // Инициализация на бина (от InitializingBean)
    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("5. Вика се afterPropertiesSet() от InitializingBean");
        // Логика за инициализация
    }

    // @PostConstruct метод
    @PostConstruct
    public void postConstructMethod() {
        System.out.println("5. Вика се метод @PostConstruct");
        // Логика за инициализация
    }

    // Персонализиран init метод
    public void customInitMethod() {
        System.out.println("5. Вика се персонализиран init метод");
        // Логика за инициализация
    }

    // Готов за използване
    public void doSomething() {
        System.out.println("7. Бинът е готов и прави нещо");
    }

    // Разпадане (от DisposableBean)
    @Override
    public void destroy() throws Exception {
        System.out.println("8. Вика се destroy() от DisposableBean");
        // Логика за почистване
    }

    // @PreDestroy метод
    @PreDestroy
    public void preDestroyMethod() {
        System.out.println("8. Вика се метод @PreDestroy");
        // Логика за почистване
    }

    // Персонализиран destroy метод
    public void customDestroyMethod() {
        System.out.println("8. Вика се персонализиран destroy метод");
        // Логика за почистване
    }

    // Вътрешен клас за пример на зависимост
    public static class Dependency {
        // ...
    }
}