我的应用程序未向Consul注册服务。我跟踪了源代码,该问题似乎没有调用AbstractAutoServiceRegistration的bind方法。如果我正确理解,则绑定逻辑位于org.springframework.cloud.consul.serviceregistry.ConsulAutoServiceRegistrationAutoConfiguration中,它定义了一个类型为ConsulAutoServiceRegistration的bean。 ConsulAutoServiceRegistration类是从AbstractAutoServiceRegistration扩展的。
@Bean
@ConditionalOnMissingBean
public ConsulAutoServiceRegistration consulAutoServiceRegistration(
ConsulServiceRegistry registry,
AutoServiceRegistrationProperties autoServiceRegistrationProperties,
ConsulDiscoveryProperties properties,
ConsulAutoRegistration consulRegistration) {
return new ConsulAutoServiceRegistration(registry,
autoServiceRegistrationProperties, properties, consulRegistration);
}
然后@EventListener(WebServerInitializedEvent.class)注释了AbstractAutoServiceRegistration中名为bind的方法。
@EventListener(WebServerInitializedEvent.class)
public void bind(WebServerInitializedEvent event) {
ApplicationContext context = event.getApplicationContext();
if (context instanceof ConfigurableWebServerApplicationContext) {
if ("management".equals(
((ConfigurableWebServerApplicationContext) context).getServerNamespace())) {
return;
}
}
this.port.compareAndSet(0, event.getWebServer().getPort());
this.start();
}
但是我发现此方法未在侦听器中注册,因为AbstractAutoServiceRegistration的软件包以“ org.springframework”开头。因此在EventListenerMethodProcessor中已将其忽略。
private void processBean(final String beanName, final Class<?> targetType) {
if (!this.nonAnnotatedClasses.contains(targetType) && !isSpringContainerClass(targetType)) {
...
}
private static boolean isSpringContainerClass(Class<?> clazz) {
return (clazz.getName().startsWith("org.springframework.") &&
!AnnotatedElementUtils.isAnnotated(ClassUtils.getUserClass(clazz), Component.class));
}
出什么问题了?而我该如何解决?