diff --git a/spring-aop/src/main/java/org/springframework/aop/aspectj/DeclareParentsAdvisor.java b/spring-aop/src/main/java/org/springframework/aop/aspectj/DeclareParentsAdvisor.java index 47e461551b..ecc9b860da 100644 --- a/spring-aop/src/main/java/org/springframework/aop/aspectj/DeclareParentsAdvisor.java +++ b/spring-aop/src/main/java/org/springframework/aop/aspectj/DeclareParentsAdvisor.java @@ -76,12 +76,7 @@ public class DeclareParentsAdvisor implements IntroductionAdvisor { ClassFilter typePatternFilter = new TypePatternClassFilter(typePattern); // Excludes methods implemented. - ClassFilter exclusion = new ClassFilter() { - @Override - public boolean matches(Class clazz) { - return !(introducedInterface.isAssignableFrom(clazz)); - } - }; + ClassFilter exclusion = clazz -> !(introducedInterface.isAssignableFrom(clazz)); this.typePatternClassFilter = ClassFilters.intersection(typePatternFilter, exclusion); this.advice = advice; diff --git a/spring-aop/src/main/java/org/springframework/aop/aspectj/annotation/ReflectiveAspectJAdvisorFactory.java b/spring-aop/src/main/java/org/springframework/aop/aspectj/annotation/ReflectiveAspectJAdvisorFactory.java index 94439644e2..f1897370bf 100644 --- a/spring-aop/src/main/java/org/springframework/aop/aspectj/annotation/ReflectiveAspectJAdvisorFactory.java +++ b/spring-aop/src/main/java/org/springframework/aop/aspectj/annotation/ReflectiveAspectJAdvisorFactory.java @@ -76,21 +76,12 @@ public class ReflectiveAspectJAdvisorFactory extends AbstractAspectJAdvisorFacto Comparator adviceKindComparator = new ConvertingComparator<>( new InstanceComparator<>( Around.class, Before.class, After.class, AfterReturning.class, AfterThrowing.class), - new Converter() { - @Override - public Annotation convert(Method method) { - AspectJAnnotation annotation = - AbstractAspectJAdvisorFactory.findAspectJAnnotationOnMethod(method); - return (annotation != null ? annotation.getAnnotation() : null); - } - }); - Comparator methodNameComparator = new ConvertingComparator<>( - new Converter() { - @Override - public String convert(Method method) { - return method.getName(); - } + (Converter) method -> { + AspectJAnnotation annotation = + AbstractAspectJAdvisorFactory.findAspectJAnnotationOnMethod(method); + return (annotation != null ? annotation.getAnnotation() : null); }); + Comparator methodNameComparator = new ConvertingComparator<>(Method::getName); METHOD_COMPARATOR = adviceKindComparator.thenComparing(methodNameComparator); } @@ -157,13 +148,10 @@ public class ReflectiveAspectJAdvisorFactory extends AbstractAspectJAdvisorFacto private List getAdvisorMethods(Class aspectClass) { final List methods = new LinkedList<>(); - ReflectionUtils.doWithMethods(aspectClass, new ReflectionUtils.MethodCallback() { - @Override - public void doWith(Method method) throws IllegalArgumentException { - // Exclude pointcuts - if (AnnotationUtils.getAnnotation(method, Pointcut.class) == null) { - methods.add(method); - } + ReflectionUtils.doWithMethods(aspectClass, method -> { + // Exclude pointcuts + if (AnnotationUtils.getAnnotation(method, Pointcut.class) == null) { + methods.add(method); } }); Collections.sort(methods, METHOD_COMPARATOR); diff --git a/spring-aop/src/main/java/org/springframework/aop/interceptor/AsyncExecutionAspectSupport.java b/spring-aop/src/main/java/org/springframework/aop/interceptor/AsyncExecutionAspectSupport.java index 2f5c6d825c..d6f0334e44 100644 --- a/spring-aop/src/main/java/org/springframework/aop/interceptor/AsyncExecutionAspectSupport.java +++ b/spring-aop/src/main/java/org/springframework/aop/interceptor/AsyncExecutionAspectSupport.java @@ -264,15 +264,12 @@ public abstract class AsyncExecutionAspectSupport implements BeanFactoryAware { @Nullable protected Object doSubmit(Callable task, AsyncTaskExecutor executor, Class returnType) { if (CompletableFuture.class.isAssignableFrom(returnType)) { - return CompletableFuture.supplyAsync(new Supplier() { - @Override - public Object get() { - try { - return task.call(); - } - catch (Throwable ex) { - throw new CompletionException(ex); - } + return CompletableFuture.supplyAsync(() -> { + try { + return task.call(); + } + catch (Throwable ex) { + throw new CompletionException(ex); } }, executor); } diff --git a/spring-aop/src/main/java/org/springframework/aop/interceptor/AsyncExecutionInterceptor.java b/spring-aop/src/main/java/org/springframework/aop/interceptor/AsyncExecutionInterceptor.java index e512e10328..a110dcd958 100644 --- a/spring-aop/src/main/java/org/springframework/aop/interceptor/AsyncExecutionInterceptor.java +++ b/spring-aop/src/main/java/org/springframework/aop/interceptor/AsyncExecutionInterceptor.java @@ -109,23 +109,20 @@ public class AsyncExecutionInterceptor extends AsyncExecutionAspectSupport imple "No executor specified and no default executor set on AsyncExecutionInterceptor either"); } - Callable task = new Callable() { - @Override - public Object call() throws Exception { - try { - Object result = invocation.proceed(); - if (result instanceof Future) { - return ((Future) result).get(); - } + Callable task = () -> { + try { + Object result = invocation.proceed(); + if (result instanceof Future) { + return ((Future) result).get(); } - catch (ExecutionException ex) { - handleError(ex.getCause(), userDeclaredMethod, invocation.getArguments()); - } - catch (Throwable ex) { - handleError(ex, userDeclaredMethod, invocation.getArguments()); - } - return null; } + catch (ExecutionException ex) { + handleError(ex.getCause(), userDeclaredMethod, invocation.getArguments()); + } + catch (Throwable ex) { + handleError(ex, userDeclaredMethod, invocation.getArguments()); + } + return null; }; return doSubmit(task, executor, invocation.getMethod().getReturnType()); diff --git a/spring-beans/src/main/java/org/springframework/beans/ExtendedBeanInfo.java b/spring-beans/src/main/java/org/springframework/beans/ExtendedBeanInfo.java index 3f7713516c..49b856d01f 100644 --- a/spring-beans/src/main/java/org/springframework/beans/ExtendedBeanInfo.java +++ b/spring-beans/src/main/java/org/springframework/beans/ExtendedBeanInfo.java @@ -139,12 +139,7 @@ class ExtendedBeanInfo implements BeanInfo { // Sort non-void returning write methods to guard against the ill effects of // non-deterministic sorting of methods returned from Class#getDeclaredMethods // under JDK 7. See http://bugs.sun.com/view_bug.do?bug_id=7023180 - Collections.sort(matches, new Comparator() { - @Override - public int compare(Method m1, Method m2) { - return m2.toString().compareTo(m1.toString()); - } - }); + Collections.sort(matches, (m1, m2) -> m2.toString().compareTo(m1.toString())); return matches; } diff --git a/spring-beans/src/main/java/org/springframework/beans/PropertyMatches.java b/spring-beans/src/main/java/org/springframework/beans/PropertyMatches.java index 7834bb8189..77ee64af8b 100644 --- a/spring-beans/src/main/java/org/springframework/beans/PropertyMatches.java +++ b/spring-beans/src/main/java/org/springframework/beans/PropertyMatches.java @@ -245,13 +245,10 @@ public abstract class PropertyMatches { private static String[] calculateMatches(final String propertyName, Class beanClass, final int maxDistance) { final List candidates = new ArrayList<>(); - ReflectionUtils.doWithFields(beanClass, new ReflectionUtils.FieldCallback() { - @Override - public void doWith(Field field) throws IllegalArgumentException, IllegalAccessException { - String possibleAlternative = field.getName(); - if (calculateStringDistance(propertyName, possibleAlternative) <= maxDistance) { - candidates.add(possibleAlternative); - } + ReflectionUtils.doWithFields(beanClass, field -> { + String possibleAlternative = field.getName(); + if (calculateStringDistance(propertyName, possibleAlternative) <= maxDistance) { + candidates.add(possibleAlternative); } }); Collections.sort(candidates); 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 9d5b3082d5..9074241201 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 @@ -239,20 +239,17 @@ public class AutowiredAnnotationBeanPostProcessor extends InstantiationAwareBean // Let's check for lookup methods here.. if (!this.lookupMethodsChecked.contains(beanName)) { try { - ReflectionUtils.doWithMethods(beanClass, new ReflectionUtils.MethodCallback() { - @Override - public void doWith(Method method) throws IllegalArgumentException, IllegalAccessException { - Lookup lookup = method.getAnnotation(Lookup.class); - if (lookup != null) { - LookupOverride override = new LookupOverride(method, lookup.value()); - try { - RootBeanDefinition mbd = (RootBeanDefinition) beanFactory.getMergedBeanDefinition(beanName); - mbd.getMethodOverrides().addOverride(override); - } - catch (NoSuchBeanDefinitionException ex) { - throw new BeanCreationException(beanName, - "Cannot apply @Lookup to beans without corresponding bean definition"); - } + ReflectionUtils.doWithMethods(beanClass, method -> { + Lookup lookup = method.getAnnotation(Lookup.class); + if (lookup != null) { + LookupOverride override = new LookupOverride(method, lookup.value()); + try { + RootBeanDefinition mbd = (RootBeanDefinition) beanFactory.getMergedBeanDefinition(beanName); + mbd.getMethodOverrides().addOverride(override); + } + catch (NoSuchBeanDefinitionException ex) { + throw new BeanCreationException(beanName, + "Cannot apply @Lookup to beans without corresponding bean definition"); } } }); @@ -414,50 +411,44 @@ public class AutowiredAnnotationBeanPostProcessor extends InstantiationAwareBean do { final LinkedList currElements = new LinkedList<>(); - ReflectionUtils.doWithLocalFields(targetClass, new ReflectionUtils.FieldCallback() { - @Override - public void doWith(Field field) throws IllegalArgumentException, IllegalAccessException { - AnnotationAttributes ann = findAutowiredAnnotation(field); - if (ann != null) { - if (Modifier.isStatic(field.getModifiers())) { - if (logger.isWarnEnabled()) { - logger.warn("Autowired annotation is not supported on static fields: " + field); - } - return; - } - boolean required = determineRequiredStatus(ann); - currElements.add(new AutowiredFieldElement(field, required)); - } - } - }); + ReflectionUtils.doWithLocalFields(targetClass, field -> { + AnnotationAttributes ann = findAutowiredAnnotation(field); + if (ann != null) { + if (Modifier.isStatic(field.getModifiers())) { + if (logger.isWarnEnabled()) { + logger.warn("Autowired annotation is not supported on static fields: " + field); + } + return; + } + boolean required = determineRequiredStatus(ann); + currElements.add(new AutowiredFieldElement(field, required)); + } + }); - ReflectionUtils.doWithLocalMethods(targetClass, new ReflectionUtils.MethodCallback() { - @Override - public void doWith(Method method) throws IllegalArgumentException, IllegalAccessException { - Method bridgedMethod = BridgeMethodResolver.findBridgedMethod(method); - if (!BridgeMethodResolver.isVisibilityBridgeMethodPair(method, bridgedMethod)) { - return; - } - AnnotationAttributes ann = findAutowiredAnnotation(bridgedMethod); - if (ann != null && method.equals(ClassUtils.getMostSpecificMethod(method, clazz))) { - if (Modifier.isStatic(method.getModifiers())) { - if (logger.isWarnEnabled()) { - logger.warn("Autowired annotation is not supported on static methods: " + method); - } - return; - } - if (method.getParameterCount() == 0) { - if (logger.isWarnEnabled()) { - logger.warn("Autowired annotation should only be used on methods with parameters: " + - method); - } - } - boolean required = determineRequiredStatus(ann); - PropertyDescriptor pd = BeanUtils.findPropertyForMethod(bridgedMethod, clazz); - currElements.add(new AutowiredMethodElement(method, required, pd)); - } - } - }); + ReflectionUtils.doWithLocalMethods(targetClass, method -> { + Method bridgedMethod = BridgeMethodResolver.findBridgedMethod(method); + if (!BridgeMethodResolver.isVisibilityBridgeMethodPair(method, bridgedMethod)) { + return; + } + AnnotationAttributes ann = findAutowiredAnnotation(bridgedMethod); + if (ann != null && method.equals(ClassUtils.getMostSpecificMethod(method, clazz))) { + if (Modifier.isStatic(method.getModifiers())) { + if (logger.isWarnEnabled()) { + logger.warn("Autowired annotation is not supported on static methods: " + method); + } + return; + } + if (method.getParameterCount() == 0) { + if (logger.isWarnEnabled()) { + logger.warn("Autowired annotation should only be used on methods with parameters: " + + method); + } + } + boolean required = determineRequiredStatus(ann); + PropertyDescriptor pd = BeanUtils.findPropertyForMethod(bridgedMethod, clazz); + currElements.add(new AutowiredMethodElement(method, required, pd)); + } + }); elements.addAll(0, currElements); targetClass = targetClass.getSuperclass(); 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 8916da2cd1..a85bd1f51c 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 @@ -201,24 +201,21 @@ public class InitDestroyAnnotationBeanPostProcessor final LinkedList currInitMethods = new LinkedList<>(); final LinkedList currDestroyMethods = new LinkedList<>(); - ReflectionUtils.doWithLocalMethods(targetClass, new ReflectionUtils.MethodCallback() { - @Override - public void doWith(Method method) throws IllegalArgumentException, IllegalAccessException { - if (initAnnotationType != null) { - if (method.getAnnotation(initAnnotationType) != null) { - LifecycleElement element = new LifecycleElement(method); - currInitMethods.add(element); - if (debug) { - logger.debug("Found init method on class [" + clazz.getName() + "]: " + method); - } + ReflectionUtils.doWithLocalMethods(targetClass, method -> { + if (initAnnotationType != null) { + if (method.getAnnotation(initAnnotationType) != null) { + LifecycleElement element = new LifecycleElement(method); + currInitMethods.add(element); + if (debug) { + logger.debug("Found init method on class [" + clazz.getName() + "]: " + method); } } - if (destroyAnnotationType != null) { - if (method.getAnnotation(destroyAnnotationType) != null) { - currDestroyMethods.add(new LifecycleElement(method)); - if (debug) { - logger.debug("Found destroy method on class [" + clazz.getName() + "]: " + method); - } + } + if (destroyAnnotationType != null) { + if (method.getAnnotation(destroyAnnotationType) != null) { + currDestroyMethods.add(new LifecycleElement(method)); + if (debug) { + logger.debug("Found destroy method on class [" + clazz.getName() + "]: " + method); } } } diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractAutowireCapableBeanFactory.java b/spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractAutowireCapableBeanFactory.java index 819d9d5148..8ecd7f7d14 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractAutowireCapableBeanFactory.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractAutowireCapableBeanFactory.java @@ -877,20 +877,15 @@ public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFac // Find the given factory method, taking into account that in the case of // @Bean methods, there may be parameters present. - ReflectionUtils.doWithMethods(fbClass, - new ReflectionUtils.MethodCallback() { - @Override - public void doWith(Method method) { - if (method.getName().equals(factoryMethodName) && - FactoryBean.class.isAssignableFrom(method.getReturnType())) { - Class currentType = GenericTypeResolver.resolveReturnTypeArgument( - method, FactoryBean.class); - if (currentType != null) { - objectType.value = ClassUtils.determineCommonAncestor(currentType, objectType.value); - } - } - } - }); + ReflectionUtils.doWithMethods(fbClass, method -> { + if (method.getName().equals(factoryMethodName) && + FactoryBean.class.isAssignableFrom(method.getReturnType())) { + Class currentType = GenericTypeResolver.resolveReturnTypeArgument(method, FactoryBean.class); + if (currentType != null) { + objectType.value = ClassUtils.determineCommonAncestor(currentType, objectType.value); + } + } + }); return (objectType.value != null && Object.class != objectType.value ? objectType.value : null); } diff --git a/spring-context-support/src/main/java/org/springframework/cache/jcache/interceptor/JCacheInterceptor.java b/spring-context-support/src/main/java/org/springframework/cache/jcache/interceptor/JCacheInterceptor.java index 3addafe5bf..a39426bea6 100644 --- a/spring-context-support/src/main/java/org/springframework/cache/jcache/interceptor/JCacheInterceptor.java +++ b/spring-context-support/src/main/java/org/springframework/cache/jcache/interceptor/JCacheInterceptor.java @@ -45,15 +45,12 @@ public class JCacheInterceptor extends JCacheAspectSupport implements MethodInte public Object invoke(final MethodInvocation invocation) throws Throwable { Method method = invocation.getMethod(); - CacheOperationInvoker aopAllianceInvoker = new CacheOperationInvoker() { - @Override - public Object invoke() { - try { - return invocation.proceed(); - } - catch (Throwable ex) { - throw new ThrowableWrapper(ex); - } + CacheOperationInvoker aopAllianceInvoker = () -> { + try { + return invocation.proceed(); + } + catch (Throwable ex) { + throw new CacheOperationInvoker.ThrowableWrapper(ex); } }; diff --git a/spring-context/src/main/java/org/springframework/cache/annotation/AnnotationCacheOperationSource.java b/spring-context/src/main/java/org/springframework/cache/annotation/AnnotationCacheOperationSource.java index 68ce9c8530..b666822df6 100644 --- a/spring-context/src/main/java/org/springframework/cache/annotation/AnnotationCacheOperationSource.java +++ b/spring-context/src/main/java/org/springframework/cache/annotation/AnnotationCacheOperationSource.java @@ -107,23 +107,12 @@ public class AnnotationCacheOperationSource extends AbstractFallbackCacheOperati @Override protected Collection findCacheOperations(final Class clazz) { - return determineCacheOperations(new CacheOperationProvider() { - @Override - public Collection getCacheOperations(CacheAnnotationParser parser) { - return parser.parseCacheAnnotations(clazz); - } - }); - + return determineCacheOperations(parser -> parser.parseCacheAnnotations(clazz)); } @Override protected Collection findCacheOperations(final Method method) { - return determineCacheOperations(new CacheOperationProvider() { - @Override - public Collection getCacheOperations(CacheAnnotationParser parser) { - return parser.parseCacheAnnotations(method); - } - }); + return determineCacheOperations(parser -> parser.parseCacheAnnotations(method)); } /** diff --git a/spring-context/src/main/java/org/springframework/cache/interceptor/CacheInterceptor.java b/spring-context/src/main/java/org/springframework/cache/interceptor/CacheInterceptor.java index f411ac42ab..f2f4521c8e 100644 --- a/spring-context/src/main/java/org/springframework/cache/interceptor/CacheInterceptor.java +++ b/spring-context/src/main/java/org/springframework/cache/interceptor/CacheInterceptor.java @@ -45,15 +45,12 @@ public class CacheInterceptor extends CacheAspectSupport implements MethodInterc public Object invoke(final MethodInvocation invocation) throws Throwable { Method method = invocation.getMethod(); - CacheOperationInvoker aopAllianceInvoker = new CacheOperationInvoker() { - @Override - public Object invoke() { - try { - return invocation.proceed(); - } - catch (Throwable ex) { - throw new ThrowableWrapper(ex); - } + CacheOperationInvoker aopAllianceInvoker = () -> { + try { + return invocation.proceed(); + } + catch (Throwable ex) { + throw new CacheOperationInvoker.ThrowableWrapper(ex); } }; diff --git a/spring-context/src/main/java/org/springframework/context/annotation/CommonAnnotationBeanPostProcessor.java b/spring-context/src/main/java/org/springframework/context/annotation/CommonAnnotationBeanPostProcessor.java index a5ba5b7d48..6c35d21f7d 100644 --- a/spring-context/src/main/java/org/springframework/context/annotation/CommonAnnotationBeanPostProcessor.java +++ b/spring-context/src/main/java/org/springframework/context/annotation/CommonAnnotationBeanPostProcessor.java @@ -351,72 +351,66 @@ public class CommonAnnotationBeanPostProcessor extends InitDestroyAnnotationBean final LinkedList currElements = new LinkedList<>(); - ReflectionUtils.doWithLocalFields(targetClass, new ReflectionUtils.FieldCallback() { - @Override - public void doWith(Field field) throws IllegalArgumentException, IllegalAccessException { - if (webServiceRefClass != null && field.isAnnotationPresent(webServiceRefClass)) { - if (Modifier.isStatic(field.getModifiers())) { - throw new IllegalStateException("@WebServiceRef annotation is not supported on static fields"); - } - currElements.add(new WebServiceRefElement(field, field, null)); + ReflectionUtils.doWithLocalFields(targetClass, field -> { + if (webServiceRefClass != null && field.isAnnotationPresent(webServiceRefClass)) { + if (Modifier.isStatic(field.getModifiers())) { + throw new IllegalStateException("@WebServiceRef annotation is not supported on static fields"); } - else if (ejbRefClass != null && field.isAnnotationPresent(ejbRefClass)) { - if (Modifier.isStatic(field.getModifiers())) { - throw new IllegalStateException("@EJB annotation is not supported on static fields"); - } - currElements.add(new EjbRefElement(field, field, null)); + currElements.add(new WebServiceRefElement(field, field, null)); + } + else if (ejbRefClass != null && field.isAnnotationPresent(ejbRefClass)) { + if (Modifier.isStatic(field.getModifiers())) { + throw new IllegalStateException("@EJB annotation is not supported on static fields"); } - else if (field.isAnnotationPresent(Resource.class)) { - if (Modifier.isStatic(field.getModifiers())) { - throw new IllegalStateException("@Resource annotation is not supported on static fields"); - } - if (!ignoredResourceTypes.contains(field.getType().getName())) { - currElements.add(new ResourceElement(field, field, null)); - } + currElements.add(new EjbRefElement(field, field, null)); + } + else if (field.isAnnotationPresent(Resource.class)) { + if (Modifier.isStatic(field.getModifiers())) { + throw new IllegalStateException("@Resource annotation is not supported on static fields"); + } + if (!ignoredResourceTypes.contains(field.getType().getName())) { + currElements.add(new ResourceElement(field, field, null)); } } }); - ReflectionUtils.doWithLocalMethods(targetClass, new ReflectionUtils.MethodCallback() { - @Override - public void doWith(Method method) throws IllegalArgumentException, IllegalAccessException { - Method bridgedMethod = BridgeMethodResolver.findBridgedMethod(method); - if (!BridgeMethodResolver.isVisibilityBridgeMethodPair(method, bridgedMethod)) { - return; + ReflectionUtils.doWithLocalMethods(targetClass, method -> { + Method bridgedMethod = BridgeMethodResolver.findBridgedMethod(method); + if (!BridgeMethodResolver.isVisibilityBridgeMethodPair(method, bridgedMethod)) { + return; + } + if (method.equals(ClassUtils.getMostSpecificMethod(method, clazz))) { + if (webServiceRefClass != null && bridgedMethod.isAnnotationPresent(webServiceRefClass)) { + if (Modifier.isStatic(method.getModifiers())) { + throw new IllegalStateException("@WebServiceRef annotation is not supported on static methods"); + } + if (method.getParameterCount() != 1) { + throw new IllegalStateException("@WebServiceRef annotation requires a single-arg method: " + method); + } + PropertyDescriptor pd = BeanUtils.findPropertyForMethod(bridgedMethod, clazz); + currElements.add(new WebServiceRefElement(method, bridgedMethod, pd)); } - if (method.equals(ClassUtils.getMostSpecificMethod(method, clazz))) { - if (webServiceRefClass != null && bridgedMethod.isAnnotationPresent(webServiceRefClass)) { - if (Modifier.isStatic(method.getModifiers())) { - throw new IllegalStateException("@WebServiceRef annotation is not supported on static methods"); - } - if (method.getParameterCount() != 1) { - throw new IllegalStateException("@WebServiceRef annotation requires a single-arg method: " + method); - } - PropertyDescriptor pd = BeanUtils.findPropertyForMethod(bridgedMethod, clazz); - currElements.add(new WebServiceRefElement(method, bridgedMethod, pd)); + else if (ejbRefClass != null && bridgedMethod.isAnnotationPresent(ejbRefClass)) { + if (Modifier.isStatic(method.getModifiers())) { + throw new IllegalStateException("@EJB annotation is not supported on static methods"); } - else if (ejbRefClass != null && bridgedMethod.isAnnotationPresent(ejbRefClass)) { - if (Modifier.isStatic(method.getModifiers())) { - throw new IllegalStateException("@EJB annotation is not supported on static methods"); - } - if (method.getParameterCount() != 1) { - throw new IllegalStateException("@EJB annotation requires a single-arg method: " + method); - } - PropertyDescriptor pd = BeanUtils.findPropertyForMethod(bridgedMethod, clazz); - currElements.add(new EjbRefElement(method, bridgedMethod, pd)); + if (method.getParameterCount() != 1) { + throw new IllegalStateException("@EJB annotation requires a single-arg method: " + method); } - else if (bridgedMethod.isAnnotationPresent(Resource.class)) { - if (Modifier.isStatic(method.getModifiers())) { - throw new IllegalStateException("@Resource annotation is not supported on static methods"); - } - Class[] paramTypes = method.getParameterTypes(); - if (paramTypes.length != 1) { - throw new IllegalStateException("@Resource annotation requires a single-arg method: " + method); - } - if (!ignoredResourceTypes.contains(paramTypes[0].getName())) { - PropertyDescriptor pd = BeanUtils.findPropertyForMethod(bridgedMethod, clazz); - currElements.add(new ResourceElement(method, bridgedMethod, pd)); - } + PropertyDescriptor pd = BeanUtils.findPropertyForMethod(bridgedMethod, clazz); + currElements.add(new EjbRefElement(method, bridgedMethod, pd)); + } + else if (bridgedMethod.isAnnotationPresent(Resource.class)) { + if (Modifier.isStatic(method.getModifiers())) { + throw new IllegalStateException("@Resource annotation is not supported on static methods"); + } + Class[] paramTypes = method.getParameterTypes(); + if (paramTypes.length != 1) { + throw new IllegalStateException("@Resource annotation requires a single-arg method: " + method); + } + if (!ignoredResourceTypes.contains(paramTypes[0].getName())) { + PropertyDescriptor pd = BeanUtils.findPropertyForMethod(bridgedMethod, clazz); + currElements.add(new ResourceElement(method, bridgedMethod, pd)); } } } diff --git a/spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClassPostProcessor.java b/spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClassPostProcessor.java index a43bcdfeb9..ef5f8ea50c 100644 --- a/spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClassPostProcessor.java +++ b/spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClassPostProcessor.java @@ -280,13 +280,10 @@ public class ConfigurationClassPostProcessor implements BeanDefinitionRegistryPo } // Sort by previously determined @Order value, if applicable - Collections.sort(configCandidates, new Comparator() { - @Override - public int compare(BeanDefinitionHolder bd1, BeanDefinitionHolder bd2) { - int i1 = ConfigurationClassUtils.getOrder(bd1.getBeanDefinition()); - int i2 = ConfigurationClassUtils.getOrder(bd2.getBeanDefinition()); - return (i1 < i2) ? -1 : (i1 > i2) ? 1 : 0; - } + Collections.sort(configCandidates, (bd1, bd2) -> { + int i1 = ConfigurationClassUtils.getOrder(bd1.getBeanDefinition()); + int i2 = ConfigurationClassUtils.getOrder(bd2.getBeanDefinition()); + return (i1 < i2) ? -1 : (i1 > i2) ? 1 : 0; }); // Detect any custom bean name generation strategy supplied through the enclosing application context 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 2c360f5817..d708b6ec8d 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 @@ -226,14 +226,11 @@ public class DefaultLifecycleProcessor implements LifecycleProcessor, BeanFactor logger.debug("Asking bean '" + beanName + "' of type [" + bean.getClass() + "] to stop"); } countDownBeanNames.add(beanName); - ((SmartLifecycle) bean).stop(new Runnable() { - @Override - public void run() { - latch.countDown(); - countDownBeanNames.remove(beanName); - if (logger.isDebugEnabled()) { - logger.debug("Bean '" + beanName + "' completed its stop procedure"); - } + ((SmartLifecycle) bean).stop(() -> { + latch.countDown(); + countDownBeanNames.remove(beanName); + if (logger.isDebugEnabled()) { + logger.debug("Bean '" + beanName + "' completed its stop procedure"); } }); } diff --git a/spring-context/src/main/java/org/springframework/jmx/export/MBeanExporter.java b/spring-context/src/main/java/org/springframework/jmx/export/MBeanExporter.java index 467a828e74..d4b39c81b5 100644 --- a/spring-context/src/main/java/org/springframework/jmx/export/MBeanExporter.java +++ b/spring-context/src/main/java/org/springframework/jmx/export/MBeanExporter.java @@ -872,12 +872,7 @@ public class MBeanExporter extends MBeanRegistrationSupport implements MBeanExpo * certain internal classes from being registered automatically. */ private void autodetectBeans(final AutodetectCapableMBeanInfoAssembler assembler) { - autodetect(new AutodetectCallback() { - @Override - public boolean include(Class beanClass, String beanName) { - return assembler.includeBean(beanClass, beanName); - } - }); + autodetect((beanClass, beanName) -> assembler.includeBean(beanClass, beanName)); } /** @@ -885,12 +880,7 @@ public class MBeanExporter extends MBeanRegistrationSupport implements MBeanExpo * valid MBeans and registers them automatically with the {@code MBeanServer}. */ private void autodetectMBeans() { - autodetect(new AutodetectCallback() { - @Override - public boolean include(Class beanClass, String beanName) { - return isMBean(beanClass); - } - }); + autodetect((beanClass, beanName) -> isMBean(beanClass)); } /** diff --git a/spring-core/src/main/java/org/springframework/core/convert/converter/ConvertingComparator.java b/spring-core/src/main/java/org/springframework/core/convert/converter/ConvertingComparator.java index d941f7a7b1..7dbfed0993 100644 --- a/spring-core/src/main/java/org/springframework/core/convert/converter/ConvertingComparator.java +++ b/spring-core/src/main/java/org/springframework/core/convert/converter/ConvertingComparator.java @@ -87,12 +87,7 @@ public class ConvertingComparator implements Comparator { * @return a new {@link ConvertingComparator} instance */ public static ConvertingComparator, K> mapEntryKeys(Comparator comparator) { - return new ConvertingComparator<>(comparator, new Converter, K>() { - @Override - public K convert(Map.Entry source) { - return source.getKey(); - } - }); + return new ConvertingComparator<>(comparator, source -> source.getKey()); } /** @@ -102,12 +97,7 @@ public class ConvertingComparator implements Comparator { * @return a new {@link ConvertingComparator} instance */ public static ConvertingComparator, V> mapEntryValues(Comparator comparator) { - return new ConvertingComparator<>(comparator, new Converter, V>() { - @Override - public V convert(Map.Entry source) { - return source.getValue(); - } - }); + return new ConvertingComparator<>(comparator, source -> source.getValue()); } diff --git a/spring-core/src/main/java/org/springframework/core/env/AbstractPropertyResolver.java b/spring-core/src/main/java/org/springframework/core/env/AbstractPropertyResolver.java index dad20536a0..09dd7c5b21 100644 --- a/spring-core/src/main/java/org/springframework/core/env/AbstractPropertyResolver.java +++ b/spring-core/src/main/java/org/springframework/core/env/AbstractPropertyResolver.java @@ -226,12 +226,7 @@ public abstract class AbstractPropertyResolver implements ConfigurablePropertyRe } private String doResolvePlaceholders(String text, PropertyPlaceholderHelper helper) { - return helper.replacePlaceholders(text, new PropertyPlaceholderHelper.PlaceholderResolver() { - @Override - public String resolvePlaceholder(String placeholderName) { - return getPropertyAsRawString(placeholderName); - } - }); + return helper.replacePlaceholders(text, placeholderName -> getPropertyAsRawString(placeholderName)); } /** diff --git a/spring-core/src/main/java/org/springframework/util/PropertyPlaceholderHelper.java b/spring-core/src/main/java/org/springframework/util/PropertyPlaceholderHelper.java index 233dd6d710..cd09f83e31 100644 --- a/spring-core/src/main/java/org/springframework/util/PropertyPlaceholderHelper.java +++ b/spring-core/src/main/java/org/springframework/util/PropertyPlaceholderHelper.java @@ -108,12 +108,7 @@ public class PropertyPlaceholderHelper { */ public String replacePlaceholders(String value, final Properties properties) { Assert.notNull(properties, "'properties' must not be null"); - return replacePlaceholders(value, new PlaceholderResolver() { - @Override - public String resolvePlaceholder(String placeholderName) { - return properties.getProperty(placeholderName); - } - }); + return replacePlaceholders(value, placeholderName -> properties.getProperty(placeholderName)); } /** diff --git a/spring-core/src/main/java/org/springframework/util/ReflectionUtils.java b/spring-core/src/main/java/org/springframework/util/ReflectionUtils.java index 67eb7e0b95..df768f27c5 100644 --- a/spring-core/src/main/java/org/springframework/util/ReflectionUtils.java +++ b/spring-core/src/main/java/org/springframework/util/ReflectionUtils.java @@ -47,6 +47,12 @@ import org.springframework.lang.Nullable; */ public abstract class ReflectionUtils { + /** + * Pre-built FieldFilter that matches all non-static, non-final fields. + */ + public static final FieldFilter COPYABLE_FIELDS = + field -> !(Modifier.isStatic(field.getModifiers()) || Modifier.isFinal(field.getModifiers())); + /** * Naming prefix for CGLIB-renamed methods. * @see #isCglibRenamedMethod @@ -845,18 +851,6 @@ public abstract class ReflectionUtils { } - /** - * Pre-built FieldFilter that matches all non-static, non-final fields. - */ - public static final FieldFilter COPYABLE_FIELDS = new FieldFilter() { - - @Override - public boolean matches(Field field) { - return !(Modifier.isStatic(field.getModifiers()) || Modifier.isFinal(field.getModifiers())); - } - }; - - /** * Pre-built MethodFilter that matches all non-bridge methods. */ diff --git a/spring-core/src/main/java/org/springframework/util/concurrent/CompletableToListenableFutureAdapter.java b/spring-core/src/main/java/org/springframework/util/concurrent/CompletableToListenableFutureAdapter.java index aadb2284cb..36698066cc 100644 --- a/spring-core/src/main/java/org/springframework/util/concurrent/CompletableToListenableFutureAdapter.java +++ b/spring-core/src/main/java/org/springframework/util/concurrent/CompletableToListenableFutureAdapter.java @@ -53,18 +53,14 @@ public class CompletableToListenableFutureAdapter implements ListenableFuture */ public CompletableToListenableFutureAdapter(CompletableFuture completableFuture) { this.completableFuture = completableFuture; - this.completableFuture.handle(new BiFunction() { - @Override - @Nullable - public Object apply(T result, @Nullable Throwable ex) { - if (ex != null) { - callbacks.failure(ex); - } - else { - callbacks.success(result); - } - return null; + this.completableFuture.handle((result, exception) -> { + if (exception != null) { + callbacks.failure(exception); } + else { + callbacks.success(result); + } + return null; }); } diff --git a/spring-core/src/main/java/org/springframework/util/concurrent/SettableListenableFuture.java b/spring-core/src/main/java/org/springframework/util/concurrent/SettableListenableFuture.java index 8fbce4ed93..ff29374902 100644 --- a/spring-core/src/main/java/org/springframework/util/concurrent/SettableListenableFuture.java +++ b/spring-core/src/main/java/org/springframework/util/concurrent/SettableListenableFuture.java @@ -37,11 +37,8 @@ import org.springframework.util.Assert; */ public class SettableListenableFuture implements ListenableFuture { - private static final Callable DUMMY_CALLABLE = new Callable() { - @Override - public Object call() throws Exception { - throw new IllegalStateException("Should never be called"); - } + private static final Callable DUMMY_CALLABLE = () -> { + throw new IllegalStateException("Should never be called"); }; diff --git a/spring-expression/src/main/java/org/springframework/expression/spel/ast/InlineList.java b/spring-expression/src/main/java/org/springframework/expression/spel/ast/InlineList.java index ab80bce9e2..f6a348ead2 100644 --- a/spring-expression/src/main/java/org/springframework/expression/spel/ast/InlineList.java +++ b/spring-expression/src/main/java/org/springframework/expression/spel/ast/InlineList.java @@ -137,17 +137,10 @@ public class InlineList extends SpelNodeImpl { final String constantFieldName = "inlineList$" + codeflow.nextFieldId(); final String className = codeflow.getClassName(); - codeflow.registerNewField(new CodeFlow.FieldAdder() { - public void generateField(ClassWriter cw, CodeFlow codeflow) { - cw.visitField(ACC_PRIVATE|ACC_STATIC|ACC_FINAL, constantFieldName, "Ljava/util/List;", null, null); - } - }); + codeflow.registerNewField((cw, codeflow1) + -> cw.visitField(ACC_PRIVATE|ACC_STATIC|ACC_FINAL, constantFieldName, "Ljava/util/List;", null, null)); - codeflow.registerNewClinit(new CodeFlow.ClinitAdder() { - public void generateCode(MethodVisitor mv, CodeFlow codeflow) { - generateClinitCode(className, constantFieldName, mv, codeflow, false); - } - }); + codeflow.registerNewClinit((mv1, codeflow12) -> generateClinitCode(className, constantFieldName, mv1, codeflow12, false)); mv.visitFieldInsn(GETSTATIC, className, constantFieldName, "Ljava/util/List;"); codeflow.pushDescriptor("Ljava/util/List"); diff --git a/spring-expression/src/main/java/org/springframework/expression/spel/support/ReflectiveMethodResolver.java b/spring-expression/src/main/java/org/springframework/expression/spel/support/ReflectiveMethodResolver.java index e4f3b2356c..959141dd62 100644 --- a/spring-expression/src/main/java/org/springframework/expression/spel/support/ReflectiveMethodResolver.java +++ b/spring-expression/src/main/java/org/springframework/expression/spel/support/ReflectiveMethodResolver.java @@ -121,25 +121,22 @@ public class ReflectiveMethodResolver implements MethodResolver { // Sort methods into a sensible order if (methods.size() > 1) { - Collections.sort(methods, new Comparator() { - @Override - public int compare(Method m1, Method m2) { - int m1pl = m1.getParameterCount(); - int m2pl = m2.getParameterCount(); - // varargs methods go last - if (m1pl == m2pl) { - if (!m1.isVarArgs() && m2.isVarArgs()) { - return -1; - } - else if (m1.isVarArgs() && !m2.isVarArgs()) { - return 1; - } - else { - return 0; - } + Collections.sort(methods, (m1, m2) -> { + int m1pl = m1.getParameterCount(); + int m2pl = m2.getParameterCount(); + // varargs methods go last + if (m1pl == m2pl) { + if (!m1.isVarArgs() && m2.isVarArgs()) { + return -1; + } + else if (m1.isVarArgs() && !m2.isVarArgs()) { + return 1; + } + else { + return 0; } - return (m1pl < m2pl ? -1 : (m1pl > m2pl ? 1 : 0)); } + return (m1pl < m2pl ? -1 : (m1pl > m2pl ? 1 : 0)); }); } diff --git a/spring-expression/src/main/java/org/springframework/expression/spel/support/ReflectivePropertyAccessor.java b/spring-expression/src/main/java/org/springframework/expression/spel/support/ReflectivePropertyAccessor.java index 47222b537c..285af6e391 100644 --- a/spring-expression/src/main/java/org/springframework/expression/spel/support/ReflectivePropertyAccessor.java +++ b/spring-expression/src/main/java/org/springframework/expression/spel/support/ReflectivePropertyAccessor.java @@ -391,12 +391,7 @@ public class ReflectivePropertyAccessor implements PropertyAccessor { */ private Method[] getSortedClassMethods(Class clazz) { Method[] methods = clazz.getMethods(); - Arrays.sort(methods, new Comparator() { - @Override - public int compare(Method o1, Method o2) { - return (o1.isBridge() == o2.isBridge()) ? 0 : (o1.isBridge() ? 1 : -1); - } - }); + Arrays.sort(methods, (o1, o2) -> (o1.isBridge() == o2.isBridge()) ? 0 : (o1.isBridge() ? 1 : -1)); return methods; } diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/config/SortedResourcesFactoryBean.java b/spring-jdbc/src/main/java/org/springframework/jdbc/config/SortedResourcesFactoryBean.java index 521e68a587..b944973efa 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/config/SortedResourcesFactoryBean.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/config/SortedResourcesFactoryBean.java @@ -77,15 +77,12 @@ public class SortedResourcesFactoryBean extends AbstractFactoryBean for (String location : this.locations) { List resources = new ArrayList<>( Arrays.asList(this.resourcePatternResolver.getResources(location))); - Collections.sort(resources, new Comparator() { - @Override - public int compare(Resource r1, Resource r2) { - try { - return r1.getURL().toString().compareTo(r2.getURL().toString()); - } - catch (IOException ex) { - return 0; - } + Collections.sort(resources, (r1, r2) -> { + try { + return r1.getURL().toString().compareTo(r2.getURL().toString()); + } + catch (IOException ex) { + return 0; } }); for (Resource resource : resources) { 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 7008cf8151..9427264111 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 @@ -105,15 +105,12 @@ public class JdbcBeanDefinitionReader { public void loadBeanDefinitions(String sql) { Assert.notNull(this.jdbcTemplate, "Not fully configured - specify DataSource or JdbcTemplate"); final Properties props = new Properties(); - this.jdbcTemplate.query(sql, new RowCallbackHandler() { - @Override - public void processRow(ResultSet rs) throws SQLException { - String beanName = rs.getString(1); - 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); - } + this.jdbcTemplate.query(sql, resultSet -> { + String beanName = resultSet.getString(1); + String property = resultSet.getString(2); + String value = resultSet.getString(3); + // Make a properties entry by combining bean name and property. + props.setProperty(beanName + '.' + property, value); }); this.propReader.registerBeanDefinitions(props); } diff --git a/spring-messaging/src/main/java/org/springframework/messaging/simp/annotation/support/SimpAnnotationMethodMessageHandler.java b/spring-messaging/src/main/java/org/springframework/messaging/simp/annotation/support/SimpAnnotationMethodMessageHandler.java index 2dfb03cbae..13fc91457e 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/simp/annotation/support/SimpAnnotationMethodMessageHandler.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/simp/annotation/support/SimpAnnotationMethodMessageHandler.java @@ -462,12 +462,7 @@ public class SimpAnnotationMethodMessageHandler extends AbstractMethodMessageHan @Override protected Comparator getMappingComparator(final Message message) { - return new Comparator() { - @Override - public int compare(SimpMessageMappingInfo info1, SimpMessageMappingInfo info2) { - return info1.compareTo(info2, message); - } - }; + return (info1, info2) -> info1.compareTo(info2, message); } @Override diff --git a/spring-messaging/src/main/java/org/springframework/messaging/simp/stomp/DefaultStompSession.java b/spring-messaging/src/main/java/org/springframework/messaging/simp/stomp/DefaultStompSession.java index 0c4c465649..97f07bcf39 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/simp/stomp/DefaultStompSession.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/simp/stomp/DefaultStompSession.java @@ -535,12 +535,7 @@ public class DefaultStompSession implements ConnectionHandlingStompSession { Assert.notNull(getTaskScheduler(), "To track receipts, a TaskScheduler must be configured"); DefaultStompSession.this.receiptHandlers.put(this.receiptId, this); Date startTime = new Date(System.currentTimeMillis() + getReceiptTimeLimit()); - this.future = getTaskScheduler().schedule(new Runnable() { - @Override - public void run() { - handleReceiptNotReceived(); - } - }, startTime); + this.future = getTaskScheduler().schedule(this::handleReceiptNotReceived, startTime); } @Override diff --git a/spring-messaging/src/main/java/org/springframework/messaging/simp/stomp/StompBrokerRelayMessageHandler.java b/spring-messaging/src/main/java/org/springframework/messaging/simp/stomp/StompBrokerRelayMessageHandler.java index 7a13a7181e..d45eff9eb6 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/simp/stomp/StompBrokerRelayMessageHandler.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/simp/stomp/StompBrokerRelayMessageHandler.java @@ -585,13 +585,10 @@ public class StompBrokerRelayMessageHandler extends AbstractBrokerMessageHandler logger.debug("TCP connection opened in session=" + getSessionId()); } this.tcpConnection = connection; - this.tcpConnection.onReadInactivity(new Runnable() { - @Override - public void run() { - if (tcpConnection != null && !isStompConnected) { - handleTcpConnectionFailure("No CONNECTED frame received in " + - MAX_TIME_TO_CONNECTED_FRAME + " ms.", null); - } + this.tcpConnection.onReadInactivity(() -> { + if (tcpConnection != null && !isStompConnected) { + handleTcpConnectionFailure("No CONNECTED frame received in " + + MAX_TIME_TO_CONNECTED_FRAME + " ms.", null); } }, MAX_TIME_TO_CONNECTED_FRAME); connection.send(MessageBuilder.createMessage(EMPTY_PAYLOAD, this.connectHeaders.getMessageHeaders())); @@ -701,32 +698,24 @@ public class StompBrokerRelayMessageHandler extends AbstractBrokerMessageHandler if (clientSendInterval > 0 && serverReceiveInterval > 0) { long interval = Math.max(clientSendInterval, serverReceiveInterval); - this.tcpConnection.onWriteInactivity(new Runnable() { - @Override - public void run() { - TcpConnection conn = tcpConnection; - if (conn != null) { - conn.send(HEARTBEAT_MESSAGE).addCallback( - new ListenableFutureCallback() { - public void onSuccess(Void result) { - } - public void onFailure(Throwable ex) { - handleTcpConnectionFailure( - "Failed to forward heartbeat: " + ex.getMessage(), ex); - } - }); - } + this.tcpConnection.onWriteInactivity(() -> { + TcpConnection conn = tcpConnection; + if (conn != null) { + conn.send(HEARTBEAT_MESSAGE).addCallback( + new ListenableFutureCallback() { + public void onSuccess(Void result) { + } + public void onFailure(Throwable ex) { + handleTcpConnectionFailure("Failed to forward heartbeat: " + ex.getMessage(), ex); + } + }); } }, interval); } if (clientReceiveInterval > 0 && serverSendInterval > 0) { final long interval = Math.max(clientReceiveInterval, serverSendInterval) * HEARTBEAT_MULTIPLIER; - this.tcpConnection.onReadInactivity(new Runnable() { - @Override - public void run() { - handleTcpConnectionFailure("No messages received in " + interval + " ms.", null); - } - }, interval); + this.tcpConnection.onReadInactivity(() + -> handleTcpConnectionFailure("No messages received in " + interval + " ms.", null), interval); } } diff --git a/spring-orm/src/main/java/org/springframework/orm/hibernate5/LocalSessionFactoryBuilder.java b/spring-orm/src/main/java/org/springframework/orm/hibernate5/LocalSessionFactoryBuilder.java index 33fafaaae0..c18d1bccb3 100644 --- a/spring-orm/src/main/java/org/springframework/orm/hibernate5/LocalSessionFactoryBuilder.java +++ b/spring-orm/src/main/java/org/springframework/orm/hibernate5/LocalSessionFactoryBuilder.java @@ -384,12 +384,8 @@ public class LocalSessionFactoryBuilder extends Configuration { private final Future sessionFactoryFuture; public BootstrapSessionFactoryInvocationHandler(AsyncTaskExecutor bootstrapExecutor) { - this.sessionFactoryFuture = bootstrapExecutor.submit(new Callable() { - @Override - public SessionFactory call() throws Exception { - return buildSessionFactory(); - } - }); + this.sessionFactoryFuture = bootstrapExecutor.submit( + (Callable) LocalSessionFactoryBuilder.this::buildSessionFactory); } @Override diff --git a/spring-orm/src/main/java/org/springframework/orm/jpa/AbstractEntityManagerFactoryBean.java b/spring-orm/src/main/java/org/springframework/orm/jpa/AbstractEntityManagerFactoryBean.java index 1c046a2f3d..a9980db046 100644 --- a/spring-orm/src/main/java/org/springframework/orm/jpa/AbstractEntityManagerFactoryBean.java +++ b/spring-orm/src/main/java/org/springframework/orm/jpa/AbstractEntityManagerFactoryBean.java @@ -350,12 +350,7 @@ public abstract class AbstractEntityManagerFactoryBean implements } if (this.bootstrapExecutor != null) { - this.nativeEntityManagerFactoryFuture = this.bootstrapExecutor.submit(new Callable() { - @Override - public EntityManagerFactory call() { - return buildNativeEntityManagerFactory(); - } - }); + this.nativeEntityManagerFactoryFuture = this.bootstrapExecutor.submit(this::buildNativeEntityManagerFactory); } else { this.nativeEntityManagerFactory = buildNativeEntityManagerFactory(); diff --git a/spring-orm/src/main/java/org/springframework/orm/jpa/support/PersistenceAnnotationBeanPostProcessor.java b/spring-orm/src/main/java/org/springframework/orm/jpa/support/PersistenceAnnotationBeanPostProcessor.java index c0ea97d8c0..894a3fbedf 100644 --- a/spring-orm/src/main/java/org/springframework/orm/jpa/support/PersistenceAnnotationBeanPostProcessor.java +++ b/spring-orm/src/main/java/org/springframework/orm/jpa/support/PersistenceAnnotationBeanPostProcessor.java @@ -404,38 +404,32 @@ public class PersistenceAnnotationBeanPostProcessor final LinkedList currElements = new LinkedList<>(); - ReflectionUtils.doWithLocalFields(targetClass, new ReflectionUtils.FieldCallback() { - @Override - public void doWith(Field field) throws IllegalArgumentException, IllegalAccessException { - if (field.isAnnotationPresent(PersistenceContext.class) || - field.isAnnotationPresent(PersistenceUnit.class)) { - if (Modifier.isStatic(field.getModifiers())) { - throw new IllegalStateException("Persistence annotations are not supported on static fields"); - } - currElements.add(new PersistenceElement(field, field, null)); + ReflectionUtils.doWithLocalFields(targetClass, field -> { + if (field.isAnnotationPresent(PersistenceContext.class) || + field.isAnnotationPresent(PersistenceUnit.class)) { + if (Modifier.isStatic(field.getModifiers())) { + throw new IllegalStateException("Persistence annotations are not supported on static fields"); } + currElements.add(new PersistenceElement(field, field, null)); } }); - ReflectionUtils.doWithLocalMethods(targetClass, new ReflectionUtils.MethodCallback() { - @Override - public void doWith(Method method) throws IllegalArgumentException, IllegalAccessException { - Method bridgedMethod = BridgeMethodResolver.findBridgedMethod(method); - if (!BridgeMethodResolver.isVisibilityBridgeMethodPair(method, bridgedMethod)) { - return; + ReflectionUtils.doWithLocalMethods(targetClass, method -> { + Method bridgedMethod = BridgeMethodResolver.findBridgedMethod(method); + if (!BridgeMethodResolver.isVisibilityBridgeMethodPair(method, bridgedMethod)) { + return; + } + if ((bridgedMethod.isAnnotationPresent(PersistenceContext.class) || + bridgedMethod.isAnnotationPresent(PersistenceUnit.class)) && + method.equals(ClassUtils.getMostSpecificMethod(method, clazz))) { + if (Modifier.isStatic(method.getModifiers())) { + throw new IllegalStateException("Persistence annotations are not supported on static methods"); } - if ((bridgedMethod.isAnnotationPresent(PersistenceContext.class) || - bridgedMethod.isAnnotationPresent(PersistenceUnit.class)) && - method.equals(ClassUtils.getMostSpecificMethod(method, clazz))) { - if (Modifier.isStatic(method.getModifiers())) { - throw new IllegalStateException("Persistence annotations are not supported on static methods"); - } - if (method.getParameterCount() != 1) { - throw new IllegalStateException("Persistence annotation requires a single-arg method: " + method); - } - PropertyDescriptor pd = BeanUtils.findPropertyForMethod(bridgedMethod, clazz); - currElements.add(new PersistenceElement(method, bridgedMethod, pd)); + if (method.getParameterCount() != 1) { + throw new IllegalStateException("Persistence annotation requires a single-arg method: " + method); } + PropertyDescriptor pd = BeanUtils.findPropertyForMethod(bridgedMethod, clazz); + currElements.add(new PersistenceElement(method, bridgedMethod, pd)); } }); diff --git a/spring-test/src/main/java/org/springframework/test/web/client/match/ContentRequestMatchers.java b/spring-test/src/main/java/org/springframework/test/web/client/match/ContentRequestMatchers.java index 7bd05340c4..2bc9f3ccdc 100644 --- a/spring-test/src/main/java/org/springframework/test/web/client/match/ContentRequestMatchers.java +++ b/spring-test/src/main/java/org/springframework/test/web/client/match/ContentRequestMatchers.java @@ -70,13 +70,10 @@ public class ContentRequestMatchers { * Assert the request content type as a {@link MediaType}. */ public RequestMatcher contentType(final MediaType expectedContentType) { - return new RequestMatcher() { - @Override - public void match(ClientHttpRequest request) throws IOException, AssertionError { - MediaType actualContentType = request.getHeaders().getContentType(); - assertTrue("Content type not set", actualContentType != null); - assertEquals("Content type", expectedContentType, actualContentType); - } + return request -> { + MediaType actualContentType = request.getHeaders().getContentType(); + assertTrue("Content type not set", actualContentType != null); + assertEquals("Content type", expectedContentType, actualContentType); }; } @@ -93,15 +90,12 @@ public class ContentRequestMatchers { * content type as defined by {@link MediaType#isCompatibleWith(MediaType)}. */ public RequestMatcher contentTypeCompatibleWith(final MediaType contentType) { - return new RequestMatcher() { - @Override - public void match(ClientHttpRequest request) throws IOException, AssertionError { - MediaType actualContentType = request.getHeaders().getContentType(); - assertTrue("Content type not set", actualContentType != null); - if (actualContentType != null) { - assertTrue("Content type [" + actualContentType + "] is not compatible with [" + contentType + "]", - actualContentType.isCompatibleWith(contentType)); - } + return request -> { + MediaType actualContentType = request.getHeaders().getContentType(); + assertTrue("Content type not set", actualContentType != null); + if (actualContentType != null) { + assertTrue("Content type [" + actualContentType + "] is not compatible with [" + contentType + "]", + actualContentType.isCompatibleWith(contentType)); } }; } @@ -110,12 +104,9 @@ public class ContentRequestMatchers { * Get the body of the request as a UTF-8 string and appply the given {@link Matcher}. */ public RequestMatcher string(final Matcher matcher) { - return new RequestMatcher() { - @Override - public void match(ClientHttpRequest request) throws IOException, AssertionError { - MockClientHttpRequest mockRequest = (MockClientHttpRequest) request; - assertThat("Request content", mockRequest.getBodyAsString(), matcher); - } + return request -> { + MockClientHttpRequest mockRequest = (MockClientHttpRequest) request; + assertThat("Request content", mockRequest.getBodyAsString(), matcher); }; } @@ -123,12 +114,9 @@ public class ContentRequestMatchers { * Get the body of the request as a UTF-8 string and compare it to the given String. */ public RequestMatcher string(final String expectedContent) { - return new RequestMatcher() { - @Override - public void match(ClientHttpRequest request) throws IOException, AssertionError { - MockClientHttpRequest mockRequest = (MockClientHttpRequest) request; - assertEquals("Request content", expectedContent, mockRequest.getBodyAsString()); - } + return request -> { + MockClientHttpRequest mockRequest = (MockClientHttpRequest) request; + assertEquals("Request content", expectedContent, mockRequest.getBodyAsString()); }; } @@ -136,12 +124,9 @@ public class ContentRequestMatchers { * Compare the body of the request to the given byte array. */ public RequestMatcher bytes(final byte[] expectedContent) { - return new RequestMatcher() { - @Override - public void match(ClientHttpRequest request) throws IOException, AssertionError { - MockClientHttpRequest mockRequest = (MockClientHttpRequest) request; - assertEquals("Request content", expectedContent, mockRequest.getBodyAsBytes()); - } + return request -> { + MockClientHttpRequest mockRequest = (MockClientHttpRequest) request; + assertEquals("Request content", expectedContent, mockRequest.getBodyAsBytes()); }; } @@ -150,23 +135,20 @@ public class ContentRequestMatchers { * @since 4.3 */ public RequestMatcher formData(final MultiValueMap expectedContent) { - return new RequestMatcher() { - @Override - public void match(final ClientHttpRequest request) throws IOException, AssertionError { - HttpInputMessage inputMessage = new HttpInputMessage() { - @Override - public InputStream getBody() throws IOException { - MockClientHttpRequest mockRequest = (MockClientHttpRequest) request; - return new ByteArrayInputStream(mockRequest.getBodyAsBytes()); - } - @Override - public HttpHeaders getHeaders() { - return request.getHeaders(); - } - }; - FormHttpMessageConverter converter = new FormHttpMessageConverter(); - assertEquals("Request content", expectedContent, converter.read(null, inputMessage)); - } + return request -> { + HttpInputMessage inputMessage = new HttpInputMessage() { + @Override + public InputStream getBody() throws IOException { + MockClientHttpRequest mockRequest = (MockClientHttpRequest) request; + return new ByteArrayInputStream(mockRequest.getBodyAsBytes()); + } + @Override + public HttpHeaders getHeaders() { + return request.getHeaders(); + } + }; + FormHttpMessageConverter converter = new FormHttpMessageConverter(); + assertEquals("Request content", expectedContent, converter.read(null, inputMessage)); }; } diff --git a/spring-test/src/main/java/org/springframework/test/web/client/match/MockRestRequestMatchers.java b/spring-test/src/main/java/org/springframework/test/web/client/match/MockRestRequestMatchers.java index a426c85e52..c34c3e0fe5 100644 --- a/spring-test/src/main/java/org/springframework/test/web/client/match/MockRestRequestMatchers.java +++ b/spring-test/src/main/java/org/springframework/test/web/client/match/MockRestRequestMatchers.java @@ -16,7 +16,6 @@ package org.springframework.test.web.client.match; -import java.io.IOException; import java.net.URI; import java.util.List; import java.util.Map; @@ -55,11 +54,7 @@ public abstract class MockRestRequestMatchers { * Match to any request. */ public static RequestMatcher anything() { - return new RequestMatcher() { - @Override - public void match(ClientHttpRequest request) throws AssertionError { - } - }; + return request -> {}; } /** @@ -69,12 +64,7 @@ public abstract class MockRestRequestMatchers { */ public static RequestMatcher method(final HttpMethod method) { Assert.notNull(method, "'method' must not be null"); - return new RequestMatcher() { - @Override - public void match(ClientHttpRequest request) throws AssertionError { - AssertionErrors.assertEquals("Unexpected HttpMethod", method, request.getMethod()); - } - }; + return request -> assertEquals("Unexpected HttpMethod", method, request.getMethod()); } /** @@ -84,12 +74,7 @@ public abstract class MockRestRequestMatchers { */ public static RequestMatcher requestTo(final Matcher matcher) { Assert.notNull(matcher, "'matcher' must not be null"); - return new RequestMatcher() { - @Override - public void match(ClientHttpRequest request) throws IOException, AssertionError { - assertThat("Request URI", request.getURI().toString(), matcher); - } - }; + return request -> assertThat("Request URI", request.getURI().toString(), matcher); } /** @@ -99,12 +84,7 @@ public abstract class MockRestRequestMatchers { */ public static RequestMatcher requestTo(final String expectedUri) { Assert.notNull(expectedUri, "'uri' must not be null"); - return new RequestMatcher() { - @Override - public void match(ClientHttpRequest request) throws IOException, AssertionError { - assertEquals("Request URI", expectedUri, request.getURI().toString()); - } - }; + return request -> assertEquals("Request URI", expectedUri, request.getURI().toString()); } /** @@ -114,12 +94,7 @@ public abstract class MockRestRequestMatchers { */ public static RequestMatcher requestTo(final URI uri) { Assert.notNull(uri, "'uri' must not be null"); - return new RequestMatcher() { - @Override - public void match(ClientHttpRequest request) throws IOException, AssertionError { - AssertionErrors.assertEquals("Unexpected request", uri, request.getURI()); - } - }; + return request -> assertEquals("Unexpected request", uri, request.getURI()); } /** @@ -127,14 +102,11 @@ public abstract class MockRestRequestMatchers { */ @SafeVarargs public static RequestMatcher queryParam(final String name, final Matcher... matchers) { - return new RequestMatcher() { - @Override - public void match(ClientHttpRequest request) { - MultiValueMap params = getQueryParams(request); - assertValueCount("query param", name, params, matchers.length); - for (int i = 0 ; i < matchers.length; i++) { - assertThat("Query param", params.get(name).get(i), matchers[i]); - } + return request -> { + MultiValueMap params = getQueryParams(request); + assertValueCount("query param", name, params, matchers.length); + for (int i = 0 ; i < matchers.length; i++) { + assertThat("Query param", params.get(name).get(i), matchers[i]); } }; } @@ -143,14 +115,11 @@ public abstract class MockRestRequestMatchers { * Assert request query parameter values. */ public static RequestMatcher queryParam(final String name, final String... expectedValues) { - return new RequestMatcher() { - @Override - public void match(ClientHttpRequest request) { - MultiValueMap params = getQueryParams(request); - assertValueCount("query param", name, params, expectedValues.length); - for (int i = 0 ; i < expectedValues.length; i++) { - assertEquals("Query param + [" + name + "]", expectedValues[i], params.get(name).get(i)); - } + return request -> { + MultiValueMap params = getQueryParams(request); + assertValueCount("query param", name, params, expectedValues.length); + for (int i = 0 ; i < expectedValues.length; i++) { + assertEquals("Query param + [" + name + "]", expectedValues[i], params.get(name).get(i)); } }; } @@ -176,15 +145,12 @@ public abstract class MockRestRequestMatchers { */ @SafeVarargs public static RequestMatcher header(final String name, final Matcher... matchers) { - return new RequestMatcher() { - @Override - public void match(ClientHttpRequest request) { + return request-> { assertValueCount("header", name, request.getHeaders(), matchers.length); List headerValues = request.getHeaders().get(name); - Assert.state(headerValues != null, "No header values"); - for (int i = 0; i < matchers.length; i++) { - assertThat("Request header [" + name + "]", headerValues.get(i), matchers[i]); - } + Assert.state(headerValues != null, "No header values");for (int i = 0 ; i < matchers.length; i++) { + assertThat("Request header["+name+ "]", headerValues.get(i), matchers[i]); + } }; } @@ -193,15 +159,13 @@ public abstract class MockRestRequestMatchers { * Assert request header values. */ public static RequestMatcher header(final String name, final String... expectedValues) { - return new RequestMatcher() { - @Override - public void match(ClientHttpRequest request) { + return request-> { assertValueCount("header", name, request.getHeaders(), expectedValues.length); List headerValues = request.getHeaders().get(name); - Assert.state(headerValues != null, "No header values"); - for (int i = 0 ; i < expectedValues.length; i++) { - assertEquals("Request header [" + name + "]", expectedValues[i], headerValues.get(i)); - } + Assert.state(headerValues != null, "No header values");for (int i = 0 ; i < expectedValues.length; i++) { + assertEquals("Request header [" + name + "]", + expectedValues[i], headerValues.get(i)); + } }; } diff --git a/spring-tx/src/main/java/org/springframework/jca/cci/core/CciTemplate.java b/spring-tx/src/main/java/org/springframework/jca/cci/core/CciTemplate.java index fd9563de52..2c87ceb369 100644 --- a/spring-tx/src/main/java/org/springframework/jca/cci/core/CciTemplate.java +++ b/spring-tx/src/main/java/org/springframework/jca/cci/core/CciTemplate.java @@ -222,17 +222,13 @@ public class CciTemplate implements CciOperations { @Override public T execute(final InteractionCallback action) throws DataAccessException { Assert.notNull(action, "Callback object must not be null"); - return execute(new ConnectionCallback() { - @Override - public T doInConnection(Connection connection, ConnectionFactory connectionFactory) - throws ResourceException, SQLException, DataAccessException { - Interaction interaction = connection.createInteraction(); - try { - return action.doInInteraction(interaction, connectionFactory); - } - finally { - closeInteraction(interaction); - } + return execute((ConnectionCallback) (connection, connectionFactory) -> { + Interaction interaction = connection.createInteraction(); + try { + return action.doInInteraction(interaction, connectionFactory); + } + finally { + closeInteraction(interaction); } }); } diff --git a/spring-tx/src/main/java/org/springframework/jca/context/ResourceAdapterApplicationContext.java b/spring-tx/src/main/java/org/springframework/jca/context/ResourceAdapterApplicationContext.java index b822fc5fb6..1f6989ec04 100644 --- a/spring-tx/src/main/java/org/springframework/jca/context/ResourceAdapterApplicationContext.java +++ b/spring-tx/src/main/java/org/springframework/jca/context/ResourceAdapterApplicationContext.java @@ -59,12 +59,7 @@ public class ResourceAdapterApplicationContext extends GenericApplicationContext beanFactory.registerResolvableDependency(BootstrapContext.class, this.bootstrapContext); // JCA WorkManager resolved lazily - may not be available. - beanFactory.registerResolvableDependency(WorkManager.class, new ObjectFactory() { - @Override - public WorkManager getObject() { - return bootstrapContext.getWorkManager(); - } - }); + beanFactory.registerResolvableDependency(WorkManager.class, (ObjectFactory) bootstrapContext::getWorkManager); } } diff --git a/spring-tx/src/main/java/org/springframework/transaction/interceptor/TransactionAspectSupport.java b/spring-tx/src/main/java/org/springframework/transaction/interceptor/TransactionAspectSupport.java index 6fd90cdde6..dea0203310 100644 --- a/spring-tx/src/main/java/org/springframework/transaction/interceptor/TransactionAspectSupport.java +++ b/spring-tx/src/main/java/org/springframework/transaction/interceptor/TransactionAspectSupport.java @@ -303,34 +303,26 @@ public abstract class TransactionAspectSupport implements BeanFactoryAware, Init else { // It's a CallbackPreferringPlatformTransactionManager: pass a TransactionCallback in. try { - Object result = ((CallbackPreferringPlatformTransactionManager) tm).execute(txAttr, - new TransactionCallback() { - @Override - public Object doInTransaction(TransactionStatus status) { - TransactionInfo txInfo = prepareTransactionInfo(tm, txAttr, joinpointIdentification, status); - try { - return invocation.proceedWithInvocation(); - } - catch (Throwable ex) { - if (txAttr.rollbackOn(ex)) { - // A RuntimeException: will lead to a rollback. - if (ex instanceof RuntimeException) { - throw (RuntimeException) ex; - } - else { - throw new ThrowableHolderException(ex); - } - } - else { - // A normal return value: will lead to a commit. - return new ThrowableHolder(ex); - } - } - finally { - cleanupTransactionInfo(txInfo); - } + Object result = ((CallbackPreferringPlatformTransactionManager) tm).execute(txAttr, status -> { + TransactionInfo txInfo = prepareTransactionInfo(tm, txAttr, joinpointIdentification, status); + try { + return invocation.proceedWithInvocation(); + } catch (Throwable ex) { + if (txAttr.rollbackOn(ex)) { + // A RuntimeException: will lead to a rollback. + if (ex instanceof RuntimeException) { + throw (RuntimeException) ex; + } else { + throw new ThrowableHolderException(ex); } - }); + } else { + // A normal return value: will lead to a commit. + return new ThrowableHolder(ex); + } + } finally { + cleanupTransactionInfo(txInfo); + } + }); // Check result: It might indicate a Throwable to rethrow. if (result instanceof ThrowableHolder) { diff --git a/spring-web/src/main/java/org/springframework/http/MediaType.java b/spring-web/src/main/java/org/springframework/http/MediaType.java index 8130c35140..1dd92f6b46 100644 --- a/spring-web/src/main/java/org/springframework/http/MediaType.java +++ b/spring-web/src/main/java/org/springframework/http/MediaType.java @@ -290,6 +290,43 @@ public class MediaType extends MimeType implements Serializable { */ public final static String APPLICATION_PROBLEM_XML_VALUE = "application/problem+xml"; + /** + * Comparator used by {@link #sortByQualityValue(List)}. + */ + public static final Comparator QUALITY_VALUE_COMPARATOR = (mediaType1, mediaType2) -> { + double quality1 = mediaType1.getQualityValue(); + double quality2 = mediaType2.getQualityValue(); + int qualityComparison = Double.compare(quality2, quality1); + if (qualityComparison != 0) { + return qualityComparison; // audio/*;q=0.7 < audio/*;q=0.3 + } + else if (mediaType1.isWildcardType() && !mediaType2.isWildcardType()) { // */* < audio/* + return 1; + } + else if (mediaType2.isWildcardType() && !mediaType1.isWildcardType()) { // audio/* > */* + return -1; + } + else if (!mediaType1.getType().equals(mediaType2.getType())) { // audio/basic == text/html + return 0; + } + else { // mediaType1.getType().equals(mediaType2.getType()) + if (mediaType1.isWildcardSubtype() && !mediaType2.isWildcardSubtype()) { // audio/* < audio/basic + return 1; + } + else if (mediaType2.isWildcardSubtype() && !mediaType1.isWildcardSubtype()) { // audio/basic > audio/* + return -1; + } + else if (!mediaType1.getSubtype().equals(mediaType2.getSubtype())) { // audio/basic == audio/wave + return 0; + } + else { + int paramsSize1 = mediaType1.getParameters().size(); + int paramsSize2 = mediaType2.getParameters().size(); + return (paramsSize2 < paramsSize1 ? -1 : (paramsSize2 == paramsSize1 ? 0 : 1)); // audio/basic;level=1 < audio/basic + } + } + }; + private static final String PARAM_QUALITY_FACTOR = "q"; @@ -650,48 +687,6 @@ public class MediaType extends MimeType implements Serializable { } - /** - * Comparator used by {@link #sortByQualityValue(List)}. - */ - public static final Comparator QUALITY_VALUE_COMPARATOR = new Comparator() { - - @Override - public int compare(MediaType mediaType1, MediaType mediaType2) { - double quality1 = mediaType1.getQualityValue(); - double quality2 = mediaType2.getQualityValue(); - int qualityComparison = Double.compare(quality2, quality1); - if (qualityComparison != 0) { - return qualityComparison; // audio/*;q=0.7 < audio/*;q=0.3 - } - else if (mediaType1.isWildcardType() && !mediaType2.isWildcardType()) { // */* < audio/* - return 1; - } - else if (mediaType2.isWildcardType() && !mediaType1.isWildcardType()) { // audio/* > */* - return -1; - } - else if (!mediaType1.getType().equals(mediaType2.getType())) { // audio/basic == text/html - return 0; - } - else { // mediaType1.getType().equals(mediaType2.getType()) - if (mediaType1.isWildcardSubtype() && !mediaType2.isWildcardSubtype()) { // audio/* < audio/basic - return 1; - } - else if (mediaType2.isWildcardSubtype() && !mediaType1.isWildcardSubtype()) { // audio/basic > audio/* - return -1; - } - else if (!mediaType1.getSubtype().equals(mediaType2.getSubtype())) { // audio/basic == audio/wave - return 0; - } - else { - int paramsSize1 = mediaType1.getParameters().size(); - int paramsSize2 = mediaType2.getParameters().size(); - return (paramsSize2 < paramsSize1 ? -1 : (paramsSize2 == paramsSize1 ? 0 : 1)); // audio/basic;level=1 < audio/basic - } - } - } - }; - - /** * Comparator used by {@link #sortBySpecificity(List)}. */ diff --git a/spring-web/src/main/java/org/springframework/web/context/request/async/WebAsyncManager.java b/spring-web/src/main/java/org/springframework/web/context/request/async/WebAsyncManager.java index e0335a83db..a248ba2ed5 100644 --- a/spring-web/src/main/java/org/springframework/web/context/request/async/WebAsyncManager.java +++ b/spring-web/src/main/java/org/springframework/web/context/request/async/WebAsyncManager.java @@ -107,12 +107,8 @@ public final class WebAsyncManager { public void setAsyncWebRequest(final AsyncWebRequest asyncWebRequest) { Assert.notNull(asyncWebRequest, "AsyncWebRequest must not be null"); this.asyncWebRequest = asyncWebRequest; - this.asyncWebRequest.addCompletionHandler(new Runnable() { - @Override - public void run() { - asyncWebRequest.removeAttribute(WebAsyncUtils.WEB_ASYNC_MANAGER_ATTRIBUTE, RequestAttributes.SCOPE_REQUEST); - } - }); + this.asyncWebRequest.addCompletionHandler(() + -> asyncWebRequest.removeAttribute(WebAsyncUtils.WEB_ASYNC_MANAGER_ATTRIBUTE, RequestAttributes.SCOPE_REQUEST)); } /** @@ -289,43 +285,32 @@ public final class WebAsyncManager { final Callable callable = webAsyncTask.getCallable(); final CallableInterceptorChain interceptorChain = new CallableInterceptorChain(interceptors); - this.asyncWebRequest.addTimeoutHandler(new Runnable() { - @Override - public void run() { - logger.debug("Processing timeout"); - Object result = interceptorChain.triggerAfterTimeout(asyncWebRequest, callable); - if (result != CallableProcessingInterceptor.RESULT_NONE) { - setConcurrentResultAndDispatch(result); - } + this.asyncWebRequest.addTimeoutHandler(() -> { + logger.debug("Processing timeout"); + Object result = interceptorChain.triggerAfterTimeout(asyncWebRequest, callable); + if (result != CallableProcessingInterceptor.RESULT_NONE) { + setConcurrentResultAndDispatch(result); } }); - this.asyncWebRequest.addCompletionHandler(new Runnable() { - @Override - public void run() { - interceptorChain.triggerAfterCompletion(asyncWebRequest, callable); - } - }); + this.asyncWebRequest.addCompletionHandler(() -> interceptorChain.triggerAfterCompletion(asyncWebRequest, callable)); interceptorChain.applyBeforeConcurrentHandling(this.asyncWebRequest, callable); startAsyncProcessing(processingContext); try { - this.taskExecutor.submit(new Runnable() { - @Override - public void run() { - Object result = null; - try { - interceptorChain.applyPreProcess(asyncWebRequest, callable); - result = callable.call(); - } - catch (Throwable ex) { - result = ex; - } - finally { - result = interceptorChain.applyPostProcess(asyncWebRequest, callable, result); - } - setConcurrentResultAndDispatch(result); + this.taskExecutor.submit(() -> { + Object result = null; + try { + interceptorChain.applyPreProcess(asyncWebRequest, callable); + result = callable.call(); } + catch (Throwable ex) { + result = ex; + } + finally { + result = interceptorChain.applyPostProcess(asyncWebRequest, callable, result); + } + setConcurrentResultAndDispatch(result); }); } catch (RejectedExecutionException ex) { @@ -388,36 +373,26 @@ public final class WebAsyncManager { final DeferredResultInterceptorChain interceptorChain = new DeferredResultInterceptorChain(interceptors); - this.asyncWebRequest.addTimeoutHandler(new Runnable() { - @Override - public void run() { - try { - interceptorChain.triggerAfterTimeout(asyncWebRequest, deferredResult); - } - catch (Throwable ex) { - setConcurrentResultAndDispatch(ex); - } + this.asyncWebRequest.addTimeoutHandler(() -> { + try { + interceptorChain.triggerAfterTimeout(asyncWebRequest, deferredResult); + } + catch (Throwable ex) { + setConcurrentResultAndDispatch(ex); } }); - this.asyncWebRequest.addCompletionHandler(new Runnable() { - @Override - public void run() { - interceptorChain.triggerAfterCompletion(asyncWebRequest, deferredResult); - } - }); + this.asyncWebRequest.addCompletionHandler(() + -> interceptorChain.triggerAfterCompletion(asyncWebRequest, deferredResult)); interceptorChain.applyBeforeConcurrentHandling(this.asyncWebRequest, deferredResult); startAsyncProcessing(processingContext); try { interceptorChain.applyPreProcess(this.asyncWebRequest, deferredResult); - deferredResult.setResultHandler(new DeferredResultHandler() { - @Override - public void handleResult(Object result) { - result = interceptorChain.applyPostProcess(asyncWebRequest, deferredResult, result); - setConcurrentResultAndDispatch(result); - } + deferredResult.setResultHandler(result -> { + result = interceptorChain.applyPostProcess(asyncWebRequest, deferredResult, result); + setConcurrentResultAndDispatch(result); }); } catch (Throwable ex) { diff --git a/spring-web/src/main/java/org/springframework/web/method/annotation/ExceptionHandlerMethodResolver.java b/spring-web/src/main/java/org/springframework/web/method/annotation/ExceptionHandlerMethodResolver.java index 5f3ca4dcc9..995e17e5e1 100644 --- a/spring-web/src/main/java/org/springframework/web/method/annotation/ExceptionHandlerMethodResolver.java +++ b/spring-web/src/main/java/org/springframework/web/method/annotation/ExceptionHandlerMethodResolver.java @@ -47,12 +47,8 @@ public class ExceptionHandlerMethodResolver { /** * A filter for selecting {@code @ExceptionHandler} methods. */ - public static final MethodFilter EXCEPTION_HANDLER_METHODS = new MethodFilter() { - @Override - public boolean matches(Method method) { - return (AnnotationUtils.findAnnotation(method, ExceptionHandler.class) != null); - } - }; + public static final MethodFilter EXCEPTION_HANDLER_METHODS = + method -> (AnnotationUtils.findAnnotation(method, ExceptionHandler.class) != null); /** * Arbitrary {@link Method} reference, indicating no method found in the cache. diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/MvcUriComponentsBuilder.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/MvcUriComponentsBuilder.java index 6c17cfd75e..9990632752 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/MvcUriComponentsBuilder.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/MvcUriComponentsBuilder.java @@ -470,13 +470,10 @@ public class MvcUriComponentsBuilder { } private static Method getMethod(Class controllerType, final String methodName, final Object... args) { - MethodFilter selector = new MethodFilter() { - @Override - public boolean matches(Method method) { - String name = method.getName(); - int argLength = method.getParameterCount(); - return (name.equals(methodName) && argLength == args.length); - } + MethodFilter selector = method -> { + String name = method.getName(); + int argLength = method.getParameterCount(); + return (name.equals(methodName) && argLength == args.length); }; Set methods = MethodIntrospector.selectMethods(controllerType, selector); if (methods.size() == 1) { diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/RequestMappingHandlerAdapter.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/RequestMappingHandlerAdapter.java index 9a932a7135..0ccd31c5b8 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/RequestMappingHandlerAdapter.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/RequestMappingHandlerAdapter.java @@ -117,6 +117,19 @@ import org.springframework.web.util.WebUtils; public class RequestMappingHandlerAdapter extends AbstractHandlerMethodAdapter implements BeanFactoryAware, InitializingBean { + /** + * MethodFilter that matches {@link InitBinder @InitBinder} methods. + */ + public static final MethodFilter INIT_BINDER_METHODS = + method -> AnnotationUtils.findAnnotation(method, InitBinder.class) != null; + + /** + * MethodFilter that matches {@link ModelAttribute @ModelAttribute} methods. + */ + public static final MethodFilter MODEL_ATTRIBUTE_METHODS = + method -> ((AnnotationUtils.findAnnotation(method, RequestMapping.class) == null) + && (AnnotationUtils.findAnnotation(method, ModelAttribute.class) != null)); + private List customArgumentResolvers; private HandlerMethodArgumentResolverComposite argumentResolvers; @@ -981,26 +994,4 @@ public class RequestMappingHandlerAdapter extends AbstractHandlerMethodAdapter return mav; } - - /** - * MethodFilter that matches {@link InitBinder @InitBinder} methods. - */ - public static final MethodFilter INIT_BINDER_METHODS = new MethodFilter() { - @Override - public boolean matches(Method method) { - return AnnotationUtils.findAnnotation(method, InitBinder.class) != null; - } - }; - - /** - * MethodFilter that matches {@link ModelAttribute @ModelAttribute} methods. - */ - public static final MethodFilter MODEL_ATTRIBUTE_METHODS = new MethodFilter() { - @Override - public boolean matches(Method method) { - return ((AnnotationUtils.findAnnotation(method, RequestMapping.class) == null) && - (AnnotationUtils.findAnnotation(method, ModelAttribute.class) != null)); - } - }; - } diff --git a/spring-websocket/src/main/java/org/springframework/web/socket/client/jetty/JettyWebSocketClient.java b/spring-websocket/src/main/java/org/springframework/web/socket/client/jetty/JettyWebSocketClient.java index f83f29f666..e83019fbe0 100644 --- a/spring-websocket/src/main/java/org/springframework/web/socket/client/jetty/JettyWebSocketClient.java +++ b/spring-websocket/src/main/java/org/springframework/web/socket/client/jetty/JettyWebSocketClient.java @@ -170,13 +170,10 @@ public class JettyWebSocketClient extends AbstractWebSocketClient implements Lif final JettyWebSocketSession wsSession = new JettyWebSocketSession(attributes, user); final JettyWebSocketHandlerAdapter listener = new JettyWebSocketHandlerAdapter(wsHandler, wsSession); - Callable connectTask = new Callable() { - @Override - public WebSocketSession call() throws Exception { - Future future = client.connect(listener, uri, request); - future.get(); - return wsSession; - } + Callable connectTask = () -> { + Future future = client.connect(listener, uri, request); + future.get(); + return wsSession; }; if (this.taskExecutor != null) { diff --git a/spring-websocket/src/main/java/org/springframework/web/socket/client/standard/AnnotatedEndpointConnectionManager.java b/spring-websocket/src/main/java/org/springframework/web/socket/client/standard/AnnotatedEndpointConnectionManager.java index f77f12d634..aaa6d95d67 100644 --- a/spring-websocket/src/main/java/org/springframework/web/socket/client/standard/AnnotatedEndpointConnectionManager.java +++ b/spring-websocket/src/main/java/org/springframework/web/socket/client/standard/AnnotatedEndpointConnectionManager.java @@ -99,20 +99,17 @@ public class AnnotatedEndpointConnectionManager extends ConnectionManagerSupport @Override protected void openConnection() { - this.taskExecutor.execute(new Runnable() { - @Override - public void run() { - try { - if (logger.isInfoEnabled()) { - logger.info("Connecting to WebSocket at " + getUri()); - } - Object endpointToUse = (endpoint != null) ? endpoint : endpointProvider.getHandler(); - session = webSocketContainer.connectToServer(endpointToUse, getUri()); - logger.info("Successfully connected to WebSocket"); - } - catch (Throwable ex) { - logger.error("Failed to connect to WebSocket", ex); + this.taskExecutor.execute(() -> { + try { + if (logger.isInfoEnabled()) { + logger.info("Connecting to WebSocket at " + getUri()); } + Object endpointToUse = (endpoint != null) ? endpoint : endpointProvider.getHandler(); + session = webSocketContainer.connectToServer(endpointToUse, getUri()); + logger.info("Successfully connected to WebSocket"); + } + catch (Throwable ex) { + logger.error("Failed to connect to WebSocket", ex); } }); } diff --git a/spring-websocket/src/main/java/org/springframework/web/socket/client/standard/EndpointConnectionManager.java b/spring-websocket/src/main/java/org/springframework/web/socket/client/standard/EndpointConnectionManager.java index c8682a92f3..9790d2fcd1 100644 --- a/spring-websocket/src/main/java/org/springframework/web/socket/client/standard/EndpointConnectionManager.java +++ b/spring-websocket/src/main/java/org/springframework/web/socket/client/standard/EndpointConnectionManager.java @@ -130,21 +130,18 @@ public class EndpointConnectionManager extends ConnectionManagerSupport implemen @Override protected void openConnection() { - this.taskExecutor.execute(new Runnable() { - @Override - public void run() { - try { - if (logger.isInfoEnabled()) { - logger.info("Connecting to WebSocket at " + getUri()); - } - Endpoint endpointToUse = (endpoint != null) ? endpoint : endpointProvider.getHandler(); - ClientEndpointConfig endpointConfig = configBuilder.build(); - session = getWebSocketContainer().connectToServer(endpointToUse, endpointConfig, getUri()); - logger.info("Successfully connected to WebSocket"); - } - catch (Throwable ex) { - logger.error("Failed to connect to WebSocket", ex); + this.taskExecutor.execute(() -> { + try { + if (logger.isInfoEnabled()) { + logger.info("Connecting to WebSocket at " + getUri()); } + Endpoint endpointToUse = (endpoint != null) ? endpoint : endpointProvider.getHandler(); + ClientEndpointConfig endpointConfig = configBuilder.build(); + session = getWebSocketContainer().connectToServer(endpointToUse, endpointConfig, getUri()); + logger.info("Successfully connected to WebSocket"); + } + catch (Throwable ex) { + logger.error("Failed to connect to WebSocket", ex); } }); } diff --git a/spring-websocket/src/main/java/org/springframework/web/socket/client/standard/StandardWebSocketClient.java b/spring-websocket/src/main/java/org/springframework/web/socket/client/standard/StandardWebSocketClient.java index 39907eabc1..0ddd426622 100644 --- a/spring-websocket/src/main/java/org/springframework/web/socket/client/standard/StandardWebSocketClient.java +++ b/spring-websocket/src/main/java/org/springframework/web/socket/client/standard/StandardWebSocketClient.java @@ -144,12 +144,9 @@ public class StandardWebSocketClient extends AbstractWebSocketClient { final Endpoint endpoint = new StandardWebSocketHandlerAdapter(webSocketHandler, session); - Callable connectTask = new Callable() { - @Override - public WebSocketSession call() throws Exception { - webSocketContainer.connectToServer(endpoint, endpointConfig, uri); - return session; - } + Callable connectTask = () -> { + webSocketContainer.connectToServer(endpoint, endpointConfig, uri); + return session; }; if (this.taskExecutor != null) { diff --git a/spring-websocket/src/main/java/org/springframework/web/socket/config/WebSocketMessageBrokerStats.java b/spring-websocket/src/main/java/org/springframework/web/socket/config/WebSocketMessageBrokerStats.java index a18318cfca..a135db9744 100644 --- a/spring-websocket/src/main/java/org/springframework/web/socket/config/WebSocketMessageBrokerStats.java +++ b/spring-websocket/src/main/java/org/springframework/web/socket/config/WebSocketMessageBrokerStats.java @@ -110,12 +110,9 @@ public class WebSocketMessageBrokerStats { @Nullable private ScheduledFuture initLoggingTask(long initialDelay) { if (logger.isInfoEnabled() && this.loggingPeriod > 0) { - return this.sockJsTaskScheduler.scheduleAtFixedRate(new Runnable() { - @Override - public void run() { - logger.info(WebSocketMessageBrokerStats.this.toString()); - } - }, initialDelay, this.loggingPeriod, TimeUnit.MILLISECONDS); + return this.sockJsTaskScheduler.scheduleAtFixedRate(() + -> logger.info(WebSocketMessageBrokerStats.this.toString()), + initialDelay, this.loggingPeriod, TimeUnit.MILLISECONDS); } return null; } diff --git a/spring-websocket/src/main/java/org/springframework/web/socket/messaging/WebSocketStompClient.java b/spring-websocket/src/main/java/org/springframework/web/socket/messaging/WebSocketStompClient.java index a951b7193a..55671bee1b 100644 --- a/spring-websocket/src/main/java/org/springframework/web/socket/messaging/WebSocketStompClient.java +++ b/spring-websocket/src/main/java/org/springframework/web/socket/messaging/WebSocketStompClient.java @@ -401,21 +401,18 @@ public class WebSocketStompClient extends StompClientSupport implements SmartLif public void onReadInactivity(final Runnable runnable, final long duration) { Assert.state(getTaskScheduler() != null, "No TaskScheduler configured"); this.lastReadTime = System.currentTimeMillis(); - this.inactivityTasks.add(getTaskScheduler().scheduleWithFixedDelay(new Runnable() { - @Override - public void run() { - if (System.currentTimeMillis() - lastReadTime > duration) { - try { - runnable.run(); - } - catch (Throwable ex) { - if (logger.isDebugEnabled()) { - logger.debug("ReadInactivityTask failure", ex); - } - } - } - } - }, duration / 2)); + this.inactivityTasks.add(getTaskScheduler().scheduleWithFixedDelay(() -> { + if (System.currentTimeMillis() - lastReadTime > duration) { + try { + runnable.run(); + } + catch (Throwable ex) { + if (logger.isDebugEnabled()) { + logger.debug("ReadInactivityTask failure", ex); + } + } + } + }, duration / 2)); } @Override diff --git a/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/client/AbstractClientSockJsSession.java b/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/client/AbstractClientSockJsSession.java index f84ee6bf9e..dc0a804da0 100644 --- a/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/client/AbstractClientSockJsSession.java +++ b/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/client/AbstractClientSockJsSession.java @@ -116,12 +116,7 @@ public abstract class AbstractClientSockJsSession implements WebSocketSession { * request. */ Runnable getTimeoutTask() { - return new Runnable() { - @Override - public void run() { - closeInternal(new CloseStatus(2007, "Transport timed out")); - } - }; + return () -> closeInternal(new CloseStatus(2007, "Transport timed out")); } @Override diff --git a/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/client/RestTemplateXhrTransport.java b/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/client/RestTemplateXhrTransport.java index 0d226facc9..2950a21fe7 100644 --- a/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/client/RestTemplateXhrTransport.java +++ b/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/client/RestTemplateXhrTransport.java @@ -99,35 +99,32 @@ public class RestTemplateXhrTransport extends AbstractXhrTransport { final URI receiveUrl, final HttpHeaders handshakeHeaders, final XhrClientSockJsSession session, final SettableListenableFuture connectFuture) { - getTaskExecutor().execute(new Runnable() { - @Override - public void run() { - HttpHeaders httpHeaders = transportRequest.getHttpRequestHeaders(); - XhrRequestCallback requestCallback = new XhrRequestCallback(handshakeHeaders); - XhrRequestCallback requestCallbackAfterHandshake = new XhrRequestCallback(httpHeaders); - XhrReceiveExtractor responseExtractor = new XhrReceiveExtractor(session); - while (true) { - if (session.isDisconnected()) { - session.afterTransportClosed(null); - break; + getTaskExecutor().execute(() -> { + HttpHeaders httpHeaders = transportRequest.getHttpRequestHeaders(); + XhrRequestCallback requestCallback = new XhrRequestCallback(handshakeHeaders); + XhrRequestCallback requestCallbackAfterHandshake = new XhrRequestCallback(httpHeaders); + XhrReceiveExtractor responseExtractor = new XhrReceiveExtractor(session); + while (true) { + if (session.isDisconnected()) { + session.afterTransportClosed(null); + break; + } + try { + if (logger.isTraceEnabled()) { + logger.trace("Starting XHR receive request, url=" + receiveUrl); } - try { - if (logger.isTraceEnabled()) { - logger.trace("Starting XHR receive request, url=" + receiveUrl); - } - getRestTemplate().execute(receiveUrl, HttpMethod.POST, requestCallback, responseExtractor); - requestCallback = requestCallbackAfterHandshake; + getRestTemplate().execute(receiveUrl, HttpMethod.POST, requestCallback, responseExtractor); + requestCallback = requestCallbackAfterHandshake; + } + catch (Throwable ex) { + if (!connectFuture.isDone()) { + connectFuture.setException(ex); } - catch (Throwable ex) { - if (!connectFuture.isDone()) { - connectFuture.setException(ex); - } - else { - session.handleTransportError(ex); - session.afterTransportClosed(new CloseStatus(1006, ex.getMessage())); - } - break; + else { + session.handleTransportError(ex); + session.afterTransportClosed(new CloseStatus(1006, ex.getMessage())); } + break; } } }); diff --git a/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/transport/TransportHandlingSockJsService.java b/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/transport/TransportHandlingSockJsService.java index dcf20921cc..2257ae4ab5 100644 --- a/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/transport/TransportHandlingSockJsService.java +++ b/spring-websocket/src/main/java/org/springframework/web/socket/sockjs/transport/TransportHandlingSockJsService.java @@ -368,27 +368,24 @@ public class TransportHandlingSockJsService extends AbstractSockJsService implem if (this.sessionCleanupTask != null) { return; } - this.sessionCleanupTask = getTaskScheduler().scheduleAtFixedRate(new Runnable() { - @Override - public void run() { - List removedIds = new ArrayList<>(); - for (SockJsSession session : sessions.values()) { - try { - if (session.getTimeSinceLastActive() > getDisconnectDelay()) { - sessions.remove(session.getId()); - removedIds.add(session.getId()); - session.close(); - } - } - catch (Throwable ex) { - // Could be part of normal workflow (e.g. browser tab closed) - logger.debug("Failed to close " + session, ex); + this.sessionCleanupTask = getTaskScheduler().scheduleAtFixedRate(() -> { + List removedIds = new ArrayList<>(); + for (SockJsSession session : sessions.values()) { + try { + if (session.getTimeSinceLastActive() > getDisconnectDelay()) { + sessions.remove(session.getId()); + removedIds.add(session.getId()); + session.close(); } } - if (logger.isDebugEnabled() && !removedIds.isEmpty()) { - logger.debug("Closed " + removedIds.size() + " sessions: " + removedIds); + catch (Throwable ex) { + // Could be part of normal workflow (e.g. browser tab closed) + logger.debug("Failed to close " + session, ex); } } + if (logger.isDebugEnabled() && !removedIds.isEmpty()) { + logger.debug("Closed " + removedIds.size() + " sessions: " + removedIds); + } }, getDisconnectDelay()); } }