代码之家  ›  专栏  ›  技术社区  ›  tryingHard

云侦探从Springboot 1.5改为2.x

  •  0
  • tryingHard  · 技术社区  · 7 年前

    早些时候,这段代码运行良好:

    @Component
    @RequiredArgsConstructor(onConstructor = @__(@Autowired))
    class CustomTraceableExecutorServiceImpl implements ExecutorServiceProvider {
    
        @Qualifier(value = "defaultExecutorService")
        private final ExecutorService executorService;
        @Qualifier(value = "scheduledTimeoutExecutorService")
        private final ScheduledExecutorService scheduledExecutorService;
        private final Tracer tracer;
        private final SpanNamer spanNamer;
    
        @Override
        public ExecutorService get() {
            return new TraceableExecutorService(executorService, tracer, new TraceKeys(), spanNamer);
        }
    
        @Override
        public ScheduledExecutorService getScheduled() {
            return new TraceableScheduledExecutorService(scheduledExecutorService, tracer, new TraceKeys(), spanNamer);
        }
    }
    

    但现在 TraceableExecutorService 构造函数接受 TraceableExecutorService(BeanFactory beanFactory, final ExecutorService delegate) 所以我需要把代码改成:

    @Component
    @RequiredArgsConstructor(onConstructor = @__(@Autowired))
    class CustomTraceableExecutorServiceImpl implements ExecutorServiceProvider {
    
        @Qualifier(value = "defaultExecutorService")
        private final ExecutorService executorService;
        @Qualifier(value = "scheduledTimeoutExecutorService")
        private final ScheduledExecutorService scheduledExecutorService;
        //@Qualifier(value = "defaultBeanFactory")
        @Autowired
        private final BeanFactory beanFactory;
        //@Qualifier(value = "scheduledBeanFactory")
        @Autowired
        private final BeanFactory scheduledBeanFactory;
    
        @Override
        public ExecutorService get() {
            return new TraceableExecutorService(beanFactory, executorService);
        }
    
        @Override
        public ScheduledExecutorService getScheduled() {
            return new TraceableScheduledExecutorService(scheduledBeanFactory, scheduledExecutorService);
        }
    }
    

    我的问题是 BeanFactory 我不知道怎么创造它? 我没有 xml 我可以用的文件。

    我在这里读到: what are the different ways of creating beanfactory object? 我们可以创造这个 豆制品厂 通过:

    1. BeanFactory fac=new ClassPathXmlApplicationContext("Spring-Config.xml"); 
    
    2. Resource res=new Classpathresource("Spring-Config.xml");
        BeanFactory fac=new XmlBeanFactory(res);
    

    如果我没有任何 XML 文件?我只希望我的代码与旧版本(springboot 1.5版本)兼容。

    1 回复  |  直到 7 年前
        1
  •  1
  •   Marcin Grzejszczak    7 年前

    春天创造 BeanFactory 为你。如果您使用的是spring上下文,那么您可以将其从框中取出。但是,如果出于某种原因,您没有使用spring,而是使用了sleuth(我不知道您为什么要这样做),您可以检查我们是否使用 豆制品厂 找回豆子。 豆制品厂 是一个接口,所以您可以做的是重写 getBean 方法来检索此类bean,如:

    Tracing tracing() {
            if (this.tracing == null && this.beanFactory != null) {
                this.tracing = this.beanFactory.getBean(Tracing.class);
            }
            return this.tracing;
        }
    
        SpanNamer spanNamer() {
            if (this.spanNamer == null && this.beanFactory != null) {
                this.spanNamer = this.beanFactory.getBean(SpanNamer.class);
            }
            return this.spanNamer;
        }
    

    你需要嘲笑 豆制品厂 返回 this.beanFactory.getBean(Tracing.class) this.beanFactory.getBean(SpanNamer.class)

    但是只要使用spring,你就可以把所有东西都从盒子里拿出来。坦白说,我真的不明白你在做什么。