【问题标题】:Keeping a reference to a bean inside @Configuration在 @Configuration 中保留对 bean 的引用
【发布时间】:2015-09-24 02:17:37
【问题描述】:

我可以在@Configuration 类中保留对公开 bean 的引用,以便以后可以在同一个 bean 上执行操作吗?例如:

@Configuration
class MyBeanConfiguration extends DisposableBean {
  private MyBean myBean; // Correct?

  @Bean
  public MyBean myBean() {
    return (this.myBean = MyBeanFactory.newMyBean());
  }

  @Override
  public void destroy() throws Exception {
    doSomethingWith(myBean);
  }
}

我会遇到这种方法的任何问题吗?

【问题讨论】:

    标签: java spring spring-mvc dependency-injection spring-bean


    【解决方案1】:

    您可能会遇到麻烦。可能您不希望您的Configuration 类扩展DisposableBean,而是让MyBean 扩展它并在MyBean 中实现destroy 方法。

    或者,您可以为MyBean 配置一个自定义销毁方法,如下所示:@Bean(destroyMethod='mydestroy'),这样MyBean 类就不会对 Spring 有硬依赖。

    第三种选择是创建一个侦听器,然后将 ApplicationListener<ContextClosed> 和 autowire MyBean 实现到该类中并在那里对其进行处理。

    【讨论】:

    • 他可能会遇到什么麻烦?
    • @meriton -- 那么destroy 方法何时会在他的原始代码示例中被调用?可能仅在应用程序上下文被销毁时,而不是在Bean 本身被销毁时。另外,Configuration 类应该用作 声明 bean 的类,而不是我认为的 bean 本身。
    【解决方案2】:

    我有时会毫无问题地执行以下操作:

    @Configuration
    class MyBeanConfiguration implements DisposableBean {
    
      private @Autowired MyBean myBean;
    
      @Bean
      public MyBean myBean() {
        return MyBeanFactory.newMyBean();
      }
    
      @Override
      public void destroy() throws Exception {
        doSomethingWith(myBean);
      }
    
    }
    

    注意:我不知道这是否是一个不好的方法,我只在我无法控制MyBean 类并且无法在那里实现DisposeableBean 时这样做。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-20
      • 2020-06-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多