Skip to content

Commit edfb176

Browse files
committed
* Rework AOT support according latest changes and requirements
* Remove `@Bean` reflection since it is not needed any more * Add `AotDetector.useGeneratedArtifacts()` condition to not register beans one more time at runtime after AOT build phase * Fix deprecation in the WebFlux test from the latest SF
1 parent b7f86f5 commit edfb176

File tree

14 files changed

+77
-70
lines changed

14 files changed

+77
-70
lines changed
Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -35,17 +35,14 @@
3535
import org.springframework.aot.hint.RuntimeHintsRegistrar;
3636
import org.springframework.aot.hint.SerializationHints;
3737
import org.springframework.aot.hint.TypeReference;
38-
import org.springframework.aot.hint.support.RuntimeHintsUtils;
3938
import org.springframework.beans.factory.config.BeanExpressionContext;
4039
import org.springframework.context.SmartLifecycle;
41-
import org.springframework.context.annotation.Bean;
4240
import org.springframework.core.DecoratingProxy;
4341
import org.springframework.integration.context.IntegrationContextUtils;
4442
import org.springframework.integration.core.GenericSelector;
4543
import org.springframework.integration.core.Pausable;
4644
import org.springframework.integration.dsl.IntegrationFlow;
4745
import org.springframework.integration.gateway.MethodArgsHolder;
48-
import org.springframework.integration.gateway.RequestReplyExchanger;
4946
import org.springframework.integration.handler.AbstractReplyProducingMessageHandler;
5047
import org.springframework.integration.handler.DelayHandler;
5148
import org.springframework.integration.handler.GenericHandler;
@@ -58,6 +55,7 @@
5855
import org.springframework.integration.store.MessageMetadata;
5956
import org.springframework.integration.support.MutableMessage;
6057
import org.springframework.integration.support.MutableMessageHeaders;
58+
import org.springframework.integration.support.management.ManageableSmartLifecycle;
6159
import org.springframework.integration.transformer.GenericTransformer;
6260
import org.springframework.messaging.MessageHeaders;
6361
import org.springframework.messaging.support.ErrorMessage;
@@ -70,7 +68,7 @@
7068
*
7169
* @since 6.0
7270
*/
73-
class CoreRuntimeHintsRegistrar implements RuntimeHintsRegistrar {
71+
class CoreRuntimeHints implements RuntimeHintsRegistrar {
7472

7573
@Override
7674
public void registerHints(RuntimeHints hints, ClassLoader classLoader) {
@@ -87,7 +85,7 @@ public void registerHints(RuntimeHints hints, ClassLoader classLoader) {
8785
AbstractReplyProducingMessageHandler.RequestHandler.class,
8886
ExpressionEvaluatingRoutingSlipRouteStrategy.RequestAndReply.class,
8987
Pausable.class,
90-
SmartLifecycle.class)
88+
ManageableSmartLifecycle.class)
9189
.forEach(type ->
9290
reflectionHints.registerType(type,
9391
builder -> builder.withMembers(MemberCategory.INVOKE_PUBLIC_METHODS)));
@@ -139,12 +137,8 @@ public void registerHints(RuntimeHints hints, ClassLoader classLoader) {
139137

140138
ProxyHints proxyHints = hints.proxies();
141139

142-
registerSpringJdkProxy(proxyHints, RequestReplyExchanger.class);
143140
registerSpringJdkProxy(proxyHints, AbstractReplyProducingMessageHandler.RequestHandler.class);
144141
registerSpringJdkProxy(proxyHints, IntegrationFlow.class, SmartLifecycle.class);
145-
146-
// For MessagingAnnotationPostProcessor
147-
RuntimeHintsUtils.registerAnnotation(hints, Bean.class);
148142
}
149143

150144
private static void registerSpringJdkProxy(ProxyHints proxyHints, Class<?>... proxiedInterfaces) {

spring-integration-core/src/main/java/org/springframework/integration/aot/GatewayProxyBeanRegistrationAotProcessor.java

Lines changed: 32 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,21 @@
1616

1717
package org.springframework.integration.aot;
1818

19+
import java.util.function.Predicate;
20+
1921
import org.springframework.aop.SpringProxy;
2022
import org.springframework.aop.framework.Advised;
21-
import org.springframework.beans.factory.BeanFactory;
23+
import org.springframework.aot.generate.GenerationContext;
24+
import org.springframework.beans.factory.FactoryBean;
2225
import org.springframework.beans.factory.aot.BeanRegistrationAotContribution;
2326
import org.springframework.beans.factory.aot.BeanRegistrationAotProcessor;
27+
import org.springframework.beans.factory.aot.BeanRegistrationCode;
28+
import org.springframework.beans.factory.aot.BeanRegistrationCodeFragments;
2429
import org.springframework.beans.factory.support.RegisteredBean;
30+
import org.springframework.beans.factory.support.RootBeanDefinition;
2531
import org.springframework.core.DecoratingProxy;
2632
import org.springframework.integration.gateway.GatewayProxyFactoryBean;
27-
import org.springframework.integration.gateway.RequestReplyExchanger;
33+
import org.springframework.javapoet.CodeBlock;
2834

2935
/**
3036
* {@link BeanRegistrationAotProcessor} for registering proxy interfaces of the {@link GatewayProxyFactoryBean} beans.
@@ -37,21 +43,32 @@ class GatewayProxyBeanRegistrationAotProcessor implements BeanRegistrationAotPro
3743

3844
@Override
3945
public BeanRegistrationAotContribution processAheadOfTime(RegisteredBean registeredBean) {
40-
Class<?> beanType = registeredBean.getBeanClass();
41-
if (GatewayProxyFactoryBean.class.isAssignableFrom(beanType)) {
42-
GatewayProxyFactoryBean proxyFactoryBean =
43-
registeredBean.getBeanFactory()
44-
.getBean(BeanFactory.FACTORY_BEAN_PREFIX + registeredBean.getBeanName(),
45-
GatewayProxyFactoryBean.class);
46-
Class<?> serviceInterface = proxyFactoryBean.getObjectType();
47-
if (!RequestReplyExchanger.class.equals(serviceInterface)) {
48-
return (generationContext, beanRegistrationCode) ->
49-
generationContext.getRuntimeHints().proxies()
50-
.registerJdkProxy(serviceInterface, SpringProxy.class, Advised.class,
51-
DecoratingProxy.class);
52-
}
46+
if (GatewayProxyFactoryBean.class.isAssignableFrom(registeredBean.getBeanClass())) {
47+
return BeanRegistrationAotContribution
48+
.ofBeanRegistrationCodeFragmentsCustomizer(GatewayProxyBeanRegistrationCodeFragments::new);
5349
}
5450
return null;
5551
}
5652

53+
private static class GatewayProxyBeanRegistrationCodeFragments extends BeanRegistrationCodeFragments {
54+
55+
GatewayProxyBeanRegistrationCodeFragments(BeanRegistrationCodeFragments codeFragments) {
56+
super(codeFragments);
57+
}
58+
59+
@Override
60+
public CodeBlock generateSetBeanDefinitionPropertiesCode(GenerationContext generationContext,
61+
BeanRegistrationCode beanRegistrationCode, RootBeanDefinition beanDefinition,
62+
Predicate<String> attributeFilter) {
63+
64+
Class<?> serviceInterface = (Class<?>) beanDefinition.getAttribute(FactoryBean.OBJECT_TYPE_ATTRIBUTE);
65+
generationContext.getRuntimeHints().proxies()
66+
.registerJdkProxy(serviceInterface, SpringProxy.class, Advised.class, DecoratingProxy.class);
67+
68+
return super.generateSetBeanDefinitionPropertiesCode(generationContext, beanRegistrationCode,
69+
beanDefinition, FactoryBean.OBJECT_TYPE_ATTRIBUTE::equals);
70+
}
71+
72+
}
73+
5774
}

spring-integration-core/src/main/java/org/springframework/integration/config/DefaultConfiguringBeanFactoryPostProcessor.java

Lines changed: 23 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import java.util.Set;
2424
import java.util.concurrent.ThreadPoolExecutor.CallerRunsPolicy;
2525

26+
import org.springframework.aot.AotDetector;
2627
import org.springframework.beans.BeansException;
2728
import org.springframework.beans.factory.BeanFactory;
2829
import org.springframework.beans.factory.HierarchicalBeanFactory;
@@ -106,26 +107,28 @@ public class DefaultConfiguringBeanFactoryPostProcessor
106107

107108
@Override
108109
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
109-
this.registry = registry;
110-
this.beanFactory = (ConfigurableListableBeanFactory) registry;
111-
112-
registerBeanFactoryChannelResolver();
113-
registerMessagePublishingErrorHandler();
114-
registerNullChannel();
115-
registerErrorChannel();
116-
registerIntegrationEvaluationContext();
117-
registerTaskScheduler();
118-
registerIdGeneratorConfigurer();
119-
registerIntegrationProperties();
120-
registerBuiltInBeans();
121-
registerRoleController();
122-
registerMessageBuilderFactory();
123-
registerHeaderChannelRegistry();
124-
registerGlobalChannelInterceptorProcessor();
125-
registerDefaultDatatypeChannelMessageConverter();
126-
registerArgumentResolverMessageConverter();
127-
registerMessageHandlerMethodFactory();
128-
registerListMessageHandlerMethodFactory();
110+
if (!AotDetector.useGeneratedArtifacts()) {
111+
this.registry = registry;
112+
this.beanFactory = (ConfigurableListableBeanFactory) registry;
113+
114+
registerBeanFactoryChannelResolver();
115+
registerMessagePublishingErrorHandler();
116+
registerNullChannel();
117+
registerErrorChannel();
118+
registerIntegrationEvaluationContext();
119+
registerTaskScheduler();
120+
registerIdGeneratorConfigurer();
121+
registerIntegrationProperties();
122+
registerBuiltInBeans();
123+
registerRoleController();
124+
registerMessageBuilderFactory();
125+
registerHeaderChannelRegistry();
126+
registerGlobalChannelInterceptorProcessor();
127+
registerDefaultDatatypeChannelMessageConverter();
128+
registerArgumentResolverMessageConverter();
129+
registerMessageHandlerMethodFactory();
130+
registerListMessageHandlerMethodFactory();
131+
}
129132
}
130133

131134
@Override

spring-integration-core/src/main/java/org/springframework/integration/config/IntegrationConfigurationBeanFactoryPostProcessor.java

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2014-2019 the original author or authors.
2+
* Copyright 2014-2022 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -18,6 +18,7 @@
1818

1919
import java.util.List;
2020

21+
import org.springframework.aot.AotDetector;
2122
import org.springframework.beans.BeansException;
2223
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
2324
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
@@ -31,20 +32,23 @@
3132
*
3233
* @author Artem Bilan
3334
* @author Gary Russell
35+
*
3436
* @since 4.0
3537
*/
3638
public class IntegrationConfigurationBeanFactoryPostProcessor implements BeanDefinitionRegistryPostProcessor {
3739

3840
@Override
3941
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
40-
ConfigurableListableBeanFactory beanFactory = (ConfigurableListableBeanFactory) registry;
42+
if (!AotDetector.useGeneratedArtifacts()) {
43+
ConfigurableListableBeanFactory beanFactory = (ConfigurableListableBeanFactory) registry;
4144

42-
List<IntegrationConfigurationInitializer> initializers =
43-
SpringFactoriesLoader.loadFactories(IntegrationConfigurationInitializer.class,
44-
beanFactory.getBeanClassLoader());
45+
List<IntegrationConfigurationInitializer> initializers =
46+
SpringFactoriesLoader.loadFactories(IntegrationConfigurationInitializer.class,
47+
beanFactory.getBeanClassLoader());
4548

46-
for (IntegrationConfigurationInitializer initializer : initializers) {
47-
initializer.initialize(beanFactory);
49+
for (IntegrationConfigurationInitializer initializer : initializers) {
50+
initializer.initialize(beanFactory);
51+
}
4852
}
4953
}
5054

spring-integration-core/src/main/java/org/springframework/integration/core/Pausable.java

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616

1717
package org.springframework.integration.core;
1818

19-
import org.springframework.aot.hint.annotation.Reflective;
2019
import org.springframework.integration.support.management.ManageableLifecycle;
2120
import org.springframework.jmx.export.annotation.ManagedAttribute;
2221
import org.springframework.jmx.export.annotation.ManagedOperation;
@@ -27,8 +26,6 @@
2726
* messages.
2827
*
2928
* @author Gary Russell
30-
* @author Artem Bilan
31-
*
3229
* @since 5.0.3
3330
*
3431
*/
@@ -38,14 +35,12 @@ public interface Pausable extends ManageableLifecycle {
3835
* Pause the endpoint.
3936
*/
4037
@ManagedOperation(description = "Pause the component")
41-
@Reflective
4238
void pause();
4339

4440
/**
4541
* Resume the endpoint if paused.
4642
*/
4743
@ManagedOperation(description = "Resume the component")
48-
@Reflective
4944
void resume();
5045

5146
/**
@@ -54,7 +49,6 @@ public interface Pausable extends ManageableLifecycle {
5449
* @since 5.4
5550
*/
5651
@ManagedAttribute(description = "Is the component paused?")
57-
@Reflective
5852
default boolean isPaused() {
5953
throw new UnsupportedOperationException("This component does not implement this method");
6054
}

spring-integration-core/src/main/java/org/springframework/integration/support/management/ManageableLifecycle.java

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616

1717
package org.springframework.integration.support.management;
1818

19-
import org.springframework.aot.hint.annotation.Reflective;
2019
import org.springframework.context.Lifecycle;
2120
import org.springframework.jmx.export.annotation.ManagedAttribute;
2221
import org.springframework.jmx.export.annotation.ManagedOperation;
@@ -31,17 +30,14 @@
3130
public interface ManageableLifecycle extends Lifecycle {
3231

3332
@ManagedOperation(description = "Start the component")
34-
@Reflective
3533
@Override
3634
void start();
3735

3836
@ManagedOperation(description = "Stop the component")
39-
@Reflective
4037
@Override
4138
void stop();
4239

4340
@ManagedAttribute(description = "Is the component running?")
44-
@Reflective
4541
@Override
4642
boolean isRunning();
4743

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
org.springframework.aot.hint.RuntimeHintsRegistrar=org.springframework.integration.aot.CoreRuntimeHintsRegistrar
1+
org.springframework.aot.hint.RuntimeHintsRegistrar=org.springframework.integration.aot.CoreRuntimeHints
22
org.springframework.beans.factory.aot.BeanRegistrationAotProcessor=org.springframework.integration.aot.GatewayProxyBeanRegistrationAotProcessor
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
*
3131
* @since 6.0
3232
*/
33-
class FileRuntimeHintsRegistrar implements RuntimeHintsRegistrar {
33+
class FileRuntimeHints implements RuntimeHintsRegistrar {
3434

3535
@Override
3636
public void registerHints(RuntimeHints hints, ClassLoader classLoader) {
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
org.springframework.aot.hint.RuntimeHintsRegistrar=org.springframework.integration.file.aot.FileRuntimeHintsRegistrar
1+
org.springframework.aot.hint.RuntimeHintsRegistrar=org.springframework.integration.file.aot.FileRuntimeHints
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
*
3232
* @since 6.0
3333
*/
34-
class HttpRuntimeHintsRegistrar implements RuntimeHintsRegistrar {
34+
class HttpRuntimeHints implements RuntimeHintsRegistrar {
3535

3636
@Override
3737
public void registerHints(RuntimeHints hints, ClassLoader classLoader) {
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
org.springframework.aot.hint.RuntimeHintsRegistrar=org.springframework.integration.http.aot.HttpRuntimeHintsRegistrar
1+
org.springframework.aot.hint.RuntimeHintsRegistrar=org.springframework.integration.http.aot.HttpRuntimeHints
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
*
2727
* @since 6.0
2828
*/
29-
class JdbcRuntimeHintsRegistrar implements RuntimeHintsRegistrar {
29+
class JdbcRuntimeHints implements RuntimeHintsRegistrar {
3030

3131
@Override
3232
public void registerHints(RuntimeHints hints, ClassLoader classLoader) {
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
org.springframework.aot.hint.RuntimeHintsRegistrar=org.springframework.integration.jdbc.aot.JdbcRuntimeHintsRegistrar
1+
org.springframework.aot.hint.RuntimeHintsRegistrar=org.springframework.integration.jdbc.aot.JdbcRuntimeHints

spring-integration-webflux/src/test/java/org/springframework/integration/webflux/outbound/WebFluxRequestExecutingMessageHandlerTests.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -275,12 +275,11 @@ void testClientHttpResponseAsReply() {
275275

276276
StepVerifier.create(
277277
response.getBody()
278-
.map(dataBuffer -> new String(dataBuffer.asByteBuffer().array())))
278+
.map(dataBuffer -> new String(dataBuffer.toByteBuffer().array())))
279279
.expectNext("foo", "bar", "baz")
280280
.verifyComplete();
281281
}
282282

283-
284283
@Test
285284
void testClientHttpResponseErrorAsReply() {
286285
ClientHttpConnector httpConnector = new HttpHandlerConnector((request, response) -> {

0 commit comments

Comments
 (0)