1

我有一个用注释@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();
        ......
        }

    }

但是我收到一个错误,在名称为“容器”的 bean 上找不到名为“stopContainers”的销毁方法如何解决这个问题?

4

2 回答 2

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 的代码。

于 2017-10-26T19:04:06.063 回答
0

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

当您使用 Set 时,您没有机会添加destroyMethodSet.class. 所以你必须把它包装起来(正如Andrew 提议的那样)。

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

于 2017-10-26T17:11:49.493 回答