Browse Source

Polishing

pull/1998/head
Juergen Hoeller 7 years ago
parent
commit
a45bce1369
  1. 8
      spring-beans/src/main/java/org/springframework/beans/factory/BeanFactory.java
  2. 26
      spring-beans/src/main/java/org/springframework/beans/factory/annotation/BeanFactoryAnnotationUtils.java
  3. 6
      spring-core/src/main/java/org/springframework/core/io/PathResource.java
  4. 6
      spring-core/src/main/java/org/springframework/core/io/Resource.java
  5. 4
      spring-core/src/main/java/org/springframework/core/type/classreading/AbstractRecursiveAnnotationVisitor.java
  6. 2
      spring-core/src/main/java/org/springframework/core/type/classreading/AnnotationMetadataReadingVisitor.java
  7. 5
      spring-core/src/main/java/org/springframework/core/type/classreading/RecursiveAnnotationAttributesVisitor.java
  8. 4
      src/docs/asciidoc/web/webmvc.adoc

8
spring-beans/src/main/java/org/springframework/beans/factory/BeanFactory.java

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2017 the original author or authors. * Copyright 2002-2018 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -181,8 +181,7 @@ public interface BeanFactory {
* but may also be translated into a conventional by-name lookup based on the name * but may also be translated into a conventional by-name lookup based on the name
* of the given type. For more extensive retrieval operations across sets of beans, * of the given type. For more extensive retrieval operations across sets of beans,
* use {@link ListableBeanFactory} and/or {@link BeanFactoryUtils}. * use {@link ListableBeanFactory} and/or {@link BeanFactoryUtils}.
* @param requiredType type the bean must match; can be an interface or superclass. * @param requiredType type the bean must match; can be an interface or superclass
* {@code null} is disallowed.
* @return an instance of the single bean matching the required type * @return an instance of the single bean matching the required type
* @throws NoSuchBeanDefinitionException if no bean of the given type was found * @throws NoSuchBeanDefinitionException if no bean of the given type was found
* @throws NoUniqueBeanDefinitionException if more than one bean of the given type was found * @throws NoUniqueBeanDefinitionException if more than one bean of the given type was found
@ -200,8 +199,7 @@ public interface BeanFactory {
* but may also be translated into a conventional by-name lookup based on the name * but may also be translated into a conventional by-name lookup based on the name
* of the given type. For more extensive retrieval operations across sets of beans, * of the given type. For more extensive retrieval operations across sets of beans,
* use {@link ListableBeanFactory} and/or {@link BeanFactoryUtils}. * use {@link ListableBeanFactory} and/or {@link BeanFactoryUtils}.
* @param requiredType type the bean must match; can be an interface or superclass. * @param requiredType type the bean must match; can be an interface or superclass
* {@code null} is disallowed.
* @param args arguments to use when creating a bean instance using explicit arguments * @param args arguments to use when creating a bean instance using explicit arguments
* (only applied when creating a new instance as opposed to retrieving an existing one) * (only applied when creating a new instance as opposed to retrieving an existing one)
* @return an instance of the bean * @return an instance of the bean

26
spring-beans/src/main/java/org/springframework/beans/factory/annotation/BeanFactoryAnnotationUtils.java

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2016 the original author or authors. * Copyright 2002-2018 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -22,11 +22,11 @@ import java.util.function.Predicate;
import org.springframework.beans.BeansException; import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryUtils; import org.springframework.beans.factory.BeanFactoryUtils;
import org.springframework.beans.factory.ListableBeanFactory;
import org.springframework.beans.factory.NoSuchBeanDefinitionException; import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.beans.factory.NoUniqueBeanDefinitionException; import org.springframework.beans.factory.NoUniqueBeanDefinitionException;
import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.AbstractBeanDefinition; import org.springframework.beans.factory.support.AbstractBeanDefinition;
import org.springframework.beans.factory.support.AutowireCandidateQualifier; import org.springframework.beans.factory.support.AutowireCandidateQualifier;
import org.springframework.beans.factory.support.RootBeanDefinition; import org.springframework.beans.factory.support.RootBeanDefinition;
@ -35,8 +35,8 @@ import org.springframework.lang.Nullable;
import org.springframework.util.Assert; import org.springframework.util.Assert;
/** /**
* Convenience methods performing bean lookups related to annotations, for example * Convenience methods performing bean lookups related to Spring-specific annotations,
* Spring's {@link Qualifier @Qualifier} annotation. * for example Spring's {@link Qualifier @Qualifier} annotation.
* *
* @author Juergen Hoeller * @author Juergen Hoeller
* @author Chris Beams * @author Chris Beams
@ -49,23 +49,23 @@ public abstract class BeanFactoryAnnotationUtils {
* Obtain a bean of type {@code T} from the given {@code BeanFactory} declaring a * Obtain a bean of type {@code T} from the given {@code BeanFactory} declaring a
* qualifier (e.g. via {@code <qualifier>} or {@code @Qualifier}) matching the given * qualifier (e.g. via {@code <qualifier>} or {@code @Qualifier}) matching the given
* qualifier, or having a bean name matching the given qualifier. * qualifier, or having a bean name matching the given qualifier.
* @param beanFactory the BeanFactory to get the target bean from * @param beanFactory the factory to get the target bean from (also searching ancestors)
* @param beanType the type of bean to retrieve * @param beanType the type of bean to retrieve
* @param qualifier the qualifier for selecting between multiple bean matches * @param qualifier the qualifier for selecting between multiple bean matches
* @return the matching bean of type {@code T} (never {@code null}) * @return the matching bean of type {@code T} (never {@code null})
* @throws NoUniqueBeanDefinitionException if multiple matching beans of type {@code T} found * @throws NoUniqueBeanDefinitionException if multiple matching beans of type {@code T} found
* @throws NoSuchBeanDefinitionException if no matching bean of type {@code T} found * @throws NoSuchBeanDefinitionException if no matching bean of type {@code T} found
* @throws BeansException if the bean could not be created * @throws BeansException if the bean could not be created
* @see BeanFactory#getBean(Class) * @see BeanFactoryUtils#beanOfTypeIncludingAncestors(ListableBeanFactory, Class)
*/ */
public static <T> T qualifiedBeanOfType(BeanFactory beanFactory, Class<T> beanType, String qualifier) public static <T> T qualifiedBeanOfType(BeanFactory beanFactory, Class<T> beanType, String qualifier)
throws BeansException { throws BeansException {
Assert.notNull(beanFactory, "BeanFactory must not be null"); Assert.notNull(beanFactory, "BeanFactory must not be null");
if (beanFactory instanceof ConfigurableListableBeanFactory) { if (beanFactory instanceof ListableBeanFactory) {
// Full qualifier matching supported. // Full qualifier matching supported.
return qualifiedBeanOfType((ConfigurableListableBeanFactory) beanFactory, beanType, qualifier); return qualifiedBeanOfType((ListableBeanFactory) beanFactory, beanType, qualifier);
} }
else if (beanFactory.containsBean(qualifier)) { else if (beanFactory.containsBean(qualifier)) {
// Fallback: target bean at least found by bean name. // Fallback: target bean at least found by bean name.
@ -82,12 +82,12 @@ public abstract class BeanFactoryAnnotationUtils {
/** /**
* Obtain a bean of type {@code T} from the given {@code BeanFactory} declaring a qualifier * Obtain a bean of type {@code T} from the given {@code BeanFactory} declaring a qualifier
* (e.g. {@code <qualifier>} or {@code @Qualifier}) matching the given qualifier). * (e.g. {@code <qualifier>} or {@code @Qualifier}) matching the given qualifier).
* @param bf the BeanFactory to get the target bean from * @param bf the factory to get the target bean from
* @param beanType the type of bean to retrieve * @param beanType the type of bean to retrieve
* @param qualifier the qualifier for selecting between multiple bean matches * @param qualifier the qualifier for selecting between multiple bean matches
* @return the matching bean of type {@code T} (never {@code null}) * @return the matching bean of type {@code T} (never {@code null})
*/ */
private static <T> T qualifiedBeanOfType(ConfigurableListableBeanFactory bf, Class<T> beanType, String qualifier) { private static <T> T qualifiedBeanOfType(ListableBeanFactory bf, Class<T> beanType, String qualifier) {
String[] candidateBeans = BeanFactoryUtils.beanNamesForTypeIncludingAncestors(bf, beanType); String[] candidateBeans = BeanFactoryUtils.beanNamesForTypeIncludingAncestors(bf, beanType);
String matchingBean = null; String matchingBean = null;
for (String beanName : candidateBeans) { for (String beanName : candidateBeans) {
@ -115,14 +115,14 @@ public abstract class BeanFactoryAnnotationUtils {
* Check whether the named bean declares a qualifier of the given name. * Check whether the named bean declares a qualifier of the given name.
* @param qualifier the qualifier to match * @param qualifier the qualifier to match
* @param beanName the name of the candidate bean * @param beanName the name of the candidate bean
* @param beanFactory the {@code BeanFactory} from which to retrieve the named bean * @param beanFactory the factory from which to retrieve the named bean
* @return {@code true} if either the bean definition (in the XML case) * @return {@code true} if either the bean definition (in the XML case)
* or the bean's factory method (in the {@code @Bean} case) defines a matching * or the bean's factory method (in the {@code @Bean} case) defines a matching
* qualifier value (through {@code <qualifier>} or {@code @Qualifier}) * qualifier value (through {@code <qualifier>} or {@code @Qualifier})
* @since 5.0 * @since 5.0
*/ */
public static boolean isQualifierMatch(Predicate<String> qualifier, String beanName, public static boolean isQualifierMatch(
@Nullable BeanFactory beanFactory) { Predicate<String> qualifier, String beanName, @Nullable BeanFactory beanFactory) {
// Try quick bean name or alias match first... // Try quick bean name or alias match first...
if (qualifier.test(beanName)) { if (qualifier.test(beanName)) {

6
spring-core/src/main/java/org/springframework/core/io/PathResource.java

@ -42,9 +42,9 @@ import org.springframework.util.Assert;
* @author Philippe Marschall * @author Philippe Marschall
* @author Juergen Hoeller * @author Juergen Hoeller
* @since 4.0 * @since 4.0
* @see FileSystemResource
* @see java.nio.file.Path * @see java.nio.file.Path
* @see java.nio.file.Files * @see java.nio.file.Files
* @see FileSystemResource
*/ */
public class PathResource extends AbstractResource implements WritableResource { public class PathResource extends AbstractResource implements WritableResource {
@ -81,8 +81,8 @@ public class PathResource extends AbstractResource implements WritableResource {
* <p>Note: Unlike {@link FileSystemResource}, when building relative resources * <p>Note: Unlike {@link FileSystemResource}, when building relative resources
* via {@link #createRelative}, the relative path will be built <i>underneath</i> * via {@link #createRelative}, the relative path will be built <i>underneath</i>
* the given root: e.g. Paths.get("C:/dir1/"), relative path "dir2" -> "C:/dir1/dir2"! * the given root: e.g. Paths.get("C:/dir1/"), relative path "dir2" -> "C:/dir1/dir2"!
* @see java.nio.file.Paths#get(URI)
* @param uri a path URI * @param uri a path URI
* @see java.nio.file.Paths#get(URI)
*/ */
public PathResource(URI uri) { public PathResource(URI uri) {
Assert.notNull(uri, "URI must not be null"); Assert.notNull(uri, "URI must not be null");
@ -99,7 +99,7 @@ public class PathResource extends AbstractResource implements WritableResource {
/** /**
* This implementation returns whether the underlying file exists. * This implementation returns whether the underlying file exists.
* @see org.springframework.core.io.PathResource#exists() * @see java.nio.file.Files#exists(Path, java.nio.file.LinkOption...)
*/ */
@Override @Override
public boolean exists() { public boolean exists() {

6
spring-core/src/main/java/org/springframework/core/io/Resource.java

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2017 the original author or authors. * Copyright 2002-2018 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -43,9 +43,9 @@ import org.springframework.lang.Nullable;
* @see WritableResource * @see WritableResource
* @see ContextResource * @see ContextResource
* @see UrlResource * @see UrlResource
* @see ClassPathResource * @see FileUrlResource
* @see FileSystemResource * @see FileSystemResource
* @see PathResource * @see ClassPathResource
* @see ByteArrayResource * @see ByteArrayResource
* @see InputStreamResource * @see InputStreamResource
*/ */

4
spring-core/src/main/java/org/springframework/core/type/classreading/AbstractRecursiveAnnotationVisitor.java

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2017 the original author or authors. * Copyright 2002-2018 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -31,6 +31,8 @@ import org.springframework.util.ClassUtils;
import org.springframework.util.ReflectionUtils; import org.springframework.util.ReflectionUtils;
/** /**
* {@link AnnotationVisitor} to recursively visit annotations.
*
* @author Chris Beams * @author Chris Beams
* @author Juergen Hoeller * @author Juergen Hoeller
* @author Phillip Webb * @author Phillip Webb

2
spring-core/src/main/java/org/springframework/core/type/classreading/AnnotationMetadataReadingVisitor.java

@ -84,7 +84,7 @@ public class AnnotationMetadataReadingVisitor extends ClassMetadataReadingVisito
} }
@Override @Override
public AnnotationVisitor visitAnnotation(final String desc, boolean visible) { public AnnotationVisitor visitAnnotation(String desc, boolean visible) {
String className = Type.getType(desc).getClassName(); String className = Type.getType(desc).getClassName();
this.annotationSet.add(className); this.annotationSet.add(className);
return new AnnotationAttributesReadingVisitor( return new AnnotationAttributesReadingVisitor(

5
spring-core/src/main/java/org/springframework/core/type/classreading/RecursiveAnnotationAttributesVisitor.java

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2017 the original author or authors. * Copyright 2002-2018 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -16,11 +16,14 @@
package org.springframework.core.type.classreading; package org.springframework.core.type.classreading;
import org.springframework.asm.AnnotationVisitor;
import org.springframework.core.annotation.AnnotationAttributes; import org.springframework.core.annotation.AnnotationAttributes;
import org.springframework.core.annotation.AnnotationUtils; import org.springframework.core.annotation.AnnotationUtils;
import org.springframework.lang.Nullable; import org.springframework.lang.Nullable;
/** /**
* {@link AnnotationVisitor} to recursively visit annotation attributes.
*
* @author Chris Beams * @author Chris Beams
* @author Juergen Hoeller * @author Juergen Hoeller
* @since 3.1.1 * @since 3.1.1

4
src/docs/asciidoc/web/webmvc.adoc

@ -1380,13 +1380,13 @@ and security (see next section for more details).
To completely disable the use of file extensions, you must set both of these: To completely disable the use of file extensions, you must set both of these:
* `useSuffixPatternMatching(false)`, see <<mvc-config-path-matching,PathMatchConfigurer>> * `useSuffixPatternMatching(false)`, see <<mvc-config-path-matching,PathMatchConfigurer>>
* `favorPathExtension(false)`, see <<mvc-config-content-negotiation,ContentNeogiationConfigurer>> * `favorPathExtension(false)`, see <<mvc-config-content-negotiation,ContentNegotiationConfigurer>>
URL-based content negotiation can still be useful, for example when typing a URL in a URL-based content negotiation can still be useful, for example when typing a URL in a
browser. To enable that we recommend a query parameter based strategy to avoid most of browser. To enable that we recommend a query parameter based strategy to avoid most of
the issues that come with file extensions. Or if you must use file extensions, consider the issues that come with file extensions. Or if you must use file extensions, consider
restricting them to a list of explicitly registered extensions through the restricting them to a list of explicitly registered extensions through the
`mediaTypes` property of <<mvc-config-content-negotiation,ContentNeogiationConfigurer>>. `mediaTypes` property of <<mvc-config-content-negotiation,ContentNegotiationConfigurer>>.
[[mvc-ann-requestmapping-rfd]] [[mvc-ann-requestmapping-rfd]]

Loading…
Cancel
Save