【问题标题】:How to call @PreDestroy for a bean declared with @Bean annotation如何为使用 @Bean 注释声明的 bean 调用 @PreDestroy
【发布时间】:2017-10-26 16:29:30
【问题描述】:

我有一个用注解@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”的销毁方法 如何解决这个问题?

【问题讨论】:

    标签: java spring spring-mvc annotations predestroy


    【解决方案1】:

    从其他评论扩展 - 这是一个包装示例:

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

    【讨论】:

      【解决方案2】:

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

      当您使用 Set 时,您没有机会将 destroyMethod 添加到 Set.class 中。所以你必须wrap它(如Andrew proposed)。

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

      【讨论】:

      • containerSet 需要被包装/扩展,因此可以指定 destroyMethod。或者,包装/扩展的 bean 可以实现 DisposableBean
      • @AndrewS 我该怎么做?包装/扩展?
      猜你喜欢
      • 2011-07-01
      • 1970-01-01
      • 2015-03-19
      • 1970-01-01
      • 1970-01-01
      • 2015-11-30
      • 1970-01-01
      • 2015-04-03
      • 1970-01-01
      相关资源
      最近更新 更多