spring boot 2.x spring cloud Greenwich.SR1 eureka客户端自动装配部分源码解析,以及@EnableEurekaClient注解详解

spring boot 2.x spring cloud Greenwich.SR1 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


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

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注解,不知道还能注册到注册中心去,大家可以下去自己测试一下。

原创文章 83 获赞 155 访问量 36万+

猜你喜欢

转载自blog.csdn.net/qq_28410283/article/details/103911645