Java spring从非bean类访问代理bean

Java spring从非bean类访问代理bean,java,spring,spring-boot,metrics,codahale-metrics,Java,Spring,Spring Boot,Metrics,Codahale Metrics,我有一个Springbean,它在其方法上使用dropwizard metrics注释来度量一些指标(请参见#parse method): 结果,我看到Consumer bean被代理,但ConsumerReventShandler包含对普通bean的引用,因为当它通过“new ConsumerReventShandler(..)在Consumer的@PostConstruct方法中创建时,Consumer bean还没有被代理,我假设@PostConstruct在代理之前被调用 我看到的唯一解

我有一个Springbean,它在其方法上使用dropwizard metrics注释来度量一些指标(请参见#parse method):

结果,我看到Consumer bean被代理,但ConsumerReventShandler包含对普通bean的引用,因为当它通过“new ConsumerReventShandler(..)在Consumer的@PostConstruct方法中创建时,Consumer bean还没有被代理,我假设@PostConstruct在代理之前被调用

我看到的唯一解决方法是通过ApplicationContext#getBean每次在#run方法中获取消费者bean ref,而不是将ref存储在ConsumerReventShandler类变量中。
还有其他解决方案吗?

只需在非spring类上创建一个静态

public class ConsumerEventsHandler implements Runnable {

private static Consumer consumer;
private List<String> topics;
protected final KafkaConsumer<String, String> kafkaConsumer;

public ConsumerEventsHandler(List<String> topics) {
    this.topics = topics;
    this.kafkaConsumer = new KafkaConsumer<>();
}

public static setConsumer(Consumer consumer) {
    ConsumerEventsHandler.consumer = consumer;
}

嗯,这是一个可行的解决方案,但我不确定从设计的角度在配置代码中设置bean引用。也许只是使用手动指标声明?请评论this@MeetJoeBlack这不是控制反转的全部要点吗?你把配置中的所有东西都连接起来了?我觉得很好。
public class ConsumerEventsHandler implements Runnable {

private Consumer consumer;
private List<String> topics;
protected final KafkaConsumer<String, String> kafkaConsumer;

public ConsumerEventsHandler(List<String> topics, Consumer consumer) {
    this.topics = topics;
    this.consumer = consumer;
    this.kafkaConsumer = new KafkaConsumer<>();
}

@Override
public void run() {
    try {
        consumer.subscribe(topics);
        while (true) {
            ConsumerRecords<String, String> records = consumer.poll(Long.MAX_VALUE);

            for (ConsumerRecord<String, String> record : records) {
                consumer.parse(record);
            }
        }
    } finally {
        consumer.close();
    }
}

}
@Configuration
@EnableMetrics(proxyTargetClass = true)
@ComponentScan(basePackages = "com.inq")
public class SsvpApiMetricsConfig extends MetricsConfigurerAdapter {
  @Resource
  private MetricRegistry registry;

  @PostConstruct()
  public void init() {
    configureReporters(registry);
  }

  @Override
  public void configureReporters(MetricRegistry metricRegistry) {

    registerReporter(JmxReporter.forRegistry(metricRegistry).
       inDomain("com.inq.metrics").build()).start();
  }
}
public class ConsumerEventsHandler implements Runnable {

private static Consumer consumer;
private List<String> topics;
protected final KafkaConsumer<String, String> kafkaConsumer;

public ConsumerEventsHandler(List<String> topics) {
    this.topics = topics;
    this.kafkaConsumer = new KafkaConsumer<>();
}

public static setConsumer(Consumer consumer) {
    ConsumerEventsHandler.consumer = consumer;
}
  @PostConstruct()
  public void init() {
    configureReporters(registry);
    ConsumerEventsHandler.setConsumer(consumer);
  }