Leverage ObjectProvider instead of autowired containers

In order to be able to leverage WebFlux configuration in a functional
way, WebHttpHandlerBuilder and RouterFunctionMapping should leverage
new ObjectProvider capabilities to get a sorted list of beans by type
instead of using autowired containers.

Issue: SPR-17327
This commit is contained in:
Sebastien Deleuze
2018-10-03 11:17:35 +02:00
parent 1320fed7fe
commit 3ff5731429
2 changed files with 16 additions and 50 deletions

View File

@@ -18,13 +18,11 @@ package org.springframework.web.server.adapter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.function.Consumer;
import java.util.stream.Collectors;
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.core.annotation.AnnotationAwareOrderComparator;
import org.springframework.http.codec.ServerCodecConfigurer;
@@ -158,12 +156,16 @@ public final class WebHttpHandlerBuilder {
WebHttpHandlerBuilder builder = new WebHttpHandlerBuilder(
context.getBean(WEB_HANDLER_BEAN_NAME, WebHandler.class), context);
// Autowire lists for @Bean + @Order
SortedBeanContainer container = new SortedBeanContainer();
context.getAutowireCapableBeanFactory().autowireBean(container);
builder.filters(filters -> filters.addAll(container.getFilters()));
builder.exceptionHandlers(handlers -> handlers.addAll(container.getExceptionHandlers()));
List<WebFilter> webFilters = context
.getBeanProvider(WebFilter.class)
.orderedStream()
.collect(Collectors.toList());
builder.filters(filters -> filters.addAll(webFilters));
List<WebExceptionHandler> exceptionHandlers = context
.getBeanProvider(WebExceptionHandler.class)
.orderedStream()
.collect(Collectors.toList());
builder.exceptionHandlers(handlers -> handlers.addAll(exceptionHandlers));
try {
builder.sessionManager(
@@ -389,30 +391,4 @@ public final class WebHttpHandlerBuilder {
return new WebHttpHandlerBuilder(this);
}
private static class SortedBeanContainer {
private List<WebFilter> filters = Collections.emptyList();
private List<WebExceptionHandler> exceptionHandlers = Collections.emptyList();
@Autowired(required = false)
public void setFilters(List<WebFilter> filters) {
this.filters = filters;
}
public List<WebFilter> getFilters() {
return this.filters;
}
@Autowired(required = false)
public void setExceptionHandlers(List<WebExceptionHandler> exceptionHandlers) {
this.exceptionHandlers = exceptionHandlers;
}
public List<WebExceptionHandler> getExceptionHandlers() {
return this.exceptionHandlers;
}
}
}