我有一个用注释@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方法 如何解决这个问题?
答案 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的代码。