diff --git a/spring-aop/src/main/java/org/springframework/aop/aspectj/TypePatternClassFilter.java b/spring-aop/src/main/java/org/springframework/aop/aspectj/TypePatternClassFilter.java index 9d2bc141c6..d075741490 100644 --- a/spring-aop/src/main/java/org/springframework/aop/aspectj/TypePatternClassFilter.java +++ b/spring-aop/src/main/java/org/springframework/aop/aspectj/TypePatternClassFilter.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2012 the original author or authors. + * Copyright 2002-2017 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -27,6 +27,7 @@ import org.springframework.util.StringUtils; * Spring AOP {@link ClassFilter} implementation using AspectJ type matching. * * @author Rod Johnson + * @author Juergen Hoeller * @since 2.0 */ public class TypePatternClassFilter implements ClassFilter { @@ -76,17 +77,21 @@ public class TypePatternClassFilter implements ClassFilter { * or is recognized as invalid */ public void setTypePattern(String typePattern) { - Assert.notNull(typePattern); + Assert.notNull(typePattern, "Type pattern must not be null"); this.typePattern = typePattern; this.aspectJTypePatternMatcher = PointcutParser.getPointcutParserSupportingAllPrimitivesAndUsingContextClassloaderForResolution(). parseTypePattern(replaceBooleanOperators(typePattern)); } + /** + * Return the AspectJ type pattern to match. + */ public String getTypePattern() { - return typePattern; + return this.typePattern; } + /** * Should the pointcut apply to the given interface or target class? * @param clazz candidate target class @@ -95,9 +100,7 @@ public class TypePatternClassFilter implements ClassFilter { */ @Override public boolean matches(Class> clazz) { - if (this.aspectJTypePatternMatcher == null) { - throw new IllegalStateException("No 'typePattern' has been set via ctor/setter."); - } + Assert.state(this.aspectJTypePatternMatcher != null, "No type pattern has been set"); return this.aspectJTypePatternMatcher.matches(clazz); } @@ -108,9 +111,8 @@ public class TypePatternClassFilter implements ClassFilter { *
This method converts back to {@code &&} for the AspectJ pointcut parser.
*/
private String replaceBooleanOperators(String pcExpr) {
- pcExpr = StringUtils.replace(pcExpr," and "," && ");
- pcExpr = StringUtils.replace(pcExpr, " or ", " || ");
- pcExpr = StringUtils.replace(pcExpr, " not ", " ! ");
- return pcExpr;
+ String result = StringUtils.replace(pcExpr," and "," && ");
+ result = StringUtils.replace(result, " or ", " || ");
+ return StringUtils.replace(result, " not ", " ! ");
}
}
diff --git a/spring-aop/src/main/java/org/springframework/aop/framework/autoproxy/AbstractAdvisorAutoProxyCreator.java b/spring-aop/src/main/java/org/springframework/aop/framework/autoproxy/AbstractAdvisorAutoProxyCreator.java
index 92fc174bea..d7a8d1168b 100644
--- a/spring-aop/src/main/java/org/springframework/aop/framework/autoproxy/AbstractAdvisorAutoProxyCreator.java
+++ b/spring-aop/src/main/java/org/springframework/aop/framework/autoproxy/AbstractAdvisorAutoProxyCreator.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2002-2015 the original author or authors.
+ * Copyright 2002-2017 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -54,7 +54,8 @@ public abstract class AbstractAdvisorAutoProxyCreator extends AbstractAutoProxyC
public void setBeanFactory(BeanFactory beanFactory) {
super.setBeanFactory(beanFactory);
if (!(beanFactory instanceof ConfigurableListableBeanFactory)) {
- throw new IllegalStateException("Cannot use AdvisorAutoProxyCreator without a ConfigurableListableBeanFactory");
+ throw new IllegalArgumentException(
+ "AdvisorAutoProxyCreator requires a ConfigurableListableBeanFactory: " + beanFactory);
}
initBeanFactory((ConfigurableListableBeanFactory) beanFactory);
}
diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/annotation/AutowiredAnnotationBeanPostProcessor.java b/spring-beans/src/main/java/org/springframework/beans/factory/annotation/AutowiredAnnotationBeanPostProcessor.java
index f95c57cd70..ac80c0e059 100644
--- a/spring-beans/src/main/java/org/springframework/beans/factory/annotation/AutowiredAnnotationBeanPostProcessor.java
+++ b/spring-beans/src/main/java/org/springframework/beans/factory/annotation/AutowiredAnnotationBeanPostProcessor.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2002-2016 the original author or authors.
+ * Copyright 2002-2017 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -223,7 +223,7 @@ public class AutowiredAnnotationBeanPostProcessor extends InstantiationAwareBean
public void setBeanFactory(BeanFactory beanFactory) {
if (!(beanFactory instanceof ConfigurableListableBeanFactory)) {
throw new IllegalArgumentException(
- "AutowiredAnnotationBeanPostProcessor requires a ConfigurableListableBeanFactory");
+ "AutowiredAnnotationBeanPostProcessor requires a ConfigurableListableBeanFactory: " + beanFactory);
}
this.beanFactory = (ConfigurableListableBeanFactory) beanFactory;
}
diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/config/CustomScopeConfigurer.java b/spring-beans/src/main/java/org/springframework/beans/factory/config/CustomScopeConfigurer.java
index dc1516ab02..a110bc4461 100644
--- a/spring-beans/src/main/java/org/springframework/beans/factory/config/CustomScopeConfigurer.java
+++ b/spring-beans/src/main/java/org/springframework/beans/factory/config/CustomScopeConfigurer.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2002-2014 the original author or authors.
+ * Copyright 2002-2017 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -102,12 +102,12 @@ public class CustomScopeConfigurer implements BeanFactoryPostProcessor, BeanClas
}
else if (value instanceof Class) {
Class> scopeClass = (Class>) value;
- Assert.isAssignable(Scope.class, scopeClass);
+ Assert.isAssignable(Scope.class, scopeClass, "Invalid scope class");
beanFactory.registerScope(scopeKey, (Scope) BeanUtils.instantiateClass(scopeClass));
}
else if (value instanceof String) {
Class> scopeClass = ClassUtils.resolveClassName((String) value, this.beanClassLoader);
- Assert.isAssignable(Scope.class, scopeClass);
+ Assert.isAssignable(Scope.class, scopeClass, "Invalid scope class");
beanFactory.registerScope(scopeKey, (Scope) BeanUtils.instantiateClass(scopeClass));
}
else {
diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractBeanFactory.java b/spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractBeanFactory.java
index ab1a92dd68..324deb7ac5 100644
--- a/spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractBeanFactory.java
+++ b/spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractBeanFactory.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2002-2016 the original author or authors.
+ * Copyright 2002-2017 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -766,7 +766,7 @@ public abstract class AbstractBeanFactory extends FactoryBeanRegistrySupport imp
@Override
public void registerCustomEditor(Class> requiredType, Class extends PropertyEditor> propertyEditorClass) {
Assert.notNull(requiredType, "Required type must not be null");
- Assert.isAssignable(PropertyEditor.class, propertyEditorClass);
+ Assert.notNull(propertyEditorClass, "PropertyEditor class must not be null");
this.customEditors.put(requiredType, propertyEditorClass);
}
diff --git a/spring-context-support/src/main/java/org/springframework/cache/jcache/interceptor/DefaultCacheInvocationContext.java b/spring-context-support/src/main/java/org/springframework/cache/jcache/interceptor/DefaultCacheInvocationContext.java
index 64d4d2c2ee..a54429203b 100644
--- a/spring-context-support/src/main/java/org/springframework/cache/jcache/interceptor/DefaultCacheInvocationContext.java
+++ b/spring-context-support/src/main/java/org/springframework/cache/jcache/interceptor/DefaultCacheInvocationContext.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2002-2014 the original author or authors.
+ * Copyright 2002-2017 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -44,14 +44,15 @@ class DefaultCacheInvocationContext
private final CacheInvocationParameter[] allParameters;
- public DefaultCacheInvocationContext(JCacheOperation operation,
- Object target, Object[] args) {
+
+ public DefaultCacheInvocationContext(JCacheOperation operation, Object target, Object[] args) {
this.operation = operation;
this.target = target;
this.args = args;
this.allParameters = operation.getAllParameters(args);
}
+
@Override
public JCacheOperation getOperation() {
return this.operation;
@@ -94,17 +95,19 @@ class DefaultCacheInvocationContext
@Override
public Requires JOpt version 4.3 or higher. Tested against JOpt up until 4.6.
+ * Requires JOpt Simple version 4.3 or higher. Tested against JOpt up until 5.0.
*
* @author Chris Beams
* @author Juergen Hoeller
@@ -98,7 +98,7 @@ public class JOptCommandLinePropertySource extends CommandLinePropertySource Note: Does not complain if the array is empty!
+ * Call {@link #isTrue} if you wish to throw an {@code IllegalArgumentException}
+ * on an assertion failure.
* Call {@link #isTrue(boolean)} if you wish to
- * throw {@link IllegalArgumentException} on an assertion failure.
- * Typical usage
+ *
* Configure and execute an {@code OptionParser} against the {@code String[]} of arguments
* supplied to the {@code main} method, and create a {@link JOptCommandLinePropertySource}
* using the resulting {@code OptionSet} object:
+ *
*
* public static void main(String[] args) {
* OptionParser parser = new OptionParser();
@@ -44,7 +44,7 @@ import org.springframework.util.Assert;
*
* See {@link CommandLinePropertySource} for complete general usage examples.
*
- * Assert.isTrue(i > 0, "The value must be greater than zero");
* @param expression a boolean expression
* @param message the exception message to use if the assertion fails
- * @throws IllegalArgumentException if expression is {@code false}
+ * @throws IllegalArgumentException if {@code expression} is {@code false}
*/
public static void isTrue(boolean expression, String message) {
if (!expression) {
@@ -70,18 +70,15 @@ public abstract class Assert {
}
/**
- * Assert a boolean expression, throwing {@code IllegalArgumentException}
- * if the test result is {@code false}.
- * Assert.isTrue(i > 0);
- * @param expression a boolean expression
- * @throws IllegalArgumentException if expression is {@code false}
+ * @deprecated as of 4.3.7, in favor of {@link #isTrue(boolean, String)}
*/
+ @Deprecated
public static void isTrue(boolean expression) {
isTrue(expression, "[Assertion failed] - this expression must be true");
}
/**
- * Assert that an object is {@code null} .
+ * Assert that an object is {@code null}.
* Assert.isNull(value, "The value must be null");
* @param object the object to check
* @param message the exception message to use if the assertion fails
@@ -94,17 +91,15 @@ public abstract class Assert {
}
/**
- * Assert that an object is {@code null} .
- * Assert.isNull(value);
- * @param object the object to check
- * @throws IllegalArgumentException if the object is not {@code null}
+ * @deprecated as of 4.3.7, in favor of {@link #isNull(Object, String)}
*/
+ @Deprecated
public static void isNull(Object object) {
isNull(object, "[Assertion failed] - the object argument must be null");
}
/**
- * Assert that an object is not {@code null} .
+ * Assert that an object is not {@code null}.
* Assert.notNull(clazz, "The class must not be null");
* @param object the object to check
* @param message the exception message to use if the assertion fails
@@ -117,11 +112,9 @@ public abstract class Assert {
}
/**
- * Assert that an object is not {@code null} .
- * Assert.notNull(clazz);
- * @param object the object to check
- * @throws IllegalArgumentException if the object is {@code null}
+ * @deprecated as of 4.3.7, in favor of {@link #notNull(Object, String)}
*/
+ @Deprecated
public static void notNull(Object object) {
notNull(object, "[Assertion failed] - this argument is required; it must not be null");
}
@@ -142,20 +135,16 @@ public abstract class Assert {
}
/**
- * Assert that the given String is not empty; that is,
- * it must not be {@code null} and not the empty String.
- * Assert.hasLength(name);
- * @param text the String to check
- * @see StringUtils#hasLength
- * @throws IllegalArgumentException if the text is empty
+ * @deprecated as of 4.3.7, in favor of {@link #hasLength(String, String)}
*/
+ @Deprecated
public static void hasLength(String text) {
hasLength(text,
"[Assertion failed] - this String argument must have length; it must not be null or empty");
}
/**
- * Assert that the given String has valid text content; that is, it must not
+ * Assert that the given String contains valid text content; that is, it must not
* be {@code null} and must contain at least one non-whitespace character.
* Assert.hasText(name, "'name' must not be empty");
* @param text the String to check
@@ -170,13 +159,9 @@ public abstract class Assert {
}
/**
- * Assert that the given String has valid text content; that is, it must not
- * be {@code null} and must contain at least one non-whitespace character.
- * Assert.hasText(name, "'name' must not be empty");
- * @param text the String to check
- * @see StringUtils#hasText
- * @throws IllegalArgumentException if the text does not contain valid text content
+ * @deprecated as of 4.3.7, in favor of {@link #hasText(String, String)}
*/
+ @Deprecated
public static void hasText(String text) {
hasText(text,
"[Assertion failed] - this String argument must have text; it must not be null, empty, or blank");
@@ -198,24 +183,21 @@ public abstract class Assert {
}
/**
- * Assert that the given text does not contain the given substring.
- * Assert.doesNotContain(name, "rod");
- * @param textToSearch the text to search
- * @param substring the substring to find within the text
- * @throws IllegalArgumentException if the text contains the substring
+ * @deprecated as of 4.3.7, in favor of {@link #doesNotContain(String, String, String)}
*/
+ @Deprecated
public static void doesNotContain(String textToSearch, String substring) {
doesNotContain(textToSearch, substring,
"[Assertion failed] - this String argument must not contain the substring [" + substring + "]");
}
/**
- * Assert that an array has elements; that is, it must not be
- * {@code null} and must have at least one element.
- * Assert.notEmpty(array, "The array must have elements");
+ * Assert that an array contains elements; that is, it must not be
+ * {@code null} and must contain at least one element.
+ * Assert.notEmpty(array, "The array must contain elements");
* @param array the array to check
* @param message the exception message to use if the assertion fails
- * @throws IllegalArgumentException if the object array is {@code null} or has no elements
+ * @throws IllegalArgumentException if the object array is {@code null} or contains no elements
*/
public static void notEmpty(Object[] array, String message) {
if (ObjectUtils.isEmpty(array)) {
@@ -224,20 +206,17 @@ public abstract class Assert {
}
/**
- * Assert that an array has elements; that is, it must not be
- * {@code null} and must have at least one element.
- * Assert.notEmpty(array);
- * @param array the array to check
- * @throws IllegalArgumentException if the object array is {@code null} or has no elements
+ * @deprecated as of 4.3.7, in favor of {@link #notEmpty(Object[], String)}
*/
+ @Deprecated
public static void notEmpty(Object[] array) {
notEmpty(array, "[Assertion failed] - this array must not be empty: it must contain at least 1 element");
}
/**
- * Assert that an array has no null elements.
- * Note: Does not complain if the array is empty!
- * Assert.noNullElements(array, "The array must have non-null elements");
+ * Assert that an array contains no {@code null} elements.
+ * Assert.noNullElements(array, "The array must contain non-null elements");
* @param array the array to check
* @param message the exception message to use if the assertion fails
* @throws IllegalArgumentException if the object array contains a {@code null} element
@@ -253,23 +232,21 @@ public abstract class Assert {
}
/**
- * Assert that an array has no null elements.
- * Note: Does not complain if the array is empty!
- * Assert.noNullElements(array);
- * @param array the array to check
- * @throws IllegalArgumentException if the object array contains a {@code null} element
+ * @deprecated as of 4.3.7, in favor of {@link #noNullElements(Object[], String)}
*/
+ @Deprecated
public static void noNullElements(Object[] array) {
noNullElements(array, "[Assertion failed] - this array must not contain any null elements");
}
/**
- * Assert that a collection has elements; that is, it must not be
- * {@code null} and must have at least one element.
- * Assert.notEmpty(collection, "Collection must have elements");
+ * Assert that a collection contains elements; that is, it must not be
+ * {@code null} and must contain at least one element.
+ * Assert.notEmpty(collection, "Collection must contain elements");
* @param collection the collection to check
* @param message the exception message to use if the assertion fails
- * @throws IllegalArgumentException if the collection is {@code null} or has no elements
+ * @throws IllegalArgumentException if the collection is {@code null} or
+ * contains no elements
*/
public static void notEmpty(Collection> collection, String message) {
if (CollectionUtils.isEmpty(collection)) {
@@ -278,24 +255,21 @@ public abstract class Assert {
}
/**
- * Assert that a collection has elements; that is, it must not be
- * {@code null} and must have at least one element.
- * Assert.notEmpty(collection, "Collection must have elements");
- * @param collection the collection to check
- * @throws IllegalArgumentException if the collection is {@code null} or has no elements
+ * @deprecated as of 4.3.7, in favor of {@link #notEmpty(Collection, String)}
*/
+ @Deprecated
public static void notEmpty(Collection> collection) {
notEmpty(collection,
"[Assertion failed] - this collection must not be empty: it must contain at least 1 element");
}
/**
- * Assert that a Map has entries; that is, it must not be {@code null}
- * and must have at least one entry.
- * Assert.notEmpty(map, "Map must have entries");
+ * Assert that a Map contains entries; that is, it must not be {@code null}
+ * and must contain at least one entry.
+ * Assert.notEmpty(map, "Map must contain entries");
* @param map the map to check
* @param message the exception message to use if the assertion fails
- * @throws IllegalArgumentException if the map is {@code null} or has no entries
+ * @throws IllegalArgumentException if the map is {@code null} or contains no entries
*/
public static void notEmpty(Map, ?> map, String message) {
if (CollectionUtils.isEmpty(map)) {
@@ -304,26 +278,31 @@ public abstract class Assert {
}
/**
- * Assert that a Map has entries; that is, it must not be {@code null}
- * and must have at least one entry.
- * Assert.notEmpty(map);
- * @param map the map to check
- * @throws IllegalArgumentException if the map is {@code null} or has no entries
+ * @deprecated as of 4.3.7, in favor of {@link #notEmpty(Map, String)}
*/
+ @Deprecated
public static void notEmpty(Map, ?> map) {
notEmpty(map, "[Assertion failed] - this map must not be empty; it must contain at least one entry");
}
/**
* Assert that the provided object is an instance of the provided class.
- * Assert.instanceOf(Foo.class, foo);
- * @param clazz the required class
+ * Assert.instanceOf(Foo.class, foo, "Processing Foo:");
+ * @param type the type to check against
* @param obj the object to check
- * @throws IllegalArgumentException if the object is not an instance of clazz
+ * @param message a message which will be prepended to the message generated
+ * by this method in order to provide further context. It should normally end
+ * in ":" or "." so that the generated message looks OK when appended to it.
+ * @throws IllegalArgumentException if the object is not an instance of type
* @see Class#isInstance
*/
- public static void isInstanceOf(Class> clazz, Object obj) {
- isInstanceOf(clazz, obj, "");
+ public static void isInstanceOf(Class> type, Object obj, String message) {
+ notNull(type, "Type to check against must not be null");
+ if (!type.isInstance(obj)) {
+ String className = (obj != null ? obj.getClass().getName() : "null");
+ throw new IllegalArgumentException(StringUtils.hasLength(message) ? message + ": " + className :
+ "Object of class [" + className + "] must be an instance of " + type);
+ }
}
/**
@@ -331,20 +310,28 @@ public abstract class Assert {
* Assert.instanceOf(Foo.class, foo);
* @param type the type to check against
* @param obj the object to check
- * @param message a message which will be prepended to the message produced by
- * the function itself, and which may be used to provide context. It should
- * normally end in ":" or "." so that the generated message looks OK when
- * appended to it.
- * @throws IllegalArgumentException if the object is not an instance of clazz
+ * @throws IllegalArgumentException if the object is not an instance of type
* @see Class#isInstance
*/
- public static void isInstanceOf(Class> type, Object obj, String message) {
- notNull(type, "Type to check against must not be null");
- if (!type.isInstance(obj)) {
- throw new IllegalArgumentException(
- (StringUtils.hasLength(message) ? message + " " : "") +
- "Object of class [" + (obj != null ? obj.getClass().getName() : "null") +
- "] must be an instance of " + type);
+ public static void isInstanceOf(Class> type, Object obj) {
+ isInstanceOf(type, obj, "");
+ }
+
+ /**
+ * Assert that {@code superType.isAssignableFrom(subType)} is {@code true}.
+ * Assert.isAssignable(Number.class, myClass);
+ * @param superType the super type to check against
+ * @param subType the sub type to check
+ * @param message a message which will be prepended to the message generated
+ * by this method in order to provide further context. It should normally end
+ * in ":" or "." so that the generated message looks OK when appended to it.
+ * @throws IllegalArgumentException if the classes are not assignable
+ */
+ public static void isAssignable(Class> superType, Class> subType, String message) {
+ notNull(superType, "Super type to check against must not be null");
+ if (subType == null || !superType.isAssignableFrom(subType)) {
+ throw new IllegalArgumentException(StringUtils.hasLength(message) ? message + ": " + subType :
+ subType + " is not assignable to " + superType);
}
}
@@ -360,32 +347,14 @@ public abstract class Assert {
}
/**
- * Assert that {@code superType.isAssignableFrom(subType)} is {@code true}.
- * Assert.isAssignable(Number.class, myClass);
- * @param superType the super type to check against
- * @param subType the sub type to check
- * @param message a message which will be prepended to the message produced by
- * the function itself, and which may be used to provide context. It should
- * normally end in ":" or "." so that the generated message looks OK when
- * appended to it.
- * @throws IllegalArgumentException if the classes are not assignable
- */
- public static void isAssignable(Class> superType, Class> subType, String message) {
- notNull(superType, "Type to check against must not be null");
- if (subType == null || !superType.isAssignableFrom(subType)) {
- throw new IllegalArgumentException((StringUtils.hasLength(message) ? message + " " : "") +
- subType + " is not assignable to " + superType);
- }
- }
-
- /**
- * Assert a boolean expression, throwing {@code IllegalStateException}
- * if the test result is {@code false}. Call isTrue if you wish to
- * throw IllegalArgumentException on an assertion failure.
+ * Assert a boolean expression, throwing an {@code IllegalStateException}
+ * if the expression evaluates to {@code false}.
+ * Assert.state(id == null, "The id property must not already be initialized");
* @param expression a boolean expression
* @param message the exception message to use if the assertion fails
- * @throws IllegalStateException if expression is {@code false}
+ * @throws IllegalStateException if {@code expression} is {@code false}
*/
public static void state(boolean expression, String message) {
if (!expression) {
@@ -394,14 +363,9 @@ public abstract class Assert {
}
/**
- * Assert a boolean expression, throwing {@link IllegalStateException}
- * if the test result is {@code false}.
- * Assert.state(id == null);
- * @param expression a boolean expression
- * @throws IllegalStateException if the supplied expression is {@code false}
+ * @deprecated as of 4.3.7, in favor of {@link #state(boolean, String)}
*/
+ @Deprecated
public static void state(boolean expression) {
state(expression, "[Assertion failed] - this state invariant must be true");
}
diff --git a/spring-core/src/main/java/org/springframework/util/ConcurrentReferenceHashMap.java b/spring-core/src/main/java/org/springframework/util/ConcurrentReferenceHashMap.java
index 7710ed273d..ff2c36717a 100644
--- a/spring-core/src/main/java/org/springframework/util/ConcurrentReferenceHashMap.java
+++ b/spring-core/src/main/java/org/springframework/util/ConcurrentReferenceHashMap.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2002-2016 the original author or authors.
+ * Copyright 2002-2017 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -903,7 +903,7 @@ public class ConcurrentReferenceHashMap