Middle
Qual è il ciclo di vita di un oggetto creato in Spring?
sobes.tech AI
Risposta dell'AI
- Istanzia: Spring crea un'istanza dell'oggetto.
- Popolare le proprietà: Le dipendenze (campi contrassegnati con
@Autowired,@Value, ecc.) vengono iniettate tramite setter o campi. - Interfacce Aware: Se il bean implementa
BeanNameAware,BeanFactoryAware,ApplicationContextAwareo altre interfacce Aware, Spring chiama i metodi corrispondenti (setBeanName,setBeanFactory,setApplicationContext, ecc.), passando il contesto. - BeanPostProcessors (pre-inizializzazione): Prima di chiamare i metodi di inizializzazione, viene chiamato
postProcessBeforeInitializationdeiBeanPostProcessorregistrati. - Bean di inizializzazione:
- Se il bean implementa
InitializingBean, viene chiamato il suo metodoafterPropertiesSet(). - Se viene specificato un metodo di inizializzazione tramite
@Bean(initMethod="...")oinit-methodin XML, viene chiamato quel metodo.
- Se il bean implementa
- BeanPostProcessors (post-inizializzazione): Dopo l'inizializzazione, viene chiamato
postProcessAfterInitializationdeiBeanPostProcessorregistrati. In questa fase, spesso vengono creati oggetti proxy (ad esempio, per transazioni o sicurezza). - Pronto all'uso: L'oggetto è considerato completamente configurato e pronto all'uso.
- Distruzione:
- Se il bean implementa
DisposableBean, viene chiamato il suo metododestroy(). - Se viene specificato un metodo di distruzione tramite
@Bean(destroyMethod="...")odestroy-methodin XML, viene chiamato quel metodo. - Viene chiamato il metodo contrassegnato con
@PreDestroy.
- Se il bean implementa
- Pulizia: Spring rimuove il bean dal contesto.
// Esempio di un bean che partecipa al ciclo di vita
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. Popolare le proprietà (tramite setter)
private Dependency requiredDependency;
public void setRequiredDependency(Dependency requiredDependency) {
System.out.println("2. Impostazione dipendenza");
this.requiredDependency = requiredDependency;
}
// 3. Interfacce Aware
@Override
public void setBeanName(String name) {
System.out.println("3. Impostazione nome bean: " + name);
this.beanName = name;
}
// 5. Bean di inizializzazione (da InitializingBean)
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("5. Chiamato afterPropertiesSet() di InitializingBean");
// Logica di inizializzazione
}
// 5. Metodo di inizializzazione (@PostConstruct)
@PostConstruct
public void postConstructMethod() {
System.out.println("5. Metodo @PostConstruct chiamato");
// Logica di inizializzazione
}
// 5. Metodo di inizializzazione personalizzato
public void customInitMethod() {
System.out.println("5. Metodo init personalizzato chiamato");
// Logica di inizializzazione
}
// 7. Pronto all'uso
public void doSomething() {
System.out.println("7. Il bean è pronto e fa qualcosa");
}
// 8. Distruzione (da DisposableBean)
@Override
public void destroy() throws Exception {
System.out.println("8. Metodo destroy() di DisposableBean chiamato");
// Logica di pulizia
}
// 8. Distruzione (@PreDestroy)
@PreDestroy
public void preDestroyMethod() {
System.out.println("8. Metodo @PreDestroy chiamato");
// Logica di pulizia
}
// 8. Metodo di distruzione personalizzato
public void customDestroyMethod() {
System.out.println("8. Metodo destroy personalizzato chiamato");
// Logica di pulizia
}
// Classe interna di esempio di dipendenza
public static class Dependency {
// ...
}
}