If the source is an annotation that is not synthesizable, it + * will be returned unmodified. + *
Consult the documentation for {@link MergedAnnotation#synthesize()}
+ * for an explanation of what is considered synthesizable.
*/
- protected abstract A createSynthesized();
+ protected abstract A createSynthesizedAnnotation();
}
diff --git a/spring-core/src/main/java/org/springframework/core/annotation/MergedAnnotation.java b/spring-core/src/main/java/org/springframework/core/annotation/MergedAnnotation.java
index ed60e365c3..68422f7ec0 100644
--- a/spring-core/src/main/java/org/springframework/core/annotation/MergedAnnotation.java
+++ b/spring-core/src/main/java/org/springframework/core/annotation/MergedAnnotation.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2002-2020 the original author or authors.
+ * Copyright 2002-2022 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -19,7 +19,6 @@ package org.springframework.core.annotation;
import java.lang.annotation.Annotation;
import java.lang.annotation.Inherited;
import java.lang.reflect.AnnotatedElement;
-import java.lang.reflect.Proxy;
import java.util.EnumSet;
import java.util.List;
import java.util.Map;
@@ -481,12 +480,15 @@ public interface MergedAnnotation {
/**
* Create a type-safe synthesized version of this merged annotation that can
* be used directly in code.
- * The result is synthesized using a JDK {@link Proxy} and as a result may
- * incur a computational cost when first invoked.
+ * The result is synthesized using a JDK {@link java.lang.reflect.Proxy Proxy}
+ * and as a result may incur a computational cost when first invoked.
+ * If this merged annotation was created {@linkplain #of(AnnotatedElement, Class, Map)
+ * from} a map of annotation attributes or default attribute values, those
+ * attributes will always be synthesized into an annotation instance.
* If this merged annotation was created {@linkplain #from(Annotation) from}
* an annotation instance, that annotation will be returned unmodified if it is
* not synthesizable. An annotation is considered synthesizable if
- * one of the following is true.
+ * it has not already been synthesized and one of the following is true.
* The result is synthesized using a JDK {@link Proxy} and as a result may
- * incur a computational cost when first invoked.
+ * The result is synthesized using a JDK {@link java.lang.reflect.Proxy Proxy}
+ * and as a result may incur a computational cost when first invoked.
* Consult the documentation for {@link #synthesize()} for an explanation
* of what is considered synthesizable.
* @param condition the test to determine if the annotation can be synthesized
diff --git a/spring-core/src/main/java/org/springframework/core/annotation/MissingMergedAnnotation.java b/spring-core/src/main/java/org/springframework/core/annotation/MissingMergedAnnotation.java
index caa764caf1..0c7c9abad6 100644
--- a/spring-core/src/main/java/org/springframework/core/annotation/MissingMergedAnnotation.java
+++ b/spring-core/src/main/java/org/springframework/core/annotation/MissingMergedAnnotation.java
@@ -162,7 +162,7 @@ final class MissingMergedAnnotation extends AbstractMerged
}
@Override
- protected A createSynthesized() {
+ protected A createSynthesizedAnnotation() {
throw new NoSuchElementException("Unable to synthesize missing annotation");
}
diff --git a/spring-core/src/main/java/org/springframework/core/annotation/TypeMappedAnnotation.java b/spring-core/src/main/java/org/springframework/core/annotation/TypeMappedAnnotation.java
index 06aa93d7d5..d38042b718 100644
--- a/spring-core/src/main/java/org/springframework/core/annotation/TypeMappedAnnotation.java
+++ b/spring-core/src/main/java/org/springframework/core/annotation/TypeMappedAnnotation.java
@@ -328,7 +328,7 @@ final class TypeMappedAnnotation extends AbstractMergedAnn
@Override
@SuppressWarnings("unchecked")
- protected A createSynthesized() {
+ protected A createSynthesizedAnnotation() {
if (getType().isInstance(this.rootAttributes) && !isSynthesizable()) {
return (A) this.rootAttributes;
}
*