From 9cfe79186d56bb2abd0d2cd726c2123aa2a04616 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Deleuze?= Date: Wed, 7 Sep 2022 10:10:07 +0200 Subject: [PATCH] Stop using RuntimeHintsUtils Due to gh-29053, we can stop using RuntimeHintsUtils to register SynthesizedAnnotation proxies. Closes gh-29059 --- .../BeanFactoryAnnotationsRuntimeHints.java | 37 -------------- .../resources/META-INF/spring/aot.factories | 1 - .../ReflectiveRuntimeHintsRegistrar.java | 13 ----- .../ReflectiveRuntimeHintsRegistrarTests.java | 17 ------- .../MessagingAnnotationsRuntimeHints.java | 43 ----------------- .../SimpAnnotationsRuntimeHints.java | 38 --------------- .../AbstractMessageBrokerConfiguration.java | 4 -- .../context/aot/TestAotProcessorTests.java | 3 +- .../annotation/TransactionRuntimeHints.java | 3 -- .../WebAnnotationsRuntimeHintsRegistrar.java | 48 ------------------- .../config/WebFluxConfigurationSupport.java | 3 -- .../WebMvcConfigurationSupport.java | 3 -- 12 files changed, 1 insertion(+), 212 deletions(-) delete mode 100644 spring-beans/src/main/java/org/springframework/beans/factory/annotation/BeanFactoryAnnotationsRuntimeHints.java delete mode 100644 spring-messaging/src/main/java/org/springframework/messaging/handler/annotation/MessagingAnnotationsRuntimeHints.java delete mode 100644 spring-messaging/src/main/java/org/springframework/messaging/simp/annotation/SimpAnnotationsRuntimeHints.java delete mode 100644 spring-web/src/main/java/org/springframework/web/bind/annotation/WebAnnotationsRuntimeHintsRegistrar.java diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/annotation/BeanFactoryAnnotationsRuntimeHints.java b/spring-beans/src/main/java/org/springframework/beans/factory/annotation/BeanFactoryAnnotationsRuntimeHints.java deleted file mode 100644 index ec7ad57fdb8..00000000000 --- a/spring-beans/src/main/java/org/springframework/beans/factory/annotation/BeanFactoryAnnotationsRuntimeHints.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * 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. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.beans.factory.annotation; - -import org.springframework.aot.hint.RuntimeHints; -import org.springframework.aot.hint.RuntimeHintsRegistrar; -import org.springframework.aot.hint.support.RuntimeHintsUtils; -import org.springframework.lang.Nullable; - -/** - * {@link RuntimeHintsRegistrar} implementation for bean factory annotations. - * - * @author Stephane Nicoll - * @since 6.0 - */ -class BeanFactoryAnnotationsRuntimeHints implements RuntimeHintsRegistrar { - - @Override - @SuppressWarnings("deprecation") - public void registerHints(RuntimeHints hints, @Nullable ClassLoader classLoader) { - RuntimeHintsUtils.registerSynthesizedAnnotation(hints, Qualifier.class); - } -} diff --git a/spring-beans/src/main/resources/META-INF/spring/aot.factories b/spring-beans/src/main/resources/META-INF/spring/aot.factories index c68e89fda2f..fd9edf06871 100644 --- a/spring-beans/src/main/resources/META-INF/spring/aot.factories +++ b/spring-beans/src/main/resources/META-INF/spring/aot.factories @@ -1,5 +1,4 @@ org.springframework.aot.hint.RuntimeHintsRegistrar=\ -org.springframework.beans.factory.annotation.BeanFactoryAnnotationsRuntimeHints,\ org.springframework.beans.factory.annotation.JakartaAnnotationsRuntimeHints org.springframework.beans.factory.aot.BeanFactoryInitializationAotProcessor=\ diff --git a/spring-core/src/main/java/org/springframework/aot/hint/annotation/ReflectiveRuntimeHintsRegistrar.java b/spring-core/src/main/java/org/springframework/aot/hint/annotation/ReflectiveRuntimeHintsRegistrar.java index a8bcceb292a..58b42a424c7 100644 --- a/spring-core/src/main/java/org/springframework/aot/hint/annotation/ReflectiveRuntimeHintsRegistrar.java +++ b/spring-core/src/main/java/org/springframework/aot/hint/annotation/ReflectiveRuntimeHintsRegistrar.java @@ -28,8 +28,6 @@ import java.util.function.Consumer; import org.springframework.aot.hint.ReflectionHints; import org.springframework.aot.hint.RuntimeHints; -import org.springframework.aot.hint.support.RuntimeHintsUtils; -import org.springframework.core.annotation.MergedAnnotation; import org.springframework.core.annotation.MergedAnnotations; import org.springframework.util.ClassUtils; import org.springframework.util.ReflectionUtils; @@ -62,20 +60,9 @@ public class ReflectiveRuntimeHintsRegistrar { entries.forEach(entry -> { AnnotatedElement element = entry.element(); entry.processor().registerReflectionHints(runtimeHints.reflection(), element); - registerAnnotationIfNecessary(runtimeHints, element); }); } - @SuppressWarnings("deprecation") - private void registerAnnotationIfNecessary(RuntimeHints hints, AnnotatedElement element) { - MergedAnnotation reflectiveAnnotation = MergedAnnotations.from(element) - .get(Reflective.class); - MergedAnnotation metaSource = reflectiveAnnotation.getMetaSource(); - if (metaSource != null) { - RuntimeHintsUtils.registerAnnotationIfNecessary(hints, metaSource); - } - } - private void processType(Set entries, Class typeToProcess) { if (isReflective(typeToProcess)) { entries.add(createEntry(typeToProcess)); diff --git a/spring-core/src/test/java/org/springframework/aot/hint/annotation/ReflectiveRuntimeHintsRegistrarTests.java b/spring-core/src/test/java/org/springframework/aot/hint/annotation/ReflectiveRuntimeHintsRegistrarTests.java index 5c1057d3bb2..a075fb8261a 100644 --- a/spring-core/src/test/java/org/springframework/aot/hint/annotation/ReflectiveRuntimeHintsRegistrarTests.java +++ b/spring-core/src/test/java/org/springframework/aot/hint/annotation/ReflectiveRuntimeHintsRegistrarTests.java @@ -86,23 +86,6 @@ class ReflectiveRuntimeHintsRegistrarTests { .satisfies(methodHint -> assertThat(methodHint.getName()).isEqualTo("managed"))); } - @Test - void shouldNotRegisterAnnotationProxyIfNotNeeded() { - process(SampleMethodMetaAnnotatedBean.class); - RuntimeHints runtimeHints = this.runtimeHints; - assertThat(runtimeHints.proxies().jdkProxies()).isEmpty(); - } - - @Test - @SuppressWarnings("deprecation") - void shouldRegisterAnnotationProxy() { - process(SampleMethodMetaAnnotatedBeanWithAlias.class); - RuntimeHints runtimeHints = this.runtimeHints; - assertThat(RuntimeHintsPredicates.proxies() - .forInterfaces(SampleInvoker.class, org.springframework.core.annotation.SynthesizedAnnotation.class)) - .accepts(runtimeHints); - } - @Test void shouldProcessAnnotationOnInterface() { process(SampleMethodAnnotatedBeanWithInterface.class); diff --git a/spring-messaging/src/main/java/org/springframework/messaging/handler/annotation/MessagingAnnotationsRuntimeHints.java b/spring-messaging/src/main/java/org/springframework/messaging/handler/annotation/MessagingAnnotationsRuntimeHints.java deleted file mode 100644 index 0b36fba3492..00000000000 --- a/spring-messaging/src/main/java/org/springframework/messaging/handler/annotation/MessagingAnnotationsRuntimeHints.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * 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. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.messaging.handler.annotation; - -import java.util.stream.Stream; - -import org.springframework.aot.hint.RuntimeHints; -import org.springframework.aot.hint.RuntimeHintsRegistrar; -import org.springframework.aot.hint.support.RuntimeHintsUtils; -import org.springframework.lang.Nullable; -import org.springframework.stereotype.Controller; - -/** - * {@link RuntimeHintsRegistrar} implementation that makes messaging - * annotations available at runtime. - * - * @author Sebastien Deleuze - * @since 6.0 - */ -public class MessagingAnnotationsRuntimeHints implements RuntimeHintsRegistrar { - - @Override - @SuppressWarnings("deprecation") - public void registerHints(RuntimeHints hints, @Nullable ClassLoader classLoader) { - Stream.of(Controller.class, Header.class, Headers.class, Payload.class).forEach(annotationType -> - RuntimeHintsUtils.registerSynthesizedAnnotation(hints, annotationType)); - } - -} diff --git a/spring-messaging/src/main/java/org/springframework/messaging/simp/annotation/SimpAnnotationsRuntimeHints.java b/spring-messaging/src/main/java/org/springframework/messaging/simp/annotation/SimpAnnotationsRuntimeHints.java deleted file mode 100644 index 195489373ba..00000000000 --- a/spring-messaging/src/main/java/org/springframework/messaging/simp/annotation/SimpAnnotationsRuntimeHints.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * 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. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.messaging.simp.annotation; - -import org.springframework.aot.hint.RuntimeHints; -import org.springframework.aot.hint.RuntimeHintsRegistrar; -import org.springframework.aot.hint.support.RuntimeHintsUtils; - -/** - * {@link RuntimeHintsRegistrar} implementation that makes Simp annotations - * available at runtime. - * - * @author Sebastien Deleuze - * @since 6.0 - */ -public class SimpAnnotationsRuntimeHints implements RuntimeHintsRegistrar { - - @Override - @SuppressWarnings("deprecation") - public void registerHints(RuntimeHints hints, ClassLoader classLoader) { - RuntimeHintsUtils.registerSynthesizedAnnotation(hints, SendToUser.class); - } - -} diff --git a/spring-messaging/src/main/java/org/springframework/messaging/simp/config/AbstractMessageBrokerConfiguration.java b/spring-messaging/src/main/java/org/springframework/messaging/simp/config/AbstractMessageBrokerConfiguration.java index 85a58573e0e..f2a74288502 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/simp/config/AbstractMessageBrokerConfiguration.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/simp/config/AbstractMessageBrokerConfiguration.java @@ -27,7 +27,6 @@ import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.ImportRuntimeHints; import org.springframework.context.event.SmartApplicationListener; import org.springframework.core.task.TaskExecutor; import org.springframework.lang.Nullable; @@ -41,12 +40,10 @@ import org.springframework.messaging.converter.KotlinSerializationJsonMessageCon import org.springframework.messaging.converter.MappingJackson2MessageConverter; import org.springframework.messaging.converter.MessageConverter; import org.springframework.messaging.converter.StringMessageConverter; -import org.springframework.messaging.handler.annotation.MessagingAnnotationsRuntimeHints; import org.springframework.messaging.handler.invocation.HandlerMethodArgumentResolver; import org.springframework.messaging.handler.invocation.HandlerMethodReturnValueHandler; import org.springframework.messaging.simp.SimpLogging; import org.springframework.messaging.simp.SimpMessagingTemplate; -import org.springframework.messaging.simp.annotation.SimpAnnotationsRuntimeHints; import org.springframework.messaging.simp.annotation.support.SimpAnnotationMethodMessageHandler; import org.springframework.messaging.simp.broker.AbstractBrokerMessageHandler; import org.springframework.messaging.simp.broker.SimpleBrokerMessageHandler; @@ -98,7 +95,6 @@ import org.springframework.validation.beanvalidation.OptionalValidatorFactoryBea * @author Sebastien Deleuze * @since 4.0 */ -@ImportRuntimeHints({ MessagingAnnotationsRuntimeHints.class, SimpAnnotationsRuntimeHints.class }) public abstract class AbstractMessageBrokerConfiguration implements ApplicationContextAware { private static final String MVC_VALIDATOR_NAME = "mvcValidator"; diff --git a/spring-test/src/test/java/org/springframework/test/context/aot/TestAotProcessorTests.java b/spring-test/src/test/java/org/springframework/test/context/aot/TestAotProcessorTests.java index 7c870699ab8..8c80157cd9d 100644 --- a/spring-test/src/test/java/org/springframework/test/context/aot/TestAotProcessorTests.java +++ b/spring-test/src/test/java/org/springframework/test/context/aot/TestAotProcessorTests.java @@ -70,8 +70,7 @@ class TestAotProcessorTests extends AbstractAotTests { assertThat(findFiles(resourceOutput)).contains( "META-INF/native-image/org.example/app-tests/reflect-config.json", - "META-INF/native-image/org.example/app-tests/resource-config.json", - "META-INF/native-image/org.example/app-tests/proxy-config.json"); + "META-INF/native-image/org.example/app-tests/resource-config.json"); } private void copy(Class testClass, Path destination) { diff --git a/spring-tx/src/main/java/org/springframework/transaction/annotation/TransactionRuntimeHints.java b/spring-tx/src/main/java/org/springframework/transaction/annotation/TransactionRuntimeHints.java index e6b267a9f62..f5cdc81adf7 100644 --- a/spring-tx/src/main/java/org/springframework/transaction/annotation/TransactionRuntimeHints.java +++ b/spring-tx/src/main/java/org/springframework/transaction/annotation/TransactionRuntimeHints.java @@ -21,7 +21,6 @@ import org.springframework.aot.hint.RuntimeHints; import org.springframework.aot.hint.RuntimeHintsRegistrar; import org.springframework.aot.hint.TypeHint; import org.springframework.aot.hint.TypeReference; -import org.springframework.aot.hint.support.RuntimeHintsUtils; import org.springframework.transaction.TransactionDefinition; /** @@ -35,9 +34,7 @@ import org.springframework.transaction.TransactionDefinition; class TransactionRuntimeHints implements RuntimeHintsRegistrar { @Override - @SuppressWarnings("deprecation") public void registerHints(RuntimeHints hints, ClassLoader classLoader) { - RuntimeHintsUtils.registerSynthesizedAnnotation(hints, Transactional.class); hints.reflection().registerTypes(TypeReference.listOf( Isolation.class, Propagation.class, TransactionDefinition.class), TypeHint.builtWith(MemberCategory.DECLARED_FIELDS)); diff --git a/spring-web/src/main/java/org/springframework/web/bind/annotation/WebAnnotationsRuntimeHintsRegistrar.java b/spring-web/src/main/java/org/springframework/web/bind/annotation/WebAnnotationsRuntimeHintsRegistrar.java deleted file mode 100644 index 02bbd432897..00000000000 --- a/spring-web/src/main/java/org/springframework/web/bind/annotation/WebAnnotationsRuntimeHintsRegistrar.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * 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. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.web.bind.annotation; - -import java.util.stream.Stream; - -import org.springframework.aot.hint.RuntimeHints; -import org.springframework.aot.hint.RuntimeHintsRegistrar; -import org.springframework.aot.hint.support.RuntimeHintsUtils; -import org.springframework.lang.Nullable; -import org.springframework.stereotype.Controller; - -/** - * {@link RuntimeHintsRegistrar} implementation that makes web binding - * annotations available at runtime. - * - * @author Stephane Nicoll - * @since 6.0 - */ -public final class WebAnnotationsRuntimeHintsRegistrar implements RuntimeHintsRegistrar { - - @Override - @SuppressWarnings("deprecation") - public void registerHints(RuntimeHints hints, @Nullable ClassLoader classLoader) { - Stream.of(Controller.class, ControllerAdvice.class, CookieValue.class, - CrossOrigin.class, MatrixVariable.class, ModelAttribute.class, - PathVariable.class, RequestAttribute.class, RequestHeader.class, - RequestMapping.class, RequestParam.class, RequestPart.class, - ResponseStatus.class, SessionAttribute.class, SessionAttributes.class) - .forEach(annotationType -> - RuntimeHintsUtils.registerSynthesizedAnnotation(hints, annotationType)); - } - -} diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/config/WebFluxConfigurationSupport.java b/spring-webflux/src/main/java/org/springframework/web/reactive/config/WebFluxConfigurationSupport.java index a90b9ced4b0..21b08246f26 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/config/WebFluxConfigurationSupport.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/config/WebFluxConfigurationSupport.java @@ -27,7 +27,6 @@ import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.ImportRuntimeHints; import org.springframework.core.ReactiveAdapterRegistry; import org.springframework.core.annotation.Order; import org.springframework.core.convert.converter.Converter; @@ -46,7 +45,6 @@ import org.springframework.validation.MessageCodesResolver; import org.springframework.validation.Validator; import org.springframework.validation.beanvalidation.OptionalValidatorFactoryBean; import org.springframework.web.bind.WebDataBinder; -import org.springframework.web.bind.annotation.WebAnnotationsRuntimeHintsRegistrar; import org.springframework.web.bind.support.ConfigurableWebBindingInitializer; import org.springframework.web.cors.CorsConfiguration; import org.springframework.web.reactive.DispatcherHandler; @@ -85,7 +83,6 @@ import org.springframework.web.server.i18n.LocaleContextResolver; * @author Brian Clozel * @since 5.0 */ -@ImportRuntimeHints(WebAnnotationsRuntimeHintsRegistrar.class) public class WebFluxConfigurationSupport implements ApplicationContextAware { @Nullable diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/config/annotation/WebMvcConfigurationSupport.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/config/annotation/WebMvcConfigurationSupport.java index eda055e562e..9c38411f17b 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/config/annotation/WebMvcConfigurationSupport.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/config/annotation/WebMvcConfigurationSupport.java @@ -32,7 +32,6 @@ import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.ImportRuntimeHints; import org.springframework.context.annotation.Lazy; import org.springframework.core.SpringProperties; import org.springframework.core.convert.converter.Converter; @@ -71,7 +70,6 @@ import org.springframework.validation.beanvalidation.OptionalValidatorFactoryBea import org.springframework.web.HttpRequestHandler; import org.springframework.web.accept.ContentNegotiationManager; import org.springframework.web.bind.WebDataBinder; -import org.springframework.web.bind.annotation.WebAnnotationsRuntimeHintsRegistrar; import org.springframework.web.bind.support.ConfigurableWebBindingInitializer; import org.springframework.web.context.ServletContextAware; import org.springframework.web.cors.CorsConfiguration; @@ -190,7 +188,6 @@ import org.springframework.web.util.pattern.PathPatternParser; * @see EnableWebMvc * @see WebMvcConfigurer */ -@ImportRuntimeHints(WebAnnotationsRuntimeHintsRegistrar.class) public class WebMvcConfigurationSupport implements ApplicationContextAware, ServletContextAware { /**