【问题标题】:Init BeanPostProcessor at a later point稍后初始化 BeanPostProcessor
【发布时间】:2021-11-02 05:07:08
【问题描述】:

我正在为应用程序开发一个外部组件,其中包含将 Jersey 客户端过滤器注入延迟加载客户端的功能。我已经实现了一个 BeanPostProcessor 来做这个:

public class ClientFilterInjector implements BeanPostProcessor, Ordered {


    private ClientTraceInterceptor clientTraceInterceptor;

    public ClientFilterInjector(ClientTraceInterceptor clientTraceInterceptor) {
        this.clientTraceInterceptor = clientTraceInterceptor;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) {
        if(bean instanceof JerseyWebTarget) {
            ((JerseyWebTarget) bean).register(clientTraceInterceptor);
        }
        return bean;
    }

    @Override
    public int getOrder() {
        return Ordered.LOWEST_PRECEDENCE;
    }
}

但是,Spring Boot 显然会自动扫描 BeanPostProcessor 实现,无论它们是否被注释或具有 bean 创建方法。因此,它搞砸了在应用程序中创建 bean 的顺序。有没有办法推迟 BeanPostProcessor 的实例化?

【问题讨论】:

    标签: java spring spring-boot


    【解决方案1】:

    你有没有尝试添加惰性注解?

    import org.springframework.context.annotation.Lazy;
    

    通过使用这个注解,它会影响第一次调用,但以后会完全一样。

    public class ClientFilterInjector implements BeanPostProcessor, Ordered {
    
    
        private ClientTraceInterceptor clientTraceInterceptor;
    
        public ClientFilterInjector(ClientTraceInterceptor clientTraceInterceptor) {
            this.clientTraceInterceptor = clientTraceInterceptor;
        }
    
        @Override
        public Object postProcessAfterInitialization(@Lazy Object bean, String beanName) {
            if(bean instanceof JerseyWebTarget) {
                ((JerseyWebTarget) bean).register(clientTraceInterceptor);
            }
            return bean;
        }
    
        @Override
        public int getOrder() {
            return Ordered.LOWEST_PRECEDENCE;
        }
    }
    

    【讨论】:

    • 也许我不清楚,但我遇到的主要问题是 BeanPostProcessor 被过早地实例化并搞砸了 bean 创建和后处理顺序。我只希望在应用程序实例化后可以在客户端延迟加载时使用它。
    【解决方案2】:

    看起来如果您以匿名类的形式实现BeanProcessor,它将不会在 Spring Boot 应用程序初始化中自动扫描,您可以随时通过将其添加到应用程序上下文。

    ((ConfigurableApplicationContext) appContext).getBeanFactory().addBeanPostProcessor(new BeanPostProcessor() {
        @Override
        public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
            if(bean instanceof WebTarget) {
                ((WebTarget) bean).register(instance);
            }
            return bean;
        }
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-13
      • 1970-01-01
      • 2019-08-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多