sequence

This article focuses on the MappingsEndpoint of springboot2

MappingsEndpointAutoConfiguration

Spring – the boot – physical – autoconfigure – 2.0.1. RELEASE – sources. The jar! /org/springframework/boot/actuate/autoconfigure/web/mappings/MappingsEndpointAutoConfiguration.java

@ManagementContextConfiguration
public class MappingsEndpointAutoConfiguration {

	@Bean
	@ConditionalOnEnabledEndpoint
	public MappingsEndpoint mappingsEndpoint(ApplicationContext applicationContext,
			ObjectProvider<Collection<MappingDescriptionProvider>> descriptionProviders) {
		return new MappingsEndpoint(
				descriptionProviders.getIfAvailable(Collections::emptyList),
				applicationContext);
	}

	@Configuration
	@ConditionalOnWebApplication(type = Type.SERVLET)
	static class ServletWebConfiguration {

		@Bean
		ServletsMappingDescriptionProvider servletMappingDescriptionProvider() {
			return new ServletsMappingDescriptionProvider();
		}

		@Bean
		FiltersMappingDescriptionProvider filterMappingDescriptionProvider() {
			return new FiltersMappingDescriptionProvider();
		}

		@Configuration
		@ConditionalOnClass(DispatcherServlet.class)
		@ConditionalOnBean(DispatcherServlet.class)
		static class SpringMvcConfiguration {

			@Bean
			DispatcherServletsMappingDescriptionProvider dispatcherServletMappingDescriptionProvider() {
				return new DispatcherServletsMappingDescriptionProvider();
			}

		}

	}

	@Configuration
	@ConditionalOnWebApplication(type = Type.REACTIVE)
	@ConditionalOnClass(DispatcherHandler.class)
	@ConditionalOnBean(DispatcherHandler.class)
	static class ReactiveWebConfiguration {

		@Bean
		public DispatcherHandlersMappingDescriptionProvider dispatcherHandlerMappingDescriptionProvider(
				ApplicationContext applicationContext) {
			returnnew DispatcherHandlersMappingDescriptionProvider(); }}}Copy the code

Use descriptionProviders create mappingsEndpoint here, and then according to is the servlet or reactive way to create different MappingDescriptionProvider, The servlet is created ServletsMappingDescriptionProvider FiltersMappingDescriptionProvider, DispatcherServletsMappingDescriptionProvider reactive create DispatcherHandlersMappingDescriptionProvider

MappingsEndpoint

Spring – the boot – physical – 2.0.1. RELEASE – sources. The jar! /org/springframework/boot/actuate/web/mappings/MappingsEndpoint.java

@Endpoint(id = "mappings")
public class MappingsEndpoint {

	private final Collection<MappingDescriptionProvider> descriptionProviders;

	private final ApplicationContext context;

	public MappingsEndpoint(Collection<MappingDescriptionProvider> descriptionProviders,
			ApplicationContext context) {
		this.descriptionProviders = descriptionProviders;
		this.context = context;
	}

	@ReadOperation
	public ApplicationMappings mappings() {
		ApplicationContext target = this.context;
		Map<String, ContextMappings> contextMappings = new HashMap<>();
		while(target ! = null) { contextMappings.put(target.getId(), mappingsForContext(target)); target = target.getParent(); }return new ApplicationMappings(contextMappings);
	}

	private ContextMappings mappingsForContext(ApplicationContext applicationContext) {
		Map<String, Object> mappings = new HashMap<>();
		this.descriptionProviders
				.forEach((provider) -> mappings.put(provider.getMappingName(),
						provider.describeMappings(applicationContext)));
		returnnew ContextMappings(mappings, applicationContext.getParent() == null ? null : applicationContext.getId()); } / /... }Copy the code

Here we create the ContextMappings for descriptionProviders

servlet

ServletsMappingDescriptionProvider

Spring – the boot – physical – 2.0.1. RELEASE – sources. The jar! /org/springframework/boot/actuate/web/mappings/servlet/ServletsMappingDescriptionProvider.java

public class ServletsMappingDescriptionProvider implements MappingDescriptionProvider {

	@Override
	public List<ServletRegistrationMappingDescription> describeMappings(
			ApplicationContext context) {
		if(! (context instanceof WebApplicationContext)) {return Collections.emptyList();
		}
		return ((WebApplicationContext) context).getServletContext()
				.getServletRegistrations().values().stream()
				.map(ServletRegistrationMappingDescription::new)
				.collect(Collectors.toList());
	}

	@Override
	public String getMappingName() {
		return "servlets"; }}Copy the code

Here from servletContext ServletRegistrations, obtain ServletRegistrationMappingDescription again

FiltersMappingDescriptionProvider

Spring – the boot – physical – 2.0.1. RELEASE – sources. The jar! /org/springframework/boot/actuate/web/mappings/servlet/FiltersMappingDescriptionProvider.java

public class FiltersMappingDescriptionProvider implements MappingDescriptionProvider {

	@Override
	public List<FilterRegistrationMappingDescription> describeMappings(
			ApplicationContext context) {
		if(! (context instanceof WebApplicationContext)) {return Collections.emptyList();
		}
		return ((WebApplicationContext) context).getServletContext()
				.getFilterRegistrations().values().stream()
				.map(FilterRegistrationMappingDescription::new)
				.collect(Collectors.toList());
	}

	@Override
	public String getMappingName() {
		return "servletFilters"; }}Copy the code

Here from servletContext FilterRegistrations, obtain FilterRegistrationMappingDescription again

DispatcherServletsMappingDescriptionProvider

Spring – the boot – physical – 2.0.1. RELEASE – sources. The jar! /org/springframework/boot/actuate/web/mappings/servlet/DispatcherServletsMappingDescriptionProvider.java

public class DispatcherServletsMappingDescriptionProvider
		implements MappingDescriptionProvider {

	private static final List<HandlerMappingDescriptionProvider<? extends HandlerMapping>> descriptionProviders;

	static {
		List<HandlerMappingDescriptionProvider<? extends HandlerMapping>> providers = new ArrayList<>();
		providers.add(new RequestMappingInfoHandlerMappingDescriptionProvider());
		providers.add(new UrlHandlerMappingDescriptionProvider());
		if (ClassUtils.isPresent(
				"org.springframework.data.rest.webmvc.support.DelegatingHandlerMapping",
				null)) {
			providers.add(new DelegatingHandlerMappingDescriptionProvider(
					new ArrayList<>(providers)));
		}
		descriptionProviders = Collections.unmodifiableList(providers);
	}

	@Override
	public String getMappingName() {
		return "dispatcherServlets";
	}

	@Override
	public Map<String, List<DispatcherServletMappingDescription>> describeMappings(
			ApplicationContext context) {
		if (context instanceof WebApplicationContext) {
			return describeMappings((WebApplicationContext) context);
		}
		return Collections.emptyMap();
	}

	private Map<String, List<DispatcherServletMappingDescription>> describeMappings(
			WebApplicationContext context) {
		Map<String, List<DispatcherServletMappingDescription>> mappings = new HashMap<>();
		context.getBeansOfType(DispatcherServlet.class)
				.forEach((name, dispatcherServlet) -> mappings.put(name,
						describeMappings(new DispatcherServletHandlerMappings(name,
								dispatcherServlet, context))));
		return mappings;
	}

	private List<DispatcherServletMappingDescription> describeMappings(
			DispatcherServletHandlerMappings mappings) {
		return mappings.getHandlerMappings().stream().flatMap(this::describe)
				.collect(Collectors.toList());
	}

	private <T extends HandlerMapping> Stream<DispatcherServletMappingDescription> describe(
			T handlerMapping) {
		return describe(handlerMapping, descriptionProviders).stream();
	}

	@SuppressWarnings("unchecked") private static <T extends HandlerMapping> List<DispatcherServletMappingDescription> describe( T handlerMapping, List<HandlerMappingDescriptionProvider<? >> descriptionProviders) {for(HandlerMappingDescriptionProvider<? > descriptionProvider : descriptionProviders) {if (descriptionProvider.getMappingClass().isInstance(handlerMapping)) {
				return((HandlerMappingDescriptionProvider<T>) descriptionProvider) .describe(handlerMapping); }}returnCollections.emptyList(); } / /... }Copy the code

Here mainly from DelegatingHandlerMappingDescriptionProvider, RequestMappingInfoHandlerMappingDescriptionProvider, UrlHandlerMappingDe ScriptionProvider get DispatcherServletMappingDescription

Reactive way

DispatcherHandlersMappingDescriptionProvider

Spring – the boot – physical – 2.0.1. RELEASE – sources. The jar! /org/springframework/boot/actuate/web/mappings/reactive/DispatcherHandlersMappingDescriptionProvider.java

public class DispatcherHandlersMappingDescriptionProvider
		implements MappingDescriptionProvider {

	private static final List<HandlerMappingDescriptionProvider<? extends HandlerMapping>> descriptionProviders = Arrays
			.asList(new RequestMappingInfoHandlerMappingDescriptionProvider(),
					new UrlHandlerMappingDescriptionProvider(),
					new RouterFunctionMappingDescriptionProvider());

	@Override
	public String getMappingName() {
		return "dispatcherHandlers";
	}

	@Override
	public Map<String, List<DispatcherHandlerMappingDescription>> describeMappings(
			ApplicationContext context) {
		Map<String, List<DispatcherHandlerMappingDescription>> mappings = new HashMap<>();
		context.getBeansOfType(DispatcherHandler.class).forEach(
				(name, handler) -> mappings.put(name, describeMappings(handler)));
		return mappings;
	}

	private List<DispatcherHandlerMappingDescription> describeMappings(
			DispatcherHandler dispatcherHandler) {
		return dispatcherHandler.getHandlerMappings().stream().flatMap(this::describe)
				.collect(Collectors.toList());
	}

	@SuppressWarnings("unchecked")
	private <T extends HandlerMapping> Stream<DispatcherHandlerMappingDescription> describe(
			T handlerMapping) {
		for(HandlerMappingDescriptionProvider<? > descriptionProvider : descriptionProviders) {if (descriptionProvider.getMappingClass().isInstance(handlerMapping)) {
				return((HandlerMappingDescriptionProvider<T>) descriptionProvider) .describe(handlerMapping).stream(); }}returnStream.empty(); } / /... }Copy the code

Unlike the servlet to obtain DispatcherServletsMappingDescriptionProvider, Reactive get DispatcherHandlersMappingDescriptionProvider Mainly from RequestMappingInfoHandlerMappingDescriptionProvider, RouterFunctionMappingDescriptionProvider, UrlHandlerMappingDescrip To obtain HandlerMappingDescriptionProvider tionProvider these three

summary

The MappingsEndpoint of SpringBoot2 uses the provider to obtain its own mappings based on servlets and Reactive. The servlet mainly divided into ServletsMappingDescriptionProvider, FiltersMappingDescriptionProvider, DispatcherServletsMappingDescriptionProv Ider, and divided into DispatcherHandlersMappingDescriptionProvider main reactive

doc

  • Spring Boot Reference Guide