Skip to content

Commit d725914

Browse files
committed
Merge branch '3.1.x'
Closes gh-37636
2 parents 426e316 + 1e4deed commit d725914

File tree

9 files changed

+69
-26
lines changed

9 files changed

+69
-26
lines changed

spring-boot-project/spring-boot/src/main/java/org/springframework/boot/web/servlet/ServletComponentRegisteringPostProcessor.java

+34-1
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,17 @@
1919
import java.util.ArrayList;
2020
import java.util.Collections;
2121
import java.util.List;
22+
import java.util.Objects;
2223
import java.util.Set;
2324

25+
import org.springframework.aot.generate.GenerationContext;
26+
import org.springframework.aot.hint.MemberCategory;
27+
import org.springframework.aot.hint.TypeReference;
2428
import org.springframework.beans.BeansException;
2529
import org.springframework.beans.factory.annotation.AnnotatedBeanDefinition;
30+
import org.springframework.beans.factory.aot.BeanFactoryInitializationAotContribution;
31+
import org.springframework.beans.factory.aot.BeanFactoryInitializationAotProcessor;
32+
import org.springframework.beans.factory.aot.BeanFactoryInitializationCode;
2633
import org.springframework.beans.factory.config.BeanDefinition;
2734
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
2835
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
@@ -40,7 +47,8 @@
4047
* @see ServletComponentScan
4148
* @see ServletComponentScanRegistrar
4249
*/
43-
class ServletComponentRegisteringPostProcessor implements BeanFactoryPostProcessor, ApplicationContextAware {
50+
class ServletComponentRegisteringPostProcessor
51+
implements BeanFactoryPostProcessor, ApplicationContextAware, BeanFactoryInitializationAotProcessor {
4452

4553
private static final List<ServletComponentHandler> HANDLERS;
4654

@@ -105,4 +113,29 @@ public void setApplicationContext(ApplicationContext applicationContext) throws
105113
this.applicationContext = applicationContext;
106114
}
107115

116+
@Override
117+
public BeanFactoryInitializationAotContribution processAheadOfTime(ConfigurableListableBeanFactory beanFactory) {
118+
return new BeanFactoryInitializationAotContribution() {
119+
120+
@Override
121+
public void applyTo(GenerationContext generationContext,
122+
BeanFactoryInitializationCode beanFactoryInitializationCode) {
123+
for (String beanName : beanFactory.getBeanDefinitionNames()) {
124+
BeanDefinition definition = beanFactory.getBeanDefinition(beanName);
125+
if (Objects.equals(definition.getBeanClassName(),
126+
WebListenerHandler.ServletComponentWebListenerRegistrar.class.getName())) {
127+
String listenerClassName = (String) definition.getConstructorArgumentValues()
128+
.getArgumentValue(0, String.class)
129+
.getValue();
130+
generationContext.getRuntimeHints()
131+
.reflection()
132+
.registerType(TypeReference.of(listenerClassName),
133+
MemberCategory.INVOKE_DECLARED_CONSTRUCTORS);
134+
}
135+
}
136+
}
137+
138+
};
139+
}
140+
108141
}

spring-boot-project/spring-boot/src/main/java/org/springframework/boot/web/servlet/ServletComponentScanRegistrar.java

-11
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,9 @@
2222
import java.util.Set;
2323
import java.util.function.Supplier;
2424

25-
import org.springframework.beans.factory.aot.BeanRegistrationExcludeFilter;
2625
import org.springframework.beans.factory.config.BeanDefinition;
2726
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
2827
import org.springframework.beans.factory.support.GenericBeanDefinition;
29-
import org.springframework.beans.factory.support.RegisteredBean;
3028
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
3129
import org.springframework.core.annotation.AnnotationAttributes;
3230
import org.springframework.core.type.AnnotationMetadata;
@@ -102,13 +100,4 @@ private void addPackageNames(Collection<String> additionalPackageNames) {
102100

103101
}
104102

105-
static class ServletComponentScanBeanRegistrationExcludeFilter implements BeanRegistrationExcludeFilter {
106-
107-
@Override
108-
public boolean isExcludedFromAotProcessing(RegisteredBean registeredBean) {
109-
return BEAN_NAME.equals(registeredBean.getBeanName());
110-
}
111-
112-
}
113-
114103
}

spring-boot-project/spring-boot/src/main/resources/META-INF/spring/aot.factories

-3
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,3 @@ org.springframework.boot.jackson.JsonComponentModule.JsonComponentBeanFactoryIni
2020
org.springframework.beans.factory.aot.BeanRegistrationAotProcessor=\
2121
org.springframework.boot.context.properties.ConfigurationPropertiesBeanRegistrationAotProcessor,\
2222
org.springframework.boot.jackson.JsonMixinModuleEntriesBeanRegistrationAotProcessor
23-
24-
org.springframework.beans.factory.aot.BeanRegistrationExcludeFilter=\
25-
org.springframework.boot.web.servlet.ServletComponentScanRegistrar.ServletComponentScanBeanRegistrationExcludeFilter

spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/servlet/ServletComponentScanIntegrationTests.java

+7-6
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,10 @@
4545
import org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext;
4646
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
4747
import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
48-
import org.springframework.boot.web.servlet.testcomponents.TestMultipartServlet;
48+
import org.springframework.boot.web.servlet.testcomponents.filter.TestFilter;
49+
import org.springframework.boot.web.servlet.testcomponents.listener.TestListener;
50+
import org.springframework.boot.web.servlet.testcomponents.servlet.TestMultipartServlet;
51+
import org.springframework.boot.web.servlet.testcomponents.servlet.TestServlet;
4952
import org.springframework.context.annotation.Bean;
5053
import org.springframework.context.annotation.Configuration;
5154
import org.springframework.web.client.RestTemplate;
@@ -127,11 +130,9 @@ private void writeIndex(File temp) throws IOException {
127130
File metaInf = new File(temp, "META-INF");
128131
metaInf.mkdirs();
129132
Properties index = new Properties();
130-
index.setProperty("org.springframework.boot.web.servlet.testcomponents.TestFilter", WebFilter.class.getName());
131-
index.setProperty("org.springframework.boot.web.servlet.testcomponents.TestListener",
132-
WebListener.class.getName());
133-
index.setProperty("org.springframework.boot.web.servlet.testcomponents.TestServlet",
134-
WebServlet.class.getName());
133+
index.setProperty(TestFilter.class.getName(), WebFilter.class.getName());
134+
index.setProperty(TestListener.class.getName(), WebListener.class.getName());
135+
index.setProperty(TestServlet.class.getName(), WebServlet.class.getName());
135136
try (FileWriter writer = new FileWriter(new File(metaInf, "spring.components"))) {
136137
index.store(writer, null);
137138
}

spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/servlet/ServletComponentScanRegistrarTests.java

+23
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,12 @@
2121
import org.junit.jupiter.api.AfterEach;
2222
import org.junit.jupiter.api.Test;
2323

24+
import org.springframework.aot.hint.MemberCategory;
25+
import org.springframework.aot.hint.predicate.RuntimeHintsPredicates;
2426
import org.springframework.aot.test.generate.TestGenerationContext;
2527
import org.springframework.beans.factory.support.RootBeanDefinition;
28+
import org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext;
29+
import org.springframework.boot.web.servlet.testcomponents.listener.TestListener;
2630
import org.springframework.context.ApplicationContextInitializer;
2731
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
2832
import org.springframework.context.annotation.Configuration;
@@ -141,6 +145,19 @@ void processAheadOfTimeDoesNotRegisterServletComponentRegisteringPostProcessor()
141145
});
142146
}
143147

148+
@Test
149+
void processAheadOfTimeRegistersReflectionHintsForWebListeners() {
150+
AnnotationConfigServletWebServerApplicationContext context = new AnnotationConfigServletWebServerApplicationContext();
151+
context.registerBean(ScanListenerPackage.class);
152+
TestGenerationContext generationContext = new TestGenerationContext(
153+
ClassName.get(getClass().getPackageName(), "TestTarget"));
154+
new ApplicationContextAotGenerator().processAheadOfTime(context, generationContext);
155+
assertThat(RuntimeHintsPredicates.reflection()
156+
.onType(TestListener.class)
157+
.withMemberCategory(MemberCategory.INVOKE_DECLARED_CONSTRUCTORS))
158+
.accepts(generationContext.getRuntimeHints());
159+
}
160+
144161
@SuppressWarnings("unchecked")
145162
private void compile(GenericApplicationContext context, Consumer<GenericApplicationContext> freshContext) {
146163
TestGenerationContext generationContext = new TestGenerationContext(
@@ -192,4 +209,10 @@ static class NoBasePackages {
192209

193210
}
194211

212+
@Configuration(proxyBeanMethods = false)
213+
@ServletComponentScan("org.springframework.boot.web.servlet.testcomponents.listener")
214+
static class ScanListenerPackage {
215+
216+
}
217+
195218
}
+2-2
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
* limitations under the License.
1515
*/
1616

17-
package org.springframework.boot.web.servlet.testcomponents;
17+
package org.springframework.boot.web.servlet.testcomponents.filter;
1818

1919
import java.io.IOException;
2020

@@ -27,7 +27,7 @@
2727
import jakarta.servlet.annotation.WebFilter;
2828

2929
@WebFilter("/*")
30-
class TestFilter implements Filter {
30+
public class TestFilter implements Filter {
3131

3232
@Override
3333
public void init(FilterConfig filterConfig) throws ServletException {
+1-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
* limitations under the License.
1515
*/
1616

17-
package org.springframework.boot.web.servlet.testcomponents;
17+
package org.springframework.boot.web.servlet.testcomponents.listener;
1818

1919
import java.io.IOException;
2020
import java.util.EnumSet;
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
* limitations under the License.
1515
*/
1616

17-
package org.springframework.boot.web.servlet.testcomponents;
17+
package org.springframework.boot.web.servlet.testcomponents.servlet;
1818

1919
import jakarta.servlet.annotation.MultipartConfig;
2020
import jakarta.servlet.annotation.WebServlet;
+1-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
* limitations under the License.
1515
*/
1616

17-
package org.springframework.boot.web.servlet.testcomponents;
17+
package org.springframework.boot.web.servlet.testcomponents.servlet;
1818

1919
import java.io.IOException;
2020

0 commit comments

Comments
 (0)