web-dev-qa-db-fra.com

Noyau de printemps. Méthode de destruction @Bean par défaut

J'ai mon propre haricot:

@Bean
public MyBean myBean(){...

après la documentation du printemps pour publier ses propres ressources, je devrais spécifier destroyMethod. Je n'ai trouvé aucune méthode de destruction par défaut appelée par spring au cas où destroyMethod ne soit pas spécifié directement.

J'ai utilisé

@Bean(destroyMethod = "close")
public MyBean myBean(){...

mais pensez à la possibilité de ne pas spécifier directement la méthode destroy si elle a une valeur par défaut.


Est-ce que spring essaie par défaut quelque chose comme destroy, close, release? Si spring essaie certaines méthodes par défaut pour libérer des ressources - lesquelles?

8
Sergii

Comme indiqué dans Bean.destroyMethod :

Pour plus de commodité, le conteneur tentera de déduire un Méthode destroy contre un objet renvoyé par la méthode @Bean. Pour Par exemple, étant donné une méthode @Bean renvoyant un DBCP Apache Commons BasicDataSource, le conteneur notera la méthode close() disponible sur cet objet et l'enregistrer automatiquement en tant que destroyMethod. Cette 'inférence de méthode de destruction' est actuellement limitée pour détecter uniquement les méthodes publiques, sans argument, nommées 'close' ou 'shutdown'.

En d'autres termes, si vous ne spécifiez pas destroyMethod, mais que le bean a une méthode publique close() ou shutdown(), il sera automatiquement utilisé comme méthode de destruction.

Pour désactiver cette inférence, utilisez @Bean(destroyMethod = "").

19
Mark Rotteveel

L’interface org.springframework.beans.factory.DisposableBean spécifie une seule méthode -

void destroy() throws Exception;

Il suffit de le mettre en œuvre -

public class ExampleBean implements DisposableBean {
   public void destroy() {
      // do some destruction work
   }
}

pour une configuration basée sur XML 

<bean id = "exampleBean" class = "examples.ExampleBean" destroy-method = "destroy"/>

et dans le haricot

public class ExampleBean {
   public void destroy() {
      // do some destruction work
   }
}

ou annoter avec @PreDestroy

6
Ofer Skulsky

Vous pouvez implémenter une méthode qui sera exécutée avant de la détruire et l'annoter avec @PreDestroy

@PreDestroy
public void methodName() {
    //Your code..
}
5
Krishna Kuntala

Vous pouvez étendre DisposableBeanAdapter class. L’une des méthodes fournies est la méthode destroy appelée par Spring. De cette façon, vous n’avez pas à fournir d’implémentation alors que cela est nécessaire lorsque vous utilisez l’interface DisposableBean.

2
Dmitry Senkovich