配置机制
1、@EnableEurekaServer用途:--- 开关
注册bean到spring上下文
org.springframework.cloud.netflix.eureka.server.EurekaServerMarkerConfiguration.Marker
2、自动加载 EurekaServerAutoConfiguration 进行配置
1、检查spring上下文是否有 EurekaServerMarkerConfiguration.Marker 对象
2、如果有存在,注册各种bean
扫描api处理器
.
/**
* 扫描含有 @Path、@Provider 注解的类列表
* <pre>
*
*
* @see com.netflix.discovery.provider.DiscoveryJerseyProvider
* @see com.netflix.eureka.resources.InstancesResource
* 处理 http://127.0.0.1:8761/eureka/instances 类请求
* @see com.netflix.eureka.resources.PeerReplicationResource
* @see com.netflix.eureka.resources.SecureVIPResource
* @see com.netflix.eureka.resources.StatusResource
* @see com.netflix.eureka.resources.ServerInfoResource
* 处理 curl -H "Accept:application/json" -X GET http://127.0.0.1:8761/eureka/serverinfo/statusoverrides 类请求
* @see com.netflix.eureka.resources.ApplicationsResource
* 处理 http://127.0.0.1:8761/eureka/apps/** 类请求
* @see com.netflix.eureka.resources.VIPResource
* @see com.netflix.eureka.resources.ASGResource
* </pre>
*/
.
public class EurekaServerAutoConfiguration extends WebMvcConfigurerAdapter {
// ...
/**
* Construct a Jersey {@link javax.ws.rs.core.Application} with all the resources
* required by the Eureka server.
*/
@Bean
public javax.ws.rs.core.Application jerseyApplication(Environment environment,
ResourceLoader resourceLoader) {
ClassPathScanningCandidateComponentProvider provider = new ClassPathScanningCandidateComponentProvider(
false, environment);
// 扫描含有 @Path、@Provider 注解的类列表
// Filter to include only classes that have a particular annotation.
//
provider.addIncludeFilter(new AnnotationTypeFilter(Path.class));
provider.addIncludeFilter(new AnnotationTypeFilter(Provider.class));
// Find classes in Eureka packages (or subpackages)
//
Set<Class<?>> classes = new HashSet<Class<?>>();
for (String basePackage : EUREKA_PACKAGES) {
Set<BeanDefinition> beans = provider.findCandidateComponents(basePackage);
for (BeanDefinition bd : beans) {
Class<?> cls = ClassUtils.resolveClassName(bd.getBeanClassName(),
resourceLoader.getClassLoader());
classes.add(cls);
}
}
// Construct the Jersey ResourceConfig
//
Map<String, Object> propsAndFeatures = new HashMap<String, Object>();
propsAndFeatures.put(
// Skip static content used by the webapp
ServletContainer.PROPERTY_WEB_PAGE_CONTENT_REGEX,
EurekaConstants.DEFAULT_PREFIX + "/(fonts|images|css|js)/.*");
DefaultResourceConfig rc = new DefaultResourceConfig(classes);
rc.setPropertiesAndFeatures(propsAndFeatures);
return rc;
}
// ....
}
.