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>