巨大的建筑,總是由一木一石疊起來的,我們何妨做做這一木一石呢?我時常做些零碎事,就是為此。
這是對的,但是我沒有說過這句話! —— 魯迅
老項目是使用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;
}
重新啟動,不再報該錯誤.