【问题标题】:Calling A Method After all SpringBeans and ApplicationContext have been initialized在所有 SpringBeans 和 ApplicationContext 都被初始化之后调用方法
【发布时间】:2011-03-25 11:43:13
【问题描述】:

我在一个复杂的 java 程序中有一个方法,需要在 web ApplicationContext 和 SpringBeans 初始化后立即调用。

我试过玩弄 <bean id="..." class="..." init-method="initialize"> 但是这个方法会调用applicationContext.get().getBean(beanId); 方法。

我想知道是否有人知道如何做到这一点。

谢谢。

【问题讨论】:

    标签: java spring


    【解决方案1】:

    您可以为此目的使用ApplicationListener<E>。在泛型类型参数中,您可以使用 ContextRefreshedEvent 来满足您的要求。请注意,在重写方法onApplicationEvent 中,您可以执行任何操作,例如自动装配 bean 或将其用作服务或从此处调用另一个服务。请注意,它与@PostConstructor 有何不同

    public class MyContextRefreshListener implements ApplicationListener<ContextRefreshedEvent> {
    
        @Override
        public void onApplicationEvent(ContextRefreshedEvent event) {
            //do what you want
        }
    }
    

    【讨论】:

      【解决方案2】:

      从 Spring 4.2 开始,您可以使用注释将事件侦听器附加到 Springs 生命周期事件(和您自己的)。只需将@EventListener 添加到方法中并将事件类型作为第一个(也是唯一一个)参数包含在内,Spring 会自动检测到它并将其连接起来。

      https://spring.io/blog/2015/02/11/better-application-events-in-spring-framework-4-2

      @Component
      public class MyListener {
      
          @EventListener
          public void handleContextRefresh(ContextRefreshedEvent event) {
              ...
          }
      }
      

      【讨论】:

      • 比创建 bean 更容易
      • 最佳解决方案之一
      【解决方案3】:

      您可以通过ApplicationListener 捕获ContextRefreshedEvent

      【讨论】:

        【解决方案4】:

        您可以添加一个自定义 BeanFactoryPostProcessor,它可以访问相关 bean。

        【讨论】:

        • BeanFactoryPostProcessor 不执行 before 所有 bean 都被初始化了吗?
        • 是的,BeanFactoryPostProcessor所有 bean 都已初始化之前。
        猜你喜欢
        • 2014-04-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-09
        • 2017-07-18
        • 1970-01-01
        • 1970-01-01
        • 2015-10-03
        相关资源
        最近更新 更多