Middle
Qual é o ciclo de vida de um objeto criado no Spring?
sobes.tech IA
Resposta da IA
- Instanciar: O Spring cria uma instância do objeto.
- Preencher propriedades: Dependências (campos marcados com
@Autowired,@Value, etc.) são injetadas através de setters ou campos. - Interfaces Aware: Se o bean implementar
BeanNameAware,BeanFactoryAware,ApplicationContextAwareou outras interfaces Aware, o Spring chama os métodos correspondentes (setBeanName,setBeanFactory,setApplicationContext, etc.), passando o contexto. - BeanPostProcessors (pré-inicialização): Antes de chamar os métodos de inicialização,
postProcessBeforeInitializationdosBeanPostProcessorregistrados é chamado. - Bean de inicialização:
- Se o bean implementar
InitializingBean, seu métodoafterPropertiesSet()é chamado. - Se uma método de inicialização for especificado via
@Bean(initMethod="...")ouinit-methodem XML, esse método é chamado.
- Se o bean implementar
- BeanPostProcessors (pós-inicialização): Após a inicialização,
postProcessAfterInitializationdosBeanPostProcessorregistrados é chamado. Nesta etapa, frequentemente são criados objetos proxy (por exemplo, para transações ou segurança). - Pronto para uso: O objeto é considerado totalmente configurado e pronto para uso.
- Destruir:
- Se o bean implementar
DisposableBean, seu métododestroy()é chamado. - Se uma método de destruição for especificado via
@Bean(destroyMethod="...")oudestroy-methodem XML, esse método é chamado. - O método marcado com
@PreDestroyé chamado.
- Se o bean implementar
- Limpeza: O Spring remove o bean do contexto.
// Exemplo de um bean participando do ciclo de vida
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. Preencher propriedades (via setter)
private Dependency requiredDependency;
public void setRequiredDependency(Dependency requiredDependency) {
System.out.println("2. Definindo dependência");
this.requiredDependency = requiredDependency;
}
// 3. Interfaces Aware
@Override
public void setBeanName(String name) {
System.out.println("3. Definindo nome do bean: " + name);
this.beanName = name;
}
// 5. Bean de inicialização (de InitializingBean)
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("5. Chamado afterPropertiesSet() de InitializingBean");
// Lógica de inicialização
}
// 5. Bean de inicialização (de @PostConstruct)
@PostConstruct
public void postConstructMethod() {
System.out.println("5. Método @PostConstruct chamado");
// Lógica de inicialização
}
// 5. Método de inicialização personalizado
public void customInitMethod() {
System.out.println("5. Método init personalizado chamado");
// Lógica de inicialização
}
// 7. Pronto para usar
public void doSomething() {
System.out.println("7. O bean está pronto e fazendo algo");
}
// 8. Destruir (de DisposableBean)
@Override
public void destroy() throws Exception {
System.out.println("8. Método destroy() de DisposableBean chamado");
// Lógica de limpeza
}
// 8. Destruir (de @PreDestroy)
@PreDestroy
public void preDestroyMethod() {
System.out.println("8. Método @PreDestroy chamado");
// Lógica de limpeza
}
// 8. Destruir (método destroy personalizado)
public void customDestroyMethod() {
System.out.println("8. Método destroy personalizado chamado");
// Lógica de limpeza
}
// Classe interna para exemplo de dependência
public static class Dependency {
// ...
}
}