Polishing

This commit is contained in:
Juergen Hoeller 2018-07-06 15:18:47 +02:00
parent 6cae0650e6
commit eb3254d2a9
2 changed files with 54 additions and 47 deletions

View File

@ -79,19 +79,17 @@ import org.springframework.util.ObjectUtils;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
/** /**
* Spring's default implementation of the * Spring's default implementation of the {@link ConfigurableListableBeanFactory}
* {@link org.springframework.beans.factory.ListableBeanFactory} and * and {@link BeanDefinitionRegistry} interfaces: a full-fledged bean factory
* {@link BeanDefinitionRegistry} interfaces: a full-fledged bean factory * based on bean definition metadata, extensible through post-processors.
* based on bean definition objects.
* *
* <p>Typical usage is registering all bean definitions first (possibly read * <p>Typical usage is registering all bean definitions first (possibly read
* from a bean definition file), before accessing beans. Bean definition lookup * from a bean definition file), before accessing beans. Bean lookup by name
* is therefore an inexpensive operation in a local bean definition table, * is therefore an inexpensive operation in a local bean definition table,
* operating on pre-built bean definition metadata objects. * operating on pre-resolved bean definition metadata objects.
* *
* <p>Can be used as a standalone bean factory, or as a superclass for custom * <p>Note that readers for specific bean definition formats are typically
* bean factories. Note that readers for specific bean definition formats are * implemented separately rather than as bean factory subclasses:
* typically implemented separately rather than as bean factory subclasses:
* see for example {@link PropertiesBeanDefinitionReader} and * see for example {@link PropertiesBeanDefinitionReader} and
* {@link org.springframework.beans.factory.xml.XmlBeanDefinitionReader}. * {@link org.springframework.beans.factory.xml.XmlBeanDefinitionReader}.
* *
@ -108,9 +106,10 @@ import org.springframework.util.StringUtils;
* @author Phillip Webb * @author Phillip Webb
* @author Stephane Nicoll * @author Stephane Nicoll
* @since 16 April 2001 * @since 16 April 2001
* @see StaticListableBeanFactory * @see #registerBeanDefinition
* @see PropertiesBeanDefinitionReader * @see #addBeanPostProcessor
* @see org.springframework.beans.factory.xml.XmlBeanDefinitionReader * @see #getBean
* @see #resolveDependency
*/ */
@SuppressWarnings("serial") @SuppressWarnings("serial")
public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFactory public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFactory
@ -1249,7 +1248,7 @@ public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFacto
} }
} }
private FactoryAwareOrderSourceProvider createFactoryAwareOrderSourceProvider(Map<String, Object> beans) { private OrderComparator.OrderSourceProvider createFactoryAwareOrderSourceProvider(Map<String, Object> beans) {
IdentityHashMap<Object, String> instancesToBeanNames = new IdentityHashMap<>(); IdentityHashMap<Object, String> instancesToBeanNames = new IdentityHashMap<>();
beans.forEach((beanName, instance) -> instancesToBeanNames.put(instance, beanName)); beans.forEach((beanName, instance) -> instancesToBeanNames.put(instance, beanName));
return new FactoryAwareOrderSourceProvider(instancesToBeanNames); return new FactoryAwareOrderSourceProvider(instancesToBeanNames);
@ -1616,6 +1615,29 @@ public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFacto
} }
/**
* A dependency descriptor marker for nested elements.
*/
private static class NestedDependencyDescriptor extends DependencyDescriptor {
public NestedDependencyDescriptor(DependencyDescriptor original) {
super(original);
increaseNestingLevel();
}
}
/**
* A dependency descriptor marker for multiple elements.
*/
private static class MultiElementDescriptor extends NestedDependencyDescriptor {
public MultiElementDescriptor(DependencyDescriptor original) {
super(original);
}
}
/** /**
* Serializable ObjectFactory/ObjectProvider for lazy resolution of a dependency. * Serializable ObjectFactory/ObjectProvider for lazy resolution of a dependency.
*/ */
@ -1720,7 +1742,7 @@ public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFacto
/** /**
* Serializable ObjectFactory for lazy resolution of a dependency. * A {@code javax.inject.Provider} implementation for lazy resolution of a dependency.
*/ */
private class Jsr330DependencyProvider extends DependencyObjectProvider implements Provider<Object> { private class Jsr330DependencyProvider extends DependencyObjectProvider implements Provider<Object> {
@ -1793,21 +1815,4 @@ public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFacto
} }
} }
private static class NestedDependencyDescriptor extends DependencyDescriptor {
public NestedDependencyDescriptor(DependencyDescriptor original) {
super(original);
increaseNestingLevel();
}
}
private static class MultiElementDescriptor extends NestedDependencyDescriptor {
public MultiElementDescriptor(DependencyDescriptor original) {
super(original);
}
}
} }

View File

@ -67,7 +67,8 @@ public abstract class RouterFunctions {
public static final String URI_TEMPLATE_VARIABLES_ATTRIBUTE = public static final String URI_TEMPLATE_VARIABLES_ATTRIBUTE =
RouterFunctions.class.getName() + ".uriTemplateVariables"; RouterFunctions.class.getName() + ".uriTemplateVariables";
private static final HandlerFunction<ServerResponse> NOT_FOUND_HANDLER = request -> ServerResponse.notFound().build(); private static final HandlerFunction<ServerResponse> NOT_FOUND_HANDLER =
request -> ServerResponse.notFound().build();
/** /**
@ -103,7 +104,6 @@ public abstract class RouterFunctions {
* RouterFunction&lt;ServerResponse&gt; userRoutes = * RouterFunction&lt;ServerResponse&gt; userRoutes =
* RouterFunctions.route(RequestPredicates.method(HttpMethod.GET), this::listUsers) * RouterFunctions.route(RequestPredicates.method(HttpMethod.GET), this::listUsers)
* .andRoute(RequestPredicates.method(HttpMethod.POST), this::createUser); * .andRoute(RequestPredicates.method(HttpMethod.POST), this::createUser);
*
* RouterFunction&lt;ServerResponse&gt; nestedRoute = * RouterFunction&lt;ServerResponse&gt; nestedRoute =
* RouterFunctions.nest(RequestPredicates.path("/user"), userRoutes); * RouterFunctions.nest(RequestPredicates.path("/user"), userRoutes);
* </pre> * </pre>
@ -125,7 +125,7 @@ public abstract class RouterFunctions {
* For instance * For instance
* <pre class="code"> * <pre class="code">
* Resource location = new FileSystemResource("public-resources/"); * Resource location = new FileSystemResource("public-resources/");
* RoutingFunction&lt;ServerResponse&gt; resources = RouterFunctions.resources("/resources/**", location); * RouterFunction&lt;ServerResponse&gt; resources = RouterFunctions.resources("/resources/**", location);
* </pre> * </pre>
* @param pattern the pattern to match * @param pattern the pattern to match
* @param location the location directory relative to which resources should be resolved * @param location the location directory relative to which resources should be resolved
@ -225,12 +225,13 @@ public abstract class RouterFunctions {
}; };
} }
private static <T> Mono<T> wrapException(Supplier<Mono<T>> supplier) { private static <T> Mono<T> wrapException(Supplier<Mono<T>> supplier) {
try { try {
return supplier.get(); return supplier.get();
} }
catch (Throwable t) { catch (Throwable ex) {
return Mono.error(t); return Mono.error(ex);
} }
} }
@ -303,6 +304,7 @@ public abstract class RouterFunctions {
} }
} }
static final class SameComposedRouterFunction<T extends ServerResponse> extends AbstractRouterFunction<T> { static final class SameComposedRouterFunction<T extends ServerResponse> extends AbstractRouterFunction<T> {
private final RouterFunction<T> first; private final RouterFunction<T> first;
@ -350,9 +352,9 @@ public abstract class RouterFunctions {
this.first.accept(visitor); this.first.accept(visitor);
this.second.accept(visitor); this.second.accept(visitor);
} }
} }
static final class FilteredRouterFunction<T extends ServerResponse, S extends ServerResponse> static final class FilteredRouterFunction<T extends ServerResponse, S extends ServerResponse>
implements RouterFunction<S> { implements RouterFunction<S> {
@ -383,8 +385,8 @@ public abstract class RouterFunctions {
} }
} }
private static final class DefaultRouterFunction<T extends ServerResponse>
extends AbstractRouterFunction<T> { private static final class DefaultRouterFunction<T extends ServerResponse> extends AbstractRouterFunction<T> {
private final RequestPredicate predicate; private final RequestPredicate predicate;
@ -414,11 +416,10 @@ public abstract class RouterFunctions {
public void accept(Visitor visitor) { public void accept(Visitor visitor) {
visitor.route(this.predicate, this.handlerFunction); visitor.route(this.predicate, this.handlerFunction);
} }
} }
private static final class DefaultNestedRouterFunction<T extends ServerResponse>
extends AbstractRouterFunction<T> { private static final class DefaultNestedRouterFunction<T extends ServerResponse> extends AbstractRouterFunction<T> {
private final RequestPredicate predicate; private final RequestPredicate predicate;
@ -446,15 +447,15 @@ public abstract class RouterFunctions {
mergeTemplateVariables(serverRequest, nestedRequest.pathVariables()); mergeTemplateVariables(serverRequest, nestedRequest.pathVariables());
}); });
} }
) ).orElseGet(Mono::empty);
.orElseGet(Mono::empty);
} }
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
private void mergeTemplateVariables(ServerRequest request, Map<String, String> variables) { private void mergeTemplateVariables(ServerRequest request, Map<String, String> variables) {
if (!variables.isEmpty()) { if (!variables.isEmpty()) {
Map<String, Object> attributes = request.attributes(); Map<String, Object> attributes = request.attributes();
Map<String, String> oldVariables = (Map<String, String>)request.attribute(RouterFunctions.URI_TEMPLATE_VARIABLES_ATTRIBUTE) Map<String, String> oldVariables =
(Map<String, String>) request.attribute(RouterFunctions.URI_TEMPLATE_VARIABLES_ATTRIBUTE)
.orElseGet(LinkedHashMap::new); .orElseGet(LinkedHashMap::new);
Map<String, String> mergedVariables = new LinkedHashMap<>(oldVariables); Map<String, String> mergedVariables = new LinkedHashMap<>(oldVariables);
mergedVariables.putAll(variables); mergedVariables.putAll(variables);
@ -469,9 +470,9 @@ public abstract class RouterFunctions {
this.routerFunction.accept(visitor); this.routerFunction.accept(visitor);
visitor.endNested(this.predicate); visitor.endNested(this.predicate);
} }
} }
private static class ResourcesRouterFunction extends AbstractRouterFunction<ServerResponse> { private static class ResourcesRouterFunction extends AbstractRouterFunction<ServerResponse> {
private final Function<ServerRequest, Mono<Resource>> lookupFunction; private final Function<ServerRequest, Mono<Resource>> lookupFunction;
@ -492,6 +493,7 @@ public abstract class RouterFunctions {
} }
} }
private static class HandlerStrategiesResponseContext implements ServerResponse.Context { private static class HandlerStrategiesResponseContext implements ServerResponse.Context {
private final HandlerStrategies strategies; private final HandlerStrategies strategies;