Middle
Какъв е жизненият цикъл на обект, създаден в Spring?
sobes.tech AI
Отговор от AI
- Създаване: Spring създава екземпляр на обекта.
- Попълване на свойства: Зависимостите (полетата, маркирани с
@Autowired,@Valueи др.) се инжектират чрез сетъри или полета. - Aware интерфейси: Ако бина реализира
BeanNameAware,BeanFactoryAware,ApplicationContextAwareили други Aware интерфейси, Spring извиква съответните методи (setBeanName,setBeanFactory,setApplicationContextи др.), предавайки контекста. - BeanPostProcessors (преди инициализация): Преди извикването на методите за инициализация се извикват
postProcessBeforeInitializationна регистриранитеBeanPostProcessor. - Инициализация на бина:
- Ако бина реализира
InitializingBean, се извиква неговият методafterPropertiesSet(). - Ако е указана инициализационна метода чрез
@Bean(initMethod="...")илиinit-methodв XML, се извиква този метод.
- Ако бина реализира
- BeanPostProcessors (след инициализация): След инициализацията се извикват
postProcessAfterInitializationна регистриранитеBeanPostProcessor. В този етап често се създават прокси обекти (например за транзакционност или сигурност). - Готов за използване: Обектът се счита за напълно конфигуриран и готов за използване.
- Разпадане:
- Ако бина реализира
DisposableBean, се извиква неговият методdestroy(). - Ако е указана метод за унищожаване чрез
@Bean(destroyMethod="...")илиdestroy-methodв XML, се извиква този метод. - Извиква се методът, маркиран с
@PreDestroy.
- Ако бина реализира
- Почистване: 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 {
// ...
}
}