<番外篇>spring-cloud Hoxton.SR2 eureka客户端自动装配部分源码解析,以及@EnableEurekaClient注解详解

本文深入解析Spring Cloud Hoxton.SR2版本中Eureka客户端的自动装配过程,详细介绍了各自动装配配置类的作用及条件,并探讨了@EnableEurekaClient注解的实际效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<番外篇>spring-cloud Hoxton.SR2 eureka客户端自动装配部分源码解析,以及@EnableEurekaClient注解详解


找到自动装配的主入口;

要使用eureka的客户端,只需要引入spring-cloud-starter-netflix-eureka-client的包就可以了;

<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

可以看到,主要依赖spring-cloud-netflix-eureka-client;找到spring-cloud-netflix-eureka-client包的spring.factories文件;

查看文件内容

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.cloud.netflix.eureka.config.EurekaClientConfigServerAutoConfiguration,\
org.springframework.cloud.netflix.eureka.config.EurekaDiscoveryClientConfigServiceAutoConfiguration,\
org.springframework.cloud.netflix.eureka.EurekaClientAutoConfiguration,\
org.springframework.cloud.netflix.ribbon.eureka.RibbonEurekaAutoConfiguration,\
org.springframework.cloud.netflix.eureka.EurekaDiscoveryClientConfiguration

org.springframework.cloud.bootstrap.BootstrapConfiguration=\
org.springframework.cloud.netflix.eureka.config.EurekaDiscoveryClientConfigServiceBootstrapConfiguration


1、自动装配的配置类,我们一个一个的简单看一下

EurekaClientConfigServerAutoConfiguration类,在eureka客户端中,没有ConfigServerProperties.class;这个不生效;

@Configuration
@EnableConfigurationProperties
@ConditionalOnClass({ EurekaInstanceConfigBean.class, EurekaClient.class,
		ConfigServerProperties.class })
public class EurekaClientConfigServerAutoConfiguration {

EurekaDiscoveryClientConfigServiceAutoConfiguration类,我们yml配置文件中,没有指定spring.cloud.config.discovery.enabled属性,这个自动装配不生效

@ConditionalOnBean({ EurekaDiscoveryClientConfiguration.class })
@ConditionalOnProperty(value = "spring.cloud.config.discovery.enabled", matchIfMissing = false)
public class EurekaDiscoveryClientConfigServiceAutoConfiguration {

EurekaClientAutoConfiguration类,看名字就知道,这个就是eureka客户端自动装配的主要配置类了

@Configuration
@EnableConfigurationProperties
@ConditionalOnClass(EurekaClientConfig.class)
@Import(DiscoveryClientOptionalArgsConfiguration.class)
@ConditionalOnBean(EurekaDiscoveryClientConfiguration.Marker.class)
@ConditionalOnProperty(value = "eureka.client.enabled", matchIfMissing = true)
@ConditionalOnDiscoveryEnabled
@AutoConfigureBefore({ NoopDiscoveryClientAutoConfiguration.class,
		CommonsClientAutoConfiguration.class, ServiceRegistryAutoConfiguration.class })
@AutoConfigureAfter(name = {
		"org.springframework.cloud.autoconfigure.RefreshAutoConfiguration",
		"org.springframework.cloud.netflix.eureka.EurekaDiscoveryClientConfiguration",
		"org.springframework.cloud.client.serviceregistry.AutoServiceRegistrationAutoConfiguration" })
public class EurekaClientAutoConfiguration {

要想这个类,可以被自动装配,类上的生效条件中,只有@ConditionalOnBean(EurekaDiscoveryClientConfiguration.Marker.class)这个内部类Marker的实例被创建的时候,才会生效;其他的条件,都是成功的;而EurekaDiscoveryClientConfiguration类,spring.factories文件中,自动装配的类;

EurekaClientAutoConfiguration类中,装配了什么组件,大家有兴趣的自己看一看吧,另外装配了什么组件,单独的看,也可能并没有什么意义,很多的东西,要结合功能的效果,以及业务上的东西,结合上下文看;去系统的看源码;

RibbonEurekaAutoConfiguration类,eureka客户端,调用服务端的时候,也是使用的ribbon的服务

@Configuration
@EnableConfigurationProperties
@ConditionalOnRibbonAndEurekaEnabled
@AutoConfigureAfter(RibbonAutoConfiguration.class)
@RibbonClients(defaultConfiguration = EurekaRibbonClientConfiguration.class)
public class RibbonEurekaAutoConfiguration {

}

EurekaDiscoveryClientConfiguration类;

上面也说了,注入了内部类Marker的实例,让eureka的主配置类生效;其他的组件,有兴趣的可以自己看下(开启健康检查功能eureka.client.healthcheck.enabled=true;注入EurekaClientConfigurationRefresher组件,实现ApplicationListener接口,是个监听组件);

@Configuration
@EnableConfigurationProperties
@ConditionalOnClass(EurekaClientConfig.class)
@ConditionalOnProperty(value = "eureka.client.enabled", matchIfMissing = true)
@ConditionalOnDiscoveryEnabled
public class EurekaDiscoveryClientConfiguration {

	@Bean
	public Marker eurekaDiscoverClientMarker() {
		return new Marker();
	}

2、主类的注解@EnableEurekaClient

看注解的内容,就是一个普通的注解,没有导入其他的组件或者实例,到spring的容器中

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface EnableEurekaClient {

}

从上面的eureka的客户端自动装配的代码中,也没有发现,哪个装配类,再自动装配的时候,需要有@EnableEurekaClient注解为前提;所以说,这个注解,是个假注解?不标注在主启动类上,也能把服务注册到eureka的服务端中?

测试一下:

1、启动eureka的服务端的项目badger-spring-cloud-eureka

2、注释掉主类上的@EnableEurekaClient的注解,启动项目badger-spring-cloud-api

3、服务正常启动,项目也正常被注入到eureka中

4、总结:@EnableEurekaClient注解,在springboot2.x之后,确实可以不使用,项目也可以被正常注入,我又去看了下springboot1.5.x版本对应的eureka的部分代码,几乎跟2.x版本,相差不大;在1.5.x版本中,不标注@EnableEurekaClient注解,不知道还能注册到注册中心去,大家可以下去自己测试一下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

葵花下的獾

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值