spring boot 源码解析36-ConditionalOnEnabledEndpoint
2018-01-24 14:37
746 查看
前言
本文我们来解析OnEnabledEndpointCondition的实现,这个还是很简单的.目的是为了做下缓冲,后面的内容比较复杂.好了,开始吧.解析
@ConditionalOnEnabledEndpoint
代码如下:@Retention(RetentionPolicy.RUNTIME) @Target({ ElementType.METHOD, ElementType.TYPE }) @Conditional(OnEnabledEndpointCondition.class) @Documented public @interface ConditionalOnEnabledEndpoint { // endpoint的名字 String value(); // 返回endpoint是否可用,默认是可用的 boolean enabledByDefault() default true; }
其处理类为OnEnabledEndpointCondition.
OnEnabledEndpointCondition
OnEnabledEndpointCondition 继承自SpringBootCondition.getMatchOutcome 实现如下:
public ConditionOutcome getMatchOutcome(ConditionContext context, AnnotatedTypeMetadata metadata) { // 1. 获得@ConditionalOnEnabledEndpoint配置的Endpoint的名字和enabledByDefault的值 AnnotationAttributes annotationAttributes = AnnotationAttributes.fromMap(metadata .getAnnotationAttributes(ConditionalOnEnabledEndpoint.class.getName())); String endpointName = annotationAttributes.getString("value"); boolean enabledByDefault = annotationAttributes.getBoolean("enabledByDefault"); // 2. 获得endpoints.endpointName.enabled 的配置.然后进行返回,如此时传入的是env,则读取endpoints.env.enabled 的配置 ConditionOutcome outcome = determineEndpointOutcome(endpointName, enabledByDefault, context); if (outcome != null) { return outcome; } // 3.读取endpoints.enabled的配置,如果没有配置的话,则默认匹配 return determineAllEndpointsOutcome(context); }
获得@ConditionalOnEnabledEndpoint配置的Endpoint的名字和enabledByDefault的值
获得endpoints.endpointName.enabled 的配置.如果有配置的化则进行返回.如此时传入的是env,则读取endpoints.env.enabled 的配置.代码如下:
private ConditionOutcome determineEndpointOutcome(String endpointName, boolean enabledByDefault, ConditionContext context) { RelaxedPropertyResolver resolver = new RelaxedPropertyResolver( context.getEnvironment(), "endpoints." + endpointName + "."); if (resolver.containsProperty("enabled") || !enabledByDefault) { boolean match = resolver.getProperty("enabled", Boolean.class, enabledByDefault); ConditionMessage message = ConditionMessage .forCondition(ConditionalOnEnabledEndpoint.class, "(" + endpointName + ")") .because(match ? "enabled" : "disabled"); return new ConditionOutcome(match, message); } return null; }
实例化RelaxedPropertyResolver,读取endpoints.endpointName. 开头的配置
如果配置有endpoints.endpointName.enabled 或者 默认该endpoint不默认生效
获得有endpoints.endpointName.enabled的值,构造ConditionOutcome,然后返回
返回null
读取endpoints.enabled的配置,如果没有配置的话,则默认匹配.代码如下:
private ConditionOutcome determineAllEndpointsOutcome(ConditionContext context) { RelaxedPropertyResolver resolver = new RelaxedPropertyResolver( context.getEnvironment(), "endpoints."); boolean match = Boolean.valueOf(resolver.getProperty("enabled", "true")); ConditionMessage message = ConditionMessage .forCondition(ConditionalOnEnabledEndpoint.class) .because("All endpoints are " + (match ? "enabled" : "disabled") + " by default"); return new ConditionOutcome(match, message); }
实例化RelaxedPropertyResolver,读取endpoints. 开头的配置
获取endpoints.enabled 的配置,如果没有配置,则返回true
构造ConditionOutcome进行返回
使用案例:
在EndpointWebMvcManagementContextConfiguration中有如下方法:
@Bean @ConditionalOnMissingBean @ConditionalOnBean(EnvironmentEndpoint.class) @ConditionalOnEnabledEndpoint("env") public EnvironmentMvcEndpoint environmentMvcEndpoint(EnvironmentEndpoint delegate) { return new EnvironmentMvcEndpoint(delegate); }
其中使用到了@ConditionalOnEnabledEndpoint注解,意思是当配置有endpoints. env.enabled=true或者配置有endpoints.enabled=true或者没有配置endpoints.enabled,endpoints. env.enabled时默认生效
相关文章推荐
- spring boot 源码解析56-actuator请求处理流程(以EnvironmentEndpoint为例)
- spring boot 源码解析53-AbstractNamedMvcEndpoint
- spring boot 源码解析41-CounterWriter,GaugeWriter解析
- spring boot 源码解析44-PrefixMetricReader,PrefixMetricWriter,MultiMetricRepository
- spring boot 源码解析11-ConfigurationClassPostProcessor类加载解析
- springboot源码解析:自己实现一个springboot自动配置
- 【附3】springboot源码解析 - 构建SpringApplication
- spring boot 源码解析31-AuthenticationAuditListener,AuthorizationAuditListener
- 附3 springboot源码解析 - 构建SpringApplication
- 【Spring Boot】SpringBoot-自动配置源码解析
- 【附4】springboot源码解析-run()
- spring boot 源码解析30-LoggersEndpoint
- spring boot 源码解析37-CounterService详解
- 使用springboot+springsession实现分布式session以及源码解析
- 第二十三章 SpringBoot @SpringBootApplication注解源码解析
- 附4 springboot源码解析-run()
- spring boot 源码解析52-actuate中MVCEndPoint解析
- spring boot 源码解析5-SpringApplication#run第5步
- spring boot实战(第五篇)配置源码解析
- spring boot 源码解析22-spring boot jdbc自动化配置