Почему метод PreDestroy не работает

У меня есть базовый весенний проект с простой конфигурацией. Это боб

public class GreetingServiceImpl implements GreetingService {
    private final Log log = LogFactory.getLog(getClass());

    @Override
    public String hello() {
        return "Hello";
    }

    private void init() {
        log.info("GreetingServiceImpl INIT");
    }

    private void destroy() {
        log.info("GreetingServiceImpl DESTROY");
    }
}

конфигурация:

<bean id="greetingService"
      class="com.example.hello.GreetingServiceImpl"
      init-method="init"
      destroy-method="destroy">

И это мой тестовый код:

@Test
public void greeting() {
    ConfigurableApplicationContext context = new ClassPathXmlApplicationContext("applicationConfig.xml");
    GreetingService greetingService = context.getBean(GreetingService.class);

    Assert.assertEquals("Hello", greetingService.hello());
    context.close();
}

Когда я запускаю этот код, я не вижу метода уничтожения в журналах, а также закрытия контекста.

org.springframework.context.support.AbstractApplicationContext prepareRefresh
Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@2be94b0f
org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
Loading XML bean definitions from class path resource [applicationConfig.xml]
com.example.hello.GreetingServiceImpl init
GreetingServiceImpl INIT

Process finished with exit code 0

Я пытался позвонить registerShutdownHook а также refresh но результат был тот же.

1 ответ

Не совсем уверен, не проверял, но пытались ли вы сделать ваш метод уничтожения публичным?

Для тестирования я бы предложил вам использовать аннотации весеннего тестирования: https://docs.spring.io/spring/docs/current/spring-framework-reference/testing.html

а затем внедрить ваш прикладной контекст или внедрить соответствующий компонент

Другие вопросы по тегам