springboot由於bean加載順序導致的問題


先記錄現象:

dubbo整合zipkin時,我的配置文件是這樣的

@Bean("okHttpSender")
    public OkHttpSenderFactoryBean okHttpSender(){
        OkHttpSenderFactoryBean okHttpSenderFactoryBean = new OkHttpSenderFactoryBean();
        //zipkin服務端
        okHttpSenderFactoryBean.setEndpoint("http://localhost:9411/api/v2/spans");
        return okHttpSenderFactoryBean;
    }

    @Bean
    public AsyncReporterFactoryBean reporter(@Qualifier("okHttpSender")OkHttpSender sender){
        AsyncReporterFactoryBean asyncReporterFactoryBean = new AsyncReporterFactoryBean();
        asyncReporterFactoryBean.setSender(sender);
        asyncReporterFactoryBean.setCloseTimeout(1000);
        return asyncReporterFactoryBean;
    }

    @Bean("tracing")
    public TracingFactoryBean tracingFactoryBean(@Qualifier("reporter") Reporter reporter) throws Exception {
        TracingFactoryBean tracingFactoryBean = new TracingFactoryBean();
        tracingFactoryBean.setLocalServiceName("rcinvestTracing");
        tracingFactoryBean.setSpanReporter(reporter);
        CurrentTraceContextFactoryBean currentTraceContextFactoryBean = new CurrentTraceContextFactoryBean();
        CurrentTraceContext.ScopeDecorator scopeDecorator = MDCScopeDecorator.create();
        currentTraceContextFactoryBean.setScopeDecorators(Arrays.asList(scopeDecorator));
        tracingFactoryBean.setCurrentTraceContext(currentTraceContextFactoryBean.getObject());
        return tracingFactoryBean;
    }

結果提示自動注入沒有發現reporter

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'zipkin2.reporter.Reporter<?>' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Qualifier(value=reporter)}

然后我改了一下

 public TracingFactoryBean tracingFactoryBean(@Qualifier("reporter") Reporter reporter) throws Exception
改為:
 public TracingFactoryBean tracingFactoryBean(@Qualifier("reporter") AsyncReporterFactoryBean reporter) throws Exception

又提示循環注入:

Requested bean is currently in creation: Is there an unresolvable circular reference?

雖然通過源碼發現了導致問題的源碼,但是我也不知道具體是什么原因導致的問題

最后通過修改bean加載的順序,上述倆個問題都解決了

@Bean("tracing")
    public TracingFactoryBean tracingFactoryBean(@Qualifier("reporter") AsyncReporter reporter) throws Exception {
        TracingFactoryBean tracingFactoryBean = new TracingFactoryBean();
        tracingFactoryBean.setLocalServiceName("rcinvestTracing");
        tracingFactoryBean.setSpanReporter(reporter);
        CurrentTraceContextFactoryBean currentTraceContextFactoryBean = new CurrentTraceContextFactoryBean();
        CurrentTraceContext.ScopeDecorator scopeDecorator = MDCScopeDecorator.create();
        currentTraceContextFactoryBean.setScopeDecorators(Arrays.asList(scopeDecorator));
        tracingFactoryBean.setCurrentTraceContext(currentTraceContextFactoryBean.getObject());
        return tracingFactoryBean;
    }

    @Bean
    public AsyncReporterFactoryBean reporter(@Qualifier("okHttpSender")OkHttpSender sender){
        AsyncReporterFactoryBean asyncReporterFactoryBean = new AsyncReporterFactoryBean();
        asyncReporterFactoryBean.setSender(sender);
        asyncReporterFactoryBean.setCloseTimeout(1000);
        return asyncReporterFactoryBean;
    }

    @Bean("okHttpSender")
    public OkHttpSenderFactoryBean okHttpSender(){
        OkHttpSenderFactoryBean okHttpSenderFactoryBean = new OkHttpSenderFactoryBean();
        //zipkin服務端
        okHttpSenderFactoryBean.setEndpoint("http://localhost:9411/api/v2/spans");
        return okHttpSenderFactoryBean;
    }

猜測:父級bean放在上面加載,需要注入的bean,放在下面加載是不是就能就覺問題


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM