如何为使用@Bean注释声明的bean调用@PreDestroy

时间:2017-10-26 16:29:31

标签: java spring spring-mvc annotations predestroy

我有一个用注释@Bean

声明的bean
@Bean
public Set<DefaultMessageListenerContainer> beans() {
    Set<DefaultMessageListenerContainer>  containerSet = new HashSet<DefaultMessageListenerContainer>();

    return containerSet;
}

我在销毁bean时要执行一些操作。我怎样才能做到这一点?

我知道我可以在使用@Component注释的类中的方法上使用@predestroy注释,但不知道在声明@Bean注释时我该怎么做。

编辑:

@Bean(destroyMethod="stopContainers")
   public Set<DefaultMessageListenerContainer> containers() {
        Set<DefaultMessageListenerContainer>  containerSet = new HashSet<DefaultMessageListenerContainer>();

        return containerSet;
    }

   public void stopContainers(){
        Set<DefaultMessageListenerContainer>  containerSet = containers();
        ......
        }

    }

但是我收到一个错误,无法在名为'containers'的bean上找到名为'stopContainers'的destroy方法     如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

通常,您可以为destroyMethod注释指定@Bean参数。并在bean类中定义此方法的特定实现。

当您使用Set时,您无法将destroyMethod添加到Set.class。所以你必须wrap它(Andrew proposed)。

实际上,我根本不喜欢这种方法。似乎更可取的不使用Set of beans并找到另一种解决方法(通过逐个销毁它们)。在我看来,您可以实现一个单独的管理器类来对您的容器执行操作。

答案 1 :(得分:0)

扩展其他评论 - 这是一个包装的例子:

@Bean(destroyMethod="stopContainers")
public StoppableSetWrapper<DefaultMessageListenerContainer> containers() {
    StoppableSetWrapper<DefaultMessageListenerContainer> wrapper = new StoppableSetWrapper<>();
    return wrapper;
}

public class StoppableSetWrapper<T> {
    private final Set<T> containers = new HashSet<T>();

    public boolean add(T container) {
        return containers.add(container);
    }

    // other Set related methods as needed...

    public void stopContainers() {
        // clean up...
    }
}

由于bean类型已更改,因此需要更新使用注入/自动装配的bean的代码。