美文网首页
spring-boot配置类中new的类里面@Autowired

spring-boot配置类中new的类里面@Autowired

作者: 刘振宁的博客 | 来源:发表于2023-04-02 16:21 被阅读0次

巨大的建筑,总是由一木一石叠起来的,我们何妨做做这一木一石呢?我时常做些零碎事,就是为此。

这是对的,但是我没有说过这句话! —— 鲁迅

老项目是使用xml进行的配置,如下:

    <bean id="kanBanSocketListerner" class="com.enn.zhwl.api.consumer.KanBanSocketConsumer"/>

而在KanBanSocketConsumer中有属性的注入

public class KanBanSocketConsumer implements MessageListener<Integer, String> {
  private static final Logger logger = LoggerFactory.getLogger(KanBanSocketConsumer.class);

  @Autowired
  private RedisBaseService redisBaseService;
  @Autowired
  private MyWebSocketService myWebSocketService;
  @Override
  public void onMessage(ConsumerRecord<Integer, String> data) {
    logger.debug("kabanSoketConsumer receive info");
  }
}

注意:这个类里面在class上面是没有@Component或者@Service等注解的,但是在属性中却有@Autowired注解。

没有@Component等注解,那spring本身是不会去扫描该类,当然也不会去注入属性,但是之前为什么是可以的呢,因为在spring的配置文件中进行的声明。见上面的xml。

现在老项目升级spring-boot。这个 KanBanSocketConsumer 不用在xml中进行声明了,观察了一下,这个类本身没有被用到,而是在生成 KafkaMessageListenerContainer 这个类的时候,用到了一次,我就想是否不需要声明,直接在声明 KafkaMessageListenerContainer的时候,把 KanBanSocketConsumer new出来即可,如下:

  @Bean(value = "webSoketMessageListenerContainer", initMethod = "doStart")
  public KafkaMessageListenerContainer webSoketMessageListenerContainer(@Qualifier("kanBanSocketFactory") MyKafkaConsumerFactory consumerFactory) {
    KanBanSocketConsumer kanBanSocketConsumer = new KanBanSocketConsumer();
    ContainerProperties containerProperties = new ContainerProperties(kanbanTopic);
    containerProperties.setMessageListener(kanBanSocketConsumer);
    KafkaMessageListenerContainer kafkaMessageListenerContainer = new KafkaMessageListenerContainer(consumerFactory, containerProperties);
    return kafkaMessageListenerContainer;
  }

但是运行的时候,报错了,就是上面提到的错误,@Autowired失效,到用到@Autowired的service的时候,报了空指针.

所以需要在声明 KafkaMessageListenerContainer的时候,虽然 KanBanSocketConsumer类其他地方并没有被使用到,但是因为这个类中使用了@Autowired等注解,该类就需要也被声明一下。这样spring才知道去注入相应的属性.如下:

  @Bean
  public KanBanSocketConsumer kanBanSocketConsumer() {
    return new KanBanSocketConsumer();
  }

  @Bean(value = "webSoketMessageListenerContainer", initMethod = "doStart")
  public KafkaMessageListenerContainer webSoketMessageListenerContainer(@Qualifier("kanBanSocketFactory") MyKafkaConsumerFactory consumerFactory,
                                                                        @Autowired KanBanSocketConsumer kanBanSocketConsumer) {
    //KanBanSocketConsumer kanBanSocketConsumer = new KanBanSocketConsumer();
    ContainerProperties containerProperties = new ContainerProperties(kanbanTopic);
    containerProperties.setMessageListener(kanBanSocketConsumer);
    KafkaMessageListenerContainer kafkaMessageListenerContainer = new KafkaMessageListenerContainer(consumerFactory, containerProperties);
    return kafkaMessageListenerContainer;
  }

重新启动,不再报该错误.

相关文章

网友评论

      本文标题:spring-boot配置类中new的类里面@Autowired

      本文链接:https://www.haomeiwen.com/subject/iserddtx.html