Primavera - Ciclo de Vida do Feijão
O ciclo de vida de um bean Spring é fácil de entender. Quando um bean é instanciado, pode ser necessário realizar alguma inicialização para colocá-lo em um estado utilizável. Da mesma forma, quando o bean não é mais necessário e é removido do contêiner, alguma limpeza pode ser necessária.
Embora existam listas das atividades que ocorrem nos bastidores entre o momento da instanciação do bean e sua destruição, este capítulo discutirá apenas dois métodos importantes de retorno de chamada do ciclo de vida do bean, que são necessários no momento da inicialização do bean e sua destruição.
Para definir a configuração e desmontagem de um bean, simplesmente declaramos o <bean> com initmethod e / ou destroy-methodparâmetros. O atributo init-method especifica um método que deve ser chamado no bean imediatamente após a instanciação. Da mesma forma, destroymethod especifica um método que é chamado pouco antes de um bean ser removido do contêiner.
Retornos de chamada de inicialização
A interface org.springframework.beans.factory.InitializingBean especifica um único método -
void afterPropertiesSet() throws Exception;
Assim, você pode simplesmente implementar a interface acima e o trabalho de inicialização pode ser feito dentro do método afterPropertiesSet () da seguinte maneira -
public class ExampleBean implements InitializingBean {
public void afterPropertiesSet() {
// do some initialization work
}
}
No caso de metadados de configuração baseados em XML, você pode usar o init-methodatributo para especificar o nome do método que possui uma assinatura sem argumento nula. Por exemplo -
<bean id = "exampleBean" class = "examples.ExampleBean" init-method = "init"/>
A seguir está a definição da classe -
public class ExampleBean {
public void init() {
// do some initialization work
}
}
Retornos de chamada de destruição
A interface org.springframework.beans.factory.DisposableBean especifica um único método -
void destroy() throws Exception;
Assim, você pode simplesmente implementar a interface acima e o trabalho de finalização pode ser feito dentro do método destroy () da seguinte maneira -
public class ExampleBean implements DisposableBean {
public void destroy() {
// do some destruction work
}
}
No caso de metadados de configuração baseados em XML, você pode usar o destroy-methodatributo para especificar o nome do método que possui uma assinatura sem argumento nula. Por exemplo -
<bean id = "exampleBean" class = "examples.ExampleBean" destroy-method = "destroy"/>
A seguir está a definição da classe -
public class ExampleBean {
public void destroy() {
// do some destruction work
}
}
Se você estiver usando o contêiner IoC do Spring em um ambiente de aplicativo não web; por exemplo, em um ambiente de desktop rich client, você registra um gancho de encerramento com a JVM. Isso garante um desligamento normal e chama os métodos de destruição relevantes em seus beans singleton para que todos os recursos sejam liberados.
É recomendável que você não use os retornos de chamada InitializingBean ou DisposableBean, porque a configuração XML oferece muita flexibilidade em termos de nomenclatura de seu método.
Exemplo
Vamos ter um Eclipse IDE funcionando e seguir os seguintes passos para criar um aplicativo Spring -
Passos | Descrição |
---|---|
1 | Crie um projeto com um nome SpringExample e crie um pacote com.tutorialspoint sob osrc pasta no projeto criado. |
2 | Adicione as bibliotecas Spring necessárias usando a opção Adicionar JARs externos, conforme explicado no capítulo Exemplo do Spring Hello World . |
3 | Crie classes Java HelloWorld e MainApp no pacote com.tutorialspoint . |
4 | Crie o arquivo de configuração do Beans Beans.xml sob osrc pasta. |
5 | A etapa final é criar o conteúdo de todos os arquivos Java e do arquivo de configuração do Bean e executar o aplicativo conforme explicado abaixo. |
Aqui está o conteúdo de HelloWorld.java arquivo -
package com.tutorialspoint;
public class HelloWorld {
private String message;
public void setMessage(String message){
this.message = message;
}
public void getMessage(){
System.out.println("Your Message : " + message);
}
public void init(){
System.out.println("Bean is going through init.");
}
public void destroy() {
System.out.println("Bean will destroy now.");
}
}
A seguir está o conteúdo do MainApp.javaArquivo. Aqui você precisa registrar um gancho de desligamentoregisterShutdownHook()método que é declarado na classe AbstractApplicationContext. Isso garantirá um desligamento normal e chamará os métodos de destruição relevantes.
package com.tutorialspoint;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MainApp {
public static void main(String[] args) {
AbstractApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");
HelloWorld obj = (HelloWorld) context.getBean("helloWorld");
obj.getMessage();
context.registerShutdownHook();
}
}
A seguir está o arquivo de configuração Beans.xml requerido para métodos init e destroy -
<?xml version = "1.0" encoding = "UTF-8"?>
<beans xmlns = "http://www.springframework.org/schema/beans"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation = "http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<bean id = "helloWorld" class = "com.tutorialspoint.HelloWorld" init-method = "init"
destroy-method = "destroy">
<property name = "message" value = "Hello World!"/>
</bean>
</beans>
Assim que terminar de criar os arquivos de configuração de código-fonte e bean, vamos executar o aplicativo. Se tudo estiver bem com seu aplicativo, ele imprimirá a seguinte mensagem -
Bean is going through init.
Your Message : Hello World!
Bean will destroy now.
Métodos padrão de inicialização e destruição
Se você tiver muitos beans com métodos de inicialização e / ou destruição com o mesmo nome, você não precisa declarar init-method e destroy-methodem cada feijão individual. Em vez disso, a estrutura fornece a flexibilidade para configurar tal situação usandodefault-init-method e default-destroy-method atributos no elemento <beans> como segue -
<beans xmlns = "http://www.springframework.org/schema/beans"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation = "http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"
default-init-method = "init"
default-destroy-method = "destroy">
<bean id = "..." class = "...">
<!-- collaborators and configuration for this bean go here -->
</bean>
</beans>