diff --git a/spring-aop/src/main/java/org/springframework/aop/config/AbstractInterceptorDrivenBeanDefinitionDecorator.java b/spring-aop/src/main/java/org/springframework/aop/config/AbstractInterceptorDrivenBeanDefinitionDecorator.java index 65169d1a8d..6495f25af9 100644 --- a/spring-aop/src/main/java/org/springframework/aop/config/AbstractInterceptorDrivenBeanDefinitionDecorator.java +++ b/spring-aop/src/main/java/org/springframework/aop/config/AbstractInterceptorDrivenBeanDefinitionDecorator.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2012 the original author or authors. + * Copyright 2002-2016 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. @@ -71,7 +71,7 @@ public abstract class AbstractInterceptorDrivenBeanDefinitionDecorator implement BeanDefinition interceptorDefinition = createInterceptorDefinition(node); // generate name and register the interceptor - String interceptorName = existingBeanName + "." + getInterceptorNameSuffix(interceptorDefinition); + String interceptorName = existingBeanName + '.' + getInterceptorNameSuffix(interceptorDefinition); BeanDefinitionReaderUtils.registerBeanDefinition( new BeanDefinitionHolder(interceptorDefinition, interceptorName), registry); diff --git a/spring-aop/src/main/java/org/springframework/aop/interceptor/CustomizableTraceInterceptor.java b/spring-aop/src/main/java/org/springframework/aop/interceptor/CustomizableTraceInterceptor.java index f8b19cb71f..4fbf04a0c2 100644 --- a/spring-aop/src/main/java/org/springframework/aop/interceptor/CustomizableTraceInterceptor.java +++ b/spring-aop/src/main/java/org/springframework/aop/interceptor/CustomizableTraceInterceptor.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2013 the original author or authors. + * Copyright 2002-2016 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. @@ -246,7 +246,7 @@ public class CustomizableTraceInterceptor extends AbstractTraceInterceptor { */ @Override protected Object invokeUnderTrace(MethodInvocation invocation, Log logger) throws Throwable { - String name = invocation.getMethod().getDeclaringClass().getName() + "." + invocation.getMethod().getName(); + String name = ClassUtils.getQualifiedMethodName(invocation.getMethod()); StopWatch stopWatch = new StopWatch(name); Object returnValue = null; boolean exitThroughException = false; diff --git a/spring-aop/src/main/java/org/springframework/aop/support/AbstractRegexpMethodPointcut.java b/spring-aop/src/main/java/org/springframework/aop/support/AbstractRegexpMethodPointcut.java index e610410153..537969b8ef 100644 --- a/spring-aop/src/main/java/org/springframework/aop/support/AbstractRegexpMethodPointcut.java +++ b/spring-aop/src/main/java/org/springframework/aop/support/AbstractRegexpMethodPointcut.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2013 the original author or authors. + * Copyright 2002-2016 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. @@ -21,6 +21,7 @@ import java.lang.reflect.Method; import java.util.Arrays; import org.springframework.util.Assert; +import org.springframework.util.ClassUtils; import org.springframework.util.ObjectUtils; import org.springframework.util.StringUtils; @@ -129,8 +130,8 @@ public abstract class AbstractRegexpMethodPointcut extends StaticMethodMatcherPo */ @Override public boolean matches(Method method, Class targetClass) { - return ((targetClass != null && matchesPattern(targetClass.getName() + "." + method.getName())) || - matchesPattern(method.getDeclaringClass().getName() + "." + method.getName())); + return ((targetClass != null && matchesPattern(ClassUtils.getQualifiedMethodName(method, targetClass))) || + matchesPattern(ClassUtils.getQualifiedMethodName(method))); } /** diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/annotation/InitDestroyAnnotationBeanPostProcessor.java b/spring-beans/src/main/java/org/springframework/beans/factory/annotation/InitDestroyAnnotationBeanPostProcessor.java index b017ad7927..d1abb0021b 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/annotation/InitDestroyAnnotationBeanPostProcessor.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/annotation/InitDestroyAnnotationBeanPostProcessor.java @@ -40,6 +40,7 @@ import org.springframework.beans.factory.support.MergedBeanDefinitionPostProcess import org.springframework.beans.factory.support.RootBeanDefinition; import org.springframework.core.Ordered; import org.springframework.core.PriorityOrdered; +import org.springframework.util.ClassUtils; import org.springframework.util.ReflectionUtils; /** @@ -349,7 +350,7 @@ public class InitDestroyAnnotationBeanPostProcessor } this.method = method; this.identifier = (Modifier.isPrivate(method.getModifiers()) ? - method.getDeclaringClass() + "." + method.getName() : method.getName()); + ClassUtils.getQualifiedMethodName(method) : method.getName()); } public Method getMethod() { diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/config/YamlProcessor.java b/spring-beans/src/main/java/org/springframework/beans/factory/config/YamlProcessor.java index 2734a0e638..88bbf6b634 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/config/YamlProcessor.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/config/YamlProcessor.java @@ -280,7 +280,7 @@ public abstract class YamlProcessor { key = path + key; } else { - key = path + "." + key; + key = path + '.' + key; } } Object value = entry.getValue(); diff --git a/spring-context-support/src/main/java/org/springframework/cache/ehcache/EhCacheCache.java b/spring-context-support/src/main/java/org/springframework/cache/ehcache/EhCacheCache.java index f1b7fd9274..38a93b8827 100644 --- a/spring-context-support/src/main/java/org/springframework/cache/ehcache/EhCacheCache.java +++ b/spring-context-support/src/main/java/org/springframework/cache/ehcache/EhCacheCache.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2015 the original author or authors. + * Copyright 2002-2016 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. @@ -98,7 +98,7 @@ public class EhCacheCache implements Cache { try { value = valueLoader.call(); } - catch (Exception ex) { + catch (Throwable ex) { throw new ValueRetrievalException(key, valueLoader, ex); } put(key, value); diff --git a/spring-context-support/src/main/java/org/springframework/scheduling/quartz/SchedulerFactoryBean.java b/spring-context-support/src/main/java/org/springframework/scheduling/quartz/SchedulerFactoryBean.java index 74a648f008..d3d7e64347 100644 --- a/spring-context-support/src/main/java/org/springframework/scheduling/quartz/SchedulerFactoryBean.java +++ b/spring-context-support/src/main/java/org/springframework/scheduling/quartz/SchedulerFactoryBean.java @@ -652,6 +652,8 @@ public class SchedulerFactoryBean extends SchedulerAccessor implements FactoryBe logger.info("Will start Quartz Scheduler [" + scheduler.getSchedulerName() + "] in " + startupDelay + " seconds"); } + // Not using the Quartz startDelayed method since we explicitly want a daemon + // thread here, not keeping the JVM alive in case of all other threads ending. Thread schedulerThread = new Thread() { @Override public void run() { diff --git a/spring-context/src/main/java/org/springframework/cache/concurrent/ConcurrentMapCache.java b/spring-context/src/main/java/org/springframework/cache/concurrent/ConcurrentMapCache.java index 9cb947f181..f174cbe7e3 100644 --- a/spring-context/src/main/java/org/springframework/cache/concurrent/ConcurrentMapCache.java +++ b/spring-context/src/main/java/org/springframework/cache/concurrent/ConcurrentMapCache.java @@ -145,7 +145,7 @@ public class ConcurrentMapCache extends AbstractValueAdaptingCache { try { return toStoreValue(valueLoader.call()); } - catch (Exception ex) { + catch (Throwable ex) { throw new ValueRetrievalException(key, valueLoader, ex); } })); diff --git a/spring-context/src/main/java/org/springframework/context/annotation/ClassPathScanningCandidateComponentProvider.java b/spring-context/src/main/java/org/springframework/context/annotation/ClassPathScanningCandidateComponentProvider.java index 967bc68efc..37a8f34b7d 100644 --- a/spring-context/src/main/java/org/springframework/context/annotation/ClassPathScanningCandidateComponentProvider.java +++ b/spring-context/src/main/java/org/springframework/context/annotation/ClassPathScanningCandidateComponentProvider.java @@ -335,7 +335,7 @@ public class ClassPathScanningCandidateComponentProvider implements EnvironmentC Set candidates = new LinkedHashSet<>(); try { String packageSearchPath = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX + - resolveBasePackage(basePackage) + "/" + this.resourcePattern; + resolveBasePackage(basePackage) + '/' + this.resourcePattern; Resource[] resources = this.resourcePatternResolver.getResources(packageSearchPath); boolean traceEnabled = logger.isTraceEnabled(); boolean debugEnabled = logger.isDebugEnabled(); diff --git a/spring-context/src/main/java/org/springframework/context/support/DefaultLifecycleProcessor.java b/spring-context/src/main/java/org/springframework/context/support/DefaultLifecycleProcessor.java index 47c7d2feb5..3c99a43dcc 100644 --- a/spring-context/src/main/java/org/springframework/context/support/DefaultLifecycleProcessor.java +++ b/spring-context/src/main/java/org/springframework/context/support/DefaultLifecycleProcessor.java @@ -142,7 +142,7 @@ public class DefaultLifecycleProcessor implements LifecycleProcessor, BeanFactor group.add(entry.getKey(), bean); } } - if (phases.size() > 0) { + if (!phases.isEmpty()) { List keys = new ArrayList<>(phases.keySet()); Collections.sort(keys); for (Integer key : keys) { @@ -195,7 +195,7 @@ public class DefaultLifecycleProcessor implements LifecycleProcessor, BeanFactor } group.add(entry.getKey(), bean); } - if (phases.size() > 0) { + if (!phases.isEmpty()) { List keys = new ArrayList<>(phases.keySet()); Collections.sort(keys, Collections.reverseOrder()); for (Integer key : keys) { diff --git a/spring-context/src/main/java/org/springframework/context/support/StaticMessageSource.java b/spring-context/src/main/java/org/springframework/context/support/StaticMessageSource.java index c301dba7c4..86205af7de 100644 --- a/spring-context/src/main/java/org/springframework/context/support/StaticMessageSource.java +++ b/spring-context/src/main/java/org/springframework/context/support/StaticMessageSource.java @@ -43,12 +43,12 @@ public class StaticMessageSource extends AbstractMessageSource { @Override protected String resolveCodeWithoutArguments(String code, Locale locale) { - return this.messages.get(code + "_" + locale.toString()); + return this.messages.get(code + '_' + locale.toString()); } @Override protected MessageFormat resolveCode(String code, Locale locale) { - String key = code + "_" + locale.toString(); + String key = code + '_' + locale.toString(); String msg = this.messages.get(key); if (msg == null) { return null; @@ -73,7 +73,7 @@ public class StaticMessageSource extends AbstractMessageSource { Assert.notNull(code, "Code must not be null"); Assert.notNull(locale, "Locale must not be null"); Assert.notNull(msg, "Message must not be null"); - this.messages.put(code + "_" + locale.toString(), msg); + this.messages.put(code + '_' + locale.toString(), msg); if (logger.isDebugEnabled()) { logger.debug("Added message [" + msg + "] for code [" + code + "] and Locale [" + locale + "]"); } diff --git a/spring-context/src/main/java/org/springframework/scheduling/annotation/EnableAsync.java b/spring-context/src/main/java/org/springframework/scheduling/annotation/EnableAsync.java index f6b24a353e..8b7eb4c026 100644 --- a/spring-context/src/main/java/org/springframework/scheduling/annotation/EnableAsync.java +++ b/spring-context/src/main/java/org/springframework/scheduling/annotation/EnableAsync.java @@ -32,7 +32,9 @@ import org.springframework.core.Ordered; * Enables Spring's asynchronous method execution capability, similar to functionality * found in Spring's {@code } XML namespace. * - *

To be used together with @{@link Configuration Configuration} classes as follows: + *

To be used together with @{@link Configuration Configuration} classes as follows, + * enabling annotation-driven async processing for an entire Spring application context: + * *

  * @Configuration
  * @EnableAsync
@@ -45,6 +47,7 @@ import org.springframework.core.Ordered;
  * annotation, or any custom annotation specified via the {@link #annotation} attribute.
  * The aspect is added transparently for any registered bean, for instance via this
  * configuration:
+ *
  * 
  * @Configuration
  * public class AnotherAppConfig {
diff --git a/spring-core/src/main/java/org/springframework/core/Conventions.java b/spring-core/src/main/java/org/springframework/core/Conventions.java
index f016df5d10..340cd3b9b7 100644
--- a/spring-core/src/main/java/org/springframework/core/Conventions.java
+++ b/spring-core/src/main/java/org/springframework/core/Conventions.java
@@ -241,7 +241,7 @@ public abstract class Conventions {
 	public static String getQualifiedAttributeName(Class enclosingClass, String attributeName) {
 		Assert.notNull(enclosingClass, "'enclosingClass' must not be null");
 		Assert.notNull(attributeName, "'attributeName' must not be null");
-		return enclosingClass.getName() + "." + attributeName;
+		return enclosingClass.getName() + '.' + attributeName;
 	}
 
 
diff --git a/spring-core/src/main/java/org/springframework/core/codec/ResourceRegionEncoder.java b/spring-core/src/main/java/org/springframework/core/codec/ResourceRegionEncoder.java
index 273511011c..2b3753dd52 100644
--- a/spring-core/src/main/java/org/springframework/core/codec/ResourceRegionEncoder.java
+++ b/spring-core/src/main/java/org/springframework/core/codec/ResourceRegionEncoder.java
@@ -37,7 +37,6 @@ import org.springframework.core.io.support.ResourceRegion;
 import org.springframework.util.Assert;
 import org.springframework.util.MimeType;
 import org.springframework.util.MimeTypeUtils;
-import org.springframework.util.ResourceUtils;
 import org.springframework.util.StreamUtils;
 
 /**
@@ -73,6 +72,7 @@ public class ResourceRegionEncoder extends AbstractEncoder {
 	}
 
 	@Override
+	@SuppressWarnings("unchecked")
 	public Flux encode(Publisher inputStream,
 			DataBufferFactory bufferFactory, ResolvableType elementType, MimeType mimeType, Map hints) {
 
@@ -138,10 +138,10 @@ public class ResourceRegionEncoder extends AbstractEncoder {
 		long end = start + region.getCount() - 1;
 		OptionalLong contentLength = contentLength(region.getResource());
 		if (contentLength.isPresent()) {
-			return getAsciiBytes("Content-Range: bytes " + start + "-" + end + "/" + contentLength.getAsLong() + "\r\n\r\n");
+			return getAsciiBytes("Content-Range: bytes " + start + '-' + end + '/' + contentLength.getAsLong() + "\r\n\r\n");
 		}
 		else {
-			return getAsciiBytes("Content-Range: bytes " + start + "-" + end + "\r\n\r\n");
+			return getAsciiBytes("Content-Range: bytes " + start + '-' + end + "\r\n\r\n");
 		}
 	}
 
diff --git a/spring-expression/src/main/java/org/springframework/expression/spel/ast/FunctionReference.java b/spring-expression/src/main/java/org/springframework/expression/spel/ast/FunctionReference.java
index d185553a4b..28b8ab83e8 100644
--- a/spring-expression/src/main/java/org/springframework/expression/spel/ast/FunctionReference.java
+++ b/spring-expression/src/main/java/org/springframework/expression/spel/ast/FunctionReference.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2002-2015 the original author or authors.
+ * Copyright 2002-2016 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.
@@ -30,6 +30,7 @@ import org.springframework.expression.spel.ExpressionState;
 import org.springframework.expression.spel.SpelEvaluationException;
 import org.springframework.expression.spel.SpelMessage;
 import org.springframework.expression.spel.support.ReflectionHelper;
+import org.springframework.util.ClassUtils;
 import org.springframework.util.ReflectionUtils;
 
 /**
@@ -103,8 +104,7 @@ public class FunctionReference extends SpelNodeImpl {
 		// Only static methods can be called in this way
 		if (!Modifier.isStatic(method.getModifiers())) {
 			throw new SpelEvaluationException(getStartPosition(),
-					SpelMessage.FUNCTION_MUST_BE_STATIC,
-					method.getDeclaringClass().getName() + "." + method.getName(), this.name);
+					SpelMessage.FUNCTION_MUST_BE_STATIC, ClassUtils.getQualifiedMethodName(method), this.name);
 		}
 
 		argumentConversionOccurred = false;
diff --git a/spring-expression/src/main/java/org/springframework/expression/spel/support/StandardTypeLocator.java b/spring-expression/src/main/java/org/springframework/expression/spel/support/StandardTypeLocator.java
index fe8543b245..81f4bf93c8 100644
--- a/spring-expression/src/main/java/org/springframework/expression/spel/support/StandardTypeLocator.java
+++ b/spring-expression/src/main/java/org/springframework/expression/spel/support/StandardTypeLocator.java
@@ -105,7 +105,7 @@ public class StandardTypeLocator implements TypeLocator {
 		}
 		for (String prefix : this.knownPackagePrefixes) {
 			try {
-				nameToLookup = prefix + "." + typeName;
+				nameToLookup = prefix + '.' + typeName;
 				return ClassUtils.forName(nameToLookup, this.classLoader);
 			}
 			catch (ClassNotFoundException ex) {
diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/core/metadata/GenericCallMetaDataProvider.java b/spring-jdbc/src/main/java/org/springframework/jdbc/core/metadata/GenericCallMetaDataProvider.java
index 7865848f91..4cda871d2d 100644
--- a/spring-jdbc/src/main/java/org/springframework/jdbc/core/metadata/GenericCallMetaDataProvider.java
+++ b/spring-jdbc/src/main/java/org/springframework/jdbc/core/metadata/GenericCallMetaDataProvider.java
@@ -316,8 +316,8 @@ public class GenericCallMetaDataProvider implements CallMetaDataProvider {
 		String metaDataSchemaName = metaDataSchemaNameToUse(schemaName);
 		String metaDataProcedureName = procedureNameToUse(procedureName);
 		if (logger.isDebugEnabled()) {
-			logger.debug("Retrieving metadata for " + metaDataCatalogName + "/" +
-					metaDataSchemaName + "/" + metaDataProcedureName);
+			logger.debug("Retrieving metadata for " + metaDataCatalogName + '/' +
+					metaDataSchemaName + '/' + metaDataProcedureName);
 		}
 
 		ResultSet procs = null;
@@ -325,8 +325,8 @@ public class GenericCallMetaDataProvider implements CallMetaDataProvider {
 			procs = databaseMetaData.getProcedures(metaDataCatalogName, metaDataSchemaName, metaDataProcedureName);
 			List found = new ArrayList<>();
 			while (procs.next()) {
-				found.add(procs.getString("PROCEDURE_CAT") + "." + procs.getString("PROCEDURE_SCHEM") +
-						"." + procs.getString("PROCEDURE_NAME"));
+				found.add(procs.getString("PROCEDURE_CAT") + '.' + procs.getString("PROCEDURE_SCHEM") +
+						'.' + procs.getString("PROCEDURE_NAME"));
 			}
 			procs.close();
 
diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/core/metadata/GenericTableMetaDataProvider.java b/spring-jdbc/src/main/java/org/springframework/jdbc/core/metadata/GenericTableMetaDataProvider.java
index c6d6e589c0..14176972c0 100644
--- a/spring-jdbc/src/main/java/org/springframework/jdbc/core/metadata/GenericTableMetaDataProvider.java
+++ b/spring-jdbc/src/main/java/org/springframework/jdbc/core/metadata/GenericTableMetaDataProvider.java
@@ -371,8 +371,8 @@ public class GenericTableMetaDataProvider implements TableMetaDataProvider {
 		String metaDataSchemaName = metaDataSchemaNameToUse(tmd.getSchemaName());
 		String metaDataTableName = tableNameToUse(tmd.getTableName());
 		if (logger.isDebugEnabled()) {
-			logger.debug("Retrieving metadata for " + metaDataCatalogName + "/" +
-					metaDataSchemaName + "/" + metaDataTableName);
+			logger.debug("Retrieving metadata for " + metaDataCatalogName + '/' +
+					metaDataSchemaName + '/' + metaDataTableName);
 		}
 		try {
 			tableColumns = databaseMetaData.getColumns(
diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/core/support/JdbcBeanDefinitionReader.java b/spring-jdbc/src/main/java/org/springframework/jdbc/core/support/JdbcBeanDefinitionReader.java
index ade0a18a26..2af81dd56f 100644
--- a/spring-jdbc/src/main/java/org/springframework/jdbc/core/support/JdbcBeanDefinitionReader.java
+++ b/spring-jdbc/src/main/java/org/springframework/jdbc/core/support/JdbcBeanDefinitionReader.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2002-2012 the original author or authors.
+ * Copyright 2002-2016 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.
@@ -112,7 +112,7 @@ public class JdbcBeanDefinitionReader {
 				String property = rs.getString(2);
 				String value = rs.getString(3);
 				// Make a properties entry by combining bean name and property.
-				props.setProperty(beanName + "." + property, value);
+				props.setProperty(beanName + '.' + property, value);
 			}
 		});
 		this.propReader.registerBeanDefinitions(props);
diff --git a/spring-messaging/src/main/java/org/springframework/messaging/handler/invocation/InvocableHandlerMethod.java b/spring-messaging/src/main/java/org/springframework/messaging/handler/invocation/InvocableHandlerMethod.java
index 82932ca8a6..584fa91a2d 100644
--- a/spring-messaging/src/main/java/org/springframework/messaging/handler/invocation/InvocableHandlerMethod.java
+++ b/spring-messaging/src/main/java/org/springframework/messaging/handler/invocation/InvocableHandlerMethod.java
@@ -28,6 +28,7 @@ import org.springframework.core.ParameterNameDiscoverer;
 import org.springframework.core.ResolvableType;
 import org.springframework.messaging.Message;
 import org.springframework.messaging.handler.HandlerMethod;
+import org.springframework.util.ClassUtils;
 import org.springframework.util.ReflectionUtils;
 
 /**
@@ -106,15 +107,13 @@ public class InvocableHandlerMethod extends HandlerMethod {
 	public Object invoke(Message message, Object... providedArgs) throws Exception {
 		Object[] args = getMethodArgumentValues(message, providedArgs);
 		if (logger.isTraceEnabled()) {
-			StringBuilder sb = new StringBuilder("Invoking [");
-			sb.append(getBeanType().getSimpleName()).append(".");
-			sb.append(getMethod().getName()).append("] method with arguments ");
-			sb.append(Arrays.asList(args));
-			logger.trace(sb.toString());
+			logger.trace("Invoking '" + ClassUtils.getQualifiedMethodName(getMethod(), getBeanType()) +
+					"' with arguments " + Arrays.toString(args));
 		}
 		Object returnValue = doInvoke(args);
 		if (logger.isTraceEnabled()) {
-			logger.trace("Method [" + getMethod().getName() + "] returned [" + returnValue + "]");
+			logger.trace("Method [" + ClassUtils.getQualifiedMethodName(getMethod(), getBeanType()) +
+					"] returned [" + returnValue + "]");
 		}
 		return returnValue;
 	}
diff --git a/spring-messaging/src/main/java/org/springframework/messaging/simp/annotation/support/SendToMethodReturnValueHandler.java b/spring-messaging/src/main/java/org/springframework/messaging/simp/annotation/support/SendToMethodReturnValueHandler.java
index dd473a2621..5268d925a1 100644
--- a/spring-messaging/src/main/java/org/springframework/messaging/simp/annotation/support/SendToMethodReturnValueHandler.java
+++ b/spring-messaging/src/main/java/org/springframework/messaging/simp/annotation/support/SendToMethodReturnValueHandler.java
@@ -133,13 +133,11 @@ public class SendToMethodReturnValueHandler implements HandlerMethodReturnValueH
 
 	@Override
 	public boolean supportsReturnType(MethodParameter returnType) {
-		if (returnType.hasMethodAnnotation(SendTo.class) ||
+		return (returnType.hasMethodAnnotation(SendTo.class) ||
 				AnnotatedElementUtils.hasAnnotation(returnType.getDeclaringClass(), SendTo.class) ||
 				returnType.hasMethodAnnotation(SendToUser.class) ||
-				AnnotatedElementUtils.hasAnnotation(returnType.getDeclaringClass(), SendToUser.class)) {
-			return true;
-		}
-		return !this.annotationRequired;
+				AnnotatedElementUtils.hasAnnotation(returnType.getDeclaringClass(), SendToUser.class) ||
+				!this.annotationRequired);
 	}
 
 	@Override
@@ -188,56 +186,34 @@ public class SendToMethodReturnValueHandler implements HandlerMethodReturnValueH
 	}
 
 	private Object findAnnotation(MethodParameter returnType) {
-		Annotation[] annot = new Annotation[4];
-		annot[0] = AnnotatedElementUtils.findMergedAnnotation(returnType.getMethod(), SendToUser.class);
-		annot[1] = AnnotatedElementUtils.findMergedAnnotation(returnType.getMethod(), SendTo.class);
-		annot[2] = AnnotatedElementUtils.findMergedAnnotation(returnType.getDeclaringClass(), SendToUser.class);
-		annot[3] = AnnotatedElementUtils.findMergedAnnotation(returnType.getDeclaringClass(), SendTo.class);
+		Annotation[] anns = new Annotation[4];
+		anns[0] = AnnotatedElementUtils.findMergedAnnotation(returnType.getMethod(), SendToUser.class);
+		anns[1] = AnnotatedElementUtils.findMergedAnnotation(returnType.getMethod(), SendTo.class);
+		anns[2] = AnnotatedElementUtils.findMergedAnnotation(returnType.getDeclaringClass(), SendToUser.class);
+		anns[3] = AnnotatedElementUtils.findMergedAnnotation(returnType.getDeclaringClass(), SendTo.class);
 
-		if (annot[0] != null && !ObjectUtils.isEmpty(((SendToUser) annot[0]).value())) {
-			return annot[0];
+		if (anns[0] != null && !ObjectUtils.isEmpty(((SendToUser) anns[0]).value())) {
+			return anns[0];
 		}
-		if (annot[1] != null && !ObjectUtils.isEmpty(((SendTo) annot[1]).value())) {
-			return annot[1];
+		if (anns[1] != null && !ObjectUtils.isEmpty(((SendTo) anns[1]).value())) {
+			return anns[1];
 		}
-		if (annot[2] != null && !ObjectUtils.isEmpty(((SendToUser) annot[2]).value())) {
-			return annot[2];
+		if (anns[2] != null && !ObjectUtils.isEmpty(((SendToUser) anns[2]).value())) {
+			return anns[2];
 		}
-		if (annot[3] != null && !ObjectUtils.isEmpty(((SendTo) annot[3]).value())) {
-			return annot[3];
+		if (anns[3] != null && !ObjectUtils.isEmpty(((SendTo) anns[3]).value())) {
+			return anns[3];
 		}
 
 		for (int i=0; i < 4; i++) {
-			if (annot[i] != null) {
-				return annot[i];
+			if (anns[i] != null) {
+				return anns[i];
 			}
 		}
 
 		return null;
 	}
 
-	private SendToUser getSendToUser(MethodParameter returnType) {
-		SendToUser annot = AnnotatedElementUtils.findMergedAnnotation(returnType.getMethod(), SendToUser.class);
-		if (annot != null && !ObjectUtils.isEmpty(annot.value())) {
-			return annot;
-		}
-		SendToUser typeAnnot = AnnotatedElementUtils.findMergedAnnotation(returnType.getDeclaringClass(), SendToUser.class);
-		if (typeAnnot != null && !ObjectUtils.isEmpty(typeAnnot.value())) {
-			return typeAnnot;
-		}
-		return (annot != null ? annot : typeAnnot);
-	}
-
-	private SendTo getSendTo(MethodParameter returnType) {
-		SendTo sendTo = AnnotatedElementUtils.findMergedAnnotation(returnType.getMethod(), SendTo.class);
-		if (sendTo != null && !ObjectUtils.isEmpty(sendTo.value())) {
-			return sendTo;
-		}
-		else {
-			return AnnotatedElementUtils.findMergedAnnotation(returnType.getDeclaringClass(), SendTo.class);
-		}
-	}
-
 	@SuppressWarnings("unchecked")
 	private PlaceholderResolver initVarResolver(MessageHeaders headers) {
 		String name = DestinationVariableMethodArgumentResolver.DESTINATION_TEMPLATE_VARIABLES_HEADER;
@@ -268,7 +244,7 @@ public class SendToMethodReturnValueHandler implements HandlerMethodReturnValueH
 		}
 
 		return (destination.startsWith("/") ?
-				new String[] {defaultPrefix + destination} : new String[] {defaultPrefix + "/" + destination});
+				new String[] {defaultPrefix + destination} : new String[] {defaultPrefix + '/' + destination});
 	}
 
 	private MessageHeaders createHeaders(String sessionId, MethodParameter returnType) {
diff --git a/spring-messaging/src/main/java/org/springframework/messaging/simp/stomp/StompHeaderAccessor.java b/spring-messaging/src/main/java/org/springframework/messaging/simp/stomp/StompHeaderAccessor.java
index 78ce589c55..d135257eb7 100644
--- a/spring-messaging/src/main/java/org/springframework/messaging/simp/stomp/StompHeaderAccessor.java
+++ b/spring-messaging/src/main/java/org/springframework/messaging/simp/stomp/StompHeaderAccessor.java
@@ -211,7 +211,7 @@ public class StompHeaderAccessor extends SimpMessageHeaderAccessor {
 		}
 		trySetStompHeaderForSubscriptionId();
 		if (getMessageId() == null) {
-			String messageId = getSessionId() + "-" + messageIdCounter.getAndIncrement();
+			String messageId = getSessionId() + '-' + messageIdCounter.getAndIncrement();
 			setNativeHeader(STOMP_MESSAGE_ID_HEADER, messageId);
 		}
 	}
diff --git a/spring-messaging/src/main/java/org/springframework/messaging/simp/user/MultiServerUserRegistry.java b/spring-messaging/src/main/java/org/springframework/messaging/simp/user/MultiServerUserRegistry.java
index 9e4fa61898..12162ce51d 100644
--- a/spring-messaging/src/main/java/org/springframework/messaging/simp/user/MultiServerUserRegistry.java
+++ b/spring-messaging/src/main/java/org/springframework/messaging/simp/user/MultiServerUserRegistry.java
@@ -77,7 +77,7 @@ public class MultiServerUserRegistry implements SimpUserRegistry, SmartApplicati
 		catch (UnknownHostException ex) {
 			host = "unknown";
 		}
-		return host + "-" + UUID.randomUUID();
+		return host + '-' + UUID.randomUUID();
 	}
 
 
diff --git a/spring-test/src/main/java/org/springframework/test/context/transaction/TestContextTransactionUtils.java b/spring-test/src/main/java/org/springframework/test/context/transaction/TestContextTransactionUtils.java
index 22a6ada5c2..b17278e5a0 100644
--- a/spring-test/src/main/java/org/springframework/test/context/transaction/TestContextTransactionUtils.java
+++ b/spring-test/src/main/java/org/springframework/test/context/transaction/TestContextTransactionUtils.java
@@ -17,7 +17,6 @@
 package org.springframework.test.context.transaction;
 
 import java.util.Map;
-
 import javax.sql.DataSource;
 
 import org.apache.commons.logging.Log;
@@ -33,6 +32,7 @@ import org.springframework.transaction.annotation.TransactionManagementConfigure
 import org.springframework.transaction.interceptor.DelegatingTransactionAttribute;
 import org.springframework.transaction.interceptor.TransactionAttribute;
 import org.springframework.util.Assert;
+import org.springframework.util.ClassUtils;
 import org.springframework.util.StringUtils;
 
 /**
@@ -241,10 +241,9 @@ public abstract class TestContextTransactionUtils {
 
 		private final String name;
 
-
 		public TestContextTransactionAttribute(TransactionAttribute targetAttribute, TestContext testContext) {
 			super(targetAttribute);
-			this.name = testContext.getTestClass().getName() + "." + testContext.getTestMethod().getName();
+			this.name = ClassUtils.getQualifiedMethodName(testContext.getTestMethod(), testContext.getTestClass());
 		}
 
 		@Override
diff --git a/spring-web-reactive/src/main/java/org/springframework/web/reactive/resource/AbstractVersionStrategy.java b/spring-web-reactive/src/main/java/org/springframework/web/reactive/resource/AbstractVersionStrategy.java
index c5cdb6449f..92287556af 100644
--- a/spring-web-reactive/src/main/java/org/springframework/web/reactive/resource/AbstractVersionStrategy.java
+++ b/spring-web-reactive/src/main/java/org/springframework/web/reactive/resource/AbstractVersionStrategy.java
@@ -105,7 +105,7 @@ public abstract class AbstractVersionStrategy implements VersionStrategy {
 			}
 			else {
 				return (this.prefix.endsWith("/") || path.startsWith("/") ?
-						this.prefix + path : this.prefix + "/" + path);
+						this.prefix + path : this.prefix + '/' + path);
 			}
 		}
 	}
@@ -124,7 +124,7 @@ public abstract class AbstractVersionStrategy implements VersionStrategy {
 			Matcher matcher = pattern.matcher(requestPath);
 			if (matcher.find()) {
 				String match = matcher.group(1);
-				return (match.contains("-") ? match.substring(match.lastIndexOf("-") + 1) : match);
+				return (match.contains("-") ? match.substring(match.lastIndexOf('-') + 1) : match);
 			}
 			else {
 				return null;
@@ -140,7 +140,7 @@ public abstract class AbstractVersionStrategy implements VersionStrategy {
 		public String addVersion(String requestPath, String version) {
 			String baseFilename = StringUtils.stripFilenameExtension(requestPath);
 			String extension = StringUtils.getFilenameExtension(requestPath);
-			return (baseFilename + "-" + version + "." + extension);
+			return (baseFilename + '-' + version + '.' + extension);
 		}
 	}
 
diff --git a/spring-web-reactive/src/main/java/org/springframework/web/reactive/result/method/InvocableHandlerMethod.java b/spring-web-reactive/src/main/java/org/springframework/web/reactive/result/method/InvocableHandlerMethod.java
index 1ec45a7d23..47438b9fda 100644
--- a/spring-web-reactive/src/main/java/org/springframework/web/reactive/result/method/InvocableHandlerMethod.java
+++ b/spring-web-reactive/src/main/java/org/springframework/web/reactive/result/method/InvocableHandlerMethod.java
@@ -32,13 +32,13 @@ import org.springframework.core.GenericTypeResolver;
 import org.springframework.core.MethodParameter;
 import org.springframework.core.ParameterNameDiscoverer;
 import org.springframework.ui.ModelMap;
+import org.springframework.util.ClassUtils;
 import org.springframework.util.ObjectUtils;
 import org.springframework.util.ReflectionUtils;
 import org.springframework.web.method.HandlerMethod;
 import org.springframework.web.reactive.HandlerResult;
 import org.springframework.web.server.ServerWebExchange;
 
-
 /**
  * Extension of HandlerMethod that can invoke the target method after resolving
  * its method arguments.
@@ -160,22 +160,22 @@ public class InvocableHandlerMethod extends HandlerMethod {
 
 	private String getDetailedErrorMessage(String message, MethodParameter param) {
 		StringBuilder sb = new StringBuilder(message);
-		sb.append("argument [" + param.getParameterIndex() + "] ");
-		sb.append("of type [" + param.getParameterType().getName() + "] ");
-		sb.append("on method [" + getBridgedMethod().toGenericString() + "]");
+		sb.append("argument [").append(param.getParameterIndex()).append("] ");
+		sb.append("of type [").append(param.getParameterType().getName()).append("] ");
+		sb.append("on method [").append(getBridgedMethod().toGenericString()).append("]");
 		return sb.toString();
 	}
 
 	private Object doInvoke(Object[] args) throws Exception {
 		if (logger.isTraceEnabled()) {
-			String target = getBeanType().getSimpleName() + "." + getMethod().getName();
-			logger.trace("Invoking [" + target + "] method with arguments " + Arrays.toString(args));
+			logger.trace("Invoking '" + ClassUtils.getQualifiedMethodName(getMethod(), getBeanType()) +
+					"' with arguments " + Arrays.toString(args));
 		}
 		ReflectionUtils.makeAccessible(getBridgedMethod());
 		Object returnValue = getBridgedMethod().invoke(getBean(), args);
 		if (logger.isTraceEnabled()) {
-			String target = getBeanType().getSimpleName() + "." + getMethod().getName();
-			logger.trace("Method [" + target + "] returned [" + returnValue + "]");
+			logger.trace("Method [" + ClassUtils.getQualifiedMethodName(getMethod(), getBeanType()) +
+					"] returned [" + returnValue + "]");
 		}
 		return returnValue;
 	}
diff --git a/spring-web/src/main/java/org/springframework/http/codec/ResourceRegionHttpMessageWriter.java b/spring-web/src/main/java/org/springframework/http/codec/ResourceRegionHttpMessageWriter.java
index 2849a48a3e..4b4a8c7747 100644
--- a/spring-web/src/main/java/org/springframework/http/codec/ResourceRegionHttpMessageWriter.java
+++ b/spring-web/src/main/java/org/springframework/http/codec/ResourceRegionHttpMessageWriter.java
@@ -86,7 +86,7 @@ class ResourceRegionHttpMessageWriter extends EncoderHttpMessageWriterShould be configured using an {@code } for parameter name
 	 * "includePayload" in the filter definition in {@code web.xml}.
+	 * @since 3.0
 	 */
 	public void setIncludePayload(boolean includePayload) {
 		this.includePayload = includePayload;
@@ -151,6 +152,7 @@ public abstract class AbstractRequestLoggingFilter extends OncePerRequestFilter
 
 	/**
 	 * Return whether the request payload (body) should be included in the log message.
+	 * @since 3.0
 	 */
 	protected boolean isIncludePayload() {
 		return this.includePayload;
@@ -159,6 +161,7 @@ public abstract class AbstractRequestLoggingFilter extends OncePerRequestFilter
 	/**
 	 * Sets the maximum length of the payload body to be included in the log message.
 	 * Default is 50 characters.
+	 * @since 3.0
 	 */
 	public void setMaxPayloadLength(int maxPayloadLength) {
 		Assert.isTrue(maxPayloadLength >= 0, "'maxPayloadLength' should be larger than or equal to 0");
@@ -167,6 +170,7 @@ public abstract class AbstractRequestLoggingFilter extends OncePerRequestFilter
 
 	/**
 	 * Return the maximum length of the payload body to be included in the log message.
+	 * @since 3.0
 	 */
 	protected int getMaxPayloadLength() {
 		return this.maxPayloadLength;
diff --git a/spring-web/src/main/java/org/springframework/web/method/support/InvocableHandlerMethod.java b/spring-web/src/main/java/org/springframework/web/method/support/InvocableHandlerMethod.java
index 3a296369e8..949dcdbb0d 100644
--- a/spring-web/src/main/java/org/springframework/web/method/support/InvocableHandlerMethod.java
+++ b/spring-web/src/main/java/org/springframework/web/method/support/InvocableHandlerMethod.java
@@ -24,6 +24,7 @@ import org.springframework.core.DefaultParameterNameDiscoverer;
 import org.springframework.core.GenericTypeResolver;
 import org.springframework.core.MethodParameter;
 import org.springframework.core.ParameterNameDiscoverer;
+import org.springframework.util.ClassUtils;
 import org.springframework.util.ReflectionUtils;
 import org.springframework.web.bind.WebDataBinder;
 import org.springframework.web.bind.support.SessionStatus;
@@ -127,15 +128,13 @@ public class InvocableHandlerMethod extends HandlerMethod {
 
 		Object[] args = getMethodArgumentValues(request, mavContainer, providedArgs);
 		if (logger.isTraceEnabled()) {
-			StringBuilder sb = new StringBuilder("Invoking [");
-			sb.append(getBeanType().getSimpleName()).append(".");
-			sb.append(getMethod().getName()).append("] method with arguments ");
-			sb.append(Arrays.asList(args));
-			logger.trace(sb.toString());
+			logger.trace("Invoking '" + ClassUtils.getQualifiedMethodName(getMethod(), getBeanType()) +
+					"' with arguments " + Arrays.toString(args));
 		}
 		Object returnValue = doInvoke(args);
 		if (logger.isTraceEnabled()) {
-			logger.trace("Method [" + getMethod().getName() + "] returned [" + returnValue + "]");
+			logger.trace("Method [" + ClassUtils.getQualifiedMethodName(getMethod(), getBeanType()) +
+					"] returned [" + returnValue + "]");
 		}
 		return returnValue;
 	}
diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/FrameworkServlet.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/FrameworkServlet.java
index 04b15a8183..7cb980d456 100644
--- a/spring-webmvc/src/main/java/org/springframework/web/servlet/FrameworkServlet.java
+++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/FrameworkServlet.java
@@ -641,7 +641,7 @@ public abstract class FrameworkServlet extends HttpServletBean implements Applic
 			else {
 				// Generate default id...
 				wac.setId(ConfigurableWebApplicationContext.APPLICATION_CONTEXT_ID_PREFIX +
-						ObjectUtils.getDisplayString(getServletContext().getContextPath()) + "/" + getServletName());
+						ObjectUtils.getDisplayString(getServletContext().getContextPath()) + '/' + getServletName());
 			}
 		}
 
diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/AbstractVersionStrategy.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/AbstractVersionStrategy.java
index 8de6dabdc4..9848f9c79e 100644
--- a/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/AbstractVersionStrategy.java
+++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/AbstractVersionStrategy.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2002-2015 the original author or authors.
+ * Copyright 2002-2016 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.
@@ -105,7 +105,7 @@ public abstract class AbstractVersionStrategy implements VersionStrategy {
 			}
 			else {
 				return (this.prefix.endsWith("/") || path.startsWith("/") ?
-						this.prefix + path : this.prefix + "/" + path);
+						this.prefix + path : this.prefix + '/' + path);
 			}
 		}
 	}
@@ -124,7 +124,7 @@ public abstract class AbstractVersionStrategy implements VersionStrategy {
 			Matcher matcher = pattern.matcher(requestPath);
 			if (matcher.find()) {
 				String match = matcher.group(1);
-				return (match.contains("-") ? match.substring(match.lastIndexOf("-") + 1) : match);
+				return (match.contains("-") ? match.substring(match.lastIndexOf('-') + 1) : match);
 			}
 			else {
 				return null;
@@ -140,7 +140,7 @@ public abstract class AbstractVersionStrategy implements VersionStrategy {
 		public String addVersion(String requestPath, String version) {
 			String baseFilename = StringUtils.stripFilenameExtension(requestPath);
 			String extension = StringUtils.getFilenameExtension(requestPath);
-			return (baseFilename + "-" + version + "." + extension);
+			return (baseFilename + '-' + version + '.' + extension);
 		}
 	}
 
diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/tags/UrlTag.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/tags/UrlTag.java
index 07b09aeefd..eb77de0101 100644
--- a/spring-webmvc/src/main/java/org/springframework/web/servlet/tags/UrlTag.java
+++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/tags/UrlTag.java
@@ -300,7 +300,7 @@ public class UrlTag extends HtmlEscapingAwareTag implements ParamAware {
 				}
 			}
 			else {
-				template = URL_TEMPLATE_DELIMITER_PREFIX + "/" + param.getName() + URL_TEMPLATE_DELIMITER_SUFFIX;
+				template = URL_TEMPLATE_DELIMITER_PREFIX + '/' + param.getName() + URL_TEMPLATE_DELIMITER_SUFFIX;
 				if (uri.contains(template)) {
 					usedParams.add(param.getName());
 					try {
diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/view/AbstractCachingViewResolver.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/view/AbstractCachingViewResolver.java
index 44b64a194d..a9653bb323 100644
--- a/spring-webmvc/src/main/java/org/springframework/web/servlet/view/AbstractCachingViewResolver.java
+++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/view/AbstractCachingViewResolver.java
@@ -179,7 +179,7 @@ public abstract class AbstractCachingViewResolver extends WebApplicationObjectSu
 	 * lead to a different view resource.
 	 */
 	protected Object getCacheKey(String viewName, Locale locale) {
-		return viewName + "_" + locale;
+		return viewName + '_' + locale;
 	}
 
 	/**
diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/view/ContentNegotiatingViewResolver.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/view/ContentNegotiatingViewResolver.java
index 078334748c..e2e45cc927 100644
--- a/spring-webmvc/src/main/java/org/springframework/web/servlet/view/ContentNegotiatingViewResolver.java
+++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/view/ContentNegotiatingViewResolver.java
@@ -303,7 +303,7 @@ public class ContentNegotiatingViewResolver extends WebApplicationObjectSupport
 			for (MediaType requestedMediaType : requestedMediaTypes) {
 				List extensions = this.contentNegotiationManager.resolveFileExtensions(requestedMediaType);
 				for (String extension : extensions) {
-					String viewNameWithExtension = viewName + "." + extension;
+					String viewNameWithExtension = viewName + '.' + extension;
 					view = viewResolver.resolveViewName(viewNameWithExtension, locale);
 					if (view != null) {
 						candidateViews.add(view);
diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/view/groovy/GroovyMarkupViewResolver.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/view/groovy/GroovyMarkupViewResolver.java
index 197abdf224..15411976c4 100644
--- a/spring-webmvc/src/main/java/org/springframework/web/servlet/view/groovy/GroovyMarkupViewResolver.java
+++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/view/groovy/GroovyMarkupViewResolver.java
@@ -70,7 +70,7 @@ public class GroovyMarkupViewResolver extends AbstractTemplateViewResolver {
 	 */
 	@Override
 	protected Object getCacheKey(String viewName, Locale locale) {
-		return viewName + "_" + locale;
+		return viewName + '_' + locale;
 	}
 
 }