Skip to content

Commit c504ac5

Browse files
committed
Merge branch '6.0.x'
2 parents 73c0634 + 1ac0549 commit c504ac5

File tree

4 files changed

+41
-29
lines changed

4 files changed

+41
-29
lines changed

spring-beans/src/main/java/org/springframework/beans/factory/aot/BeanDefinitionMethodGenerator.java

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -90,8 +90,7 @@ class BeanDefinitionMethodGenerator {
9090

9191

9292
/**
93-
* Generate the method that returns the {@link BeanDefinition} to be
94-
* registered.
93+
* Generate the method that returns the {@link BeanDefinition} to be registered.
9594
* @param generationContext the generation context
9695
* @param beanRegistrationsCode the bean registrations code
9796
* @return a reference to the generated method.
@@ -100,8 +99,7 @@ MethodReference generateBeanDefinitionMethod(GenerationContext generationContext
10099
BeanRegistrationsCode beanRegistrationsCode) {
101100

102101
registerRuntimeHintsIfNecessary(generationContext.getRuntimeHints());
103-
BeanRegistrationCodeFragments codeFragments = getCodeFragments(generationContext,
104-
beanRegistrationsCode);
102+
BeanRegistrationCodeFragments codeFragments = getCodeFragments(generationContext, beanRegistrationsCode);
105103
ClassName target = codeFragments.getTarget(this.registeredBean, this.constructorOrFactoryMethod);
106104
if (isWritablePackageName(target)) {
107105
GeneratedClass generatedClass = lookupGeneratedClass(generationContext, target);
@@ -187,7 +185,7 @@ private GeneratedMethod generateBeanDefinitionMethod(GenerationContext generatio
187185

188186
return generatedMethods.add("getBeanDefinition", method -> {
189187
method.addJavadoc("Get the $L definition for '$L'.",
190-
(!this.registeredBean.isInnerBean()) ? "bean" : "inner-bean",
188+
(this.registeredBean.isInnerBean() ? "inner-bean" : "bean"),
191189
getName());
192190
method.addModifiers(modifier, Modifier.STATIC);
193191
method.returns(BeanDefinition.class);
@@ -214,9 +212,9 @@ private String getName() {
214212

215213
private String getSimpleBeanName(String beanName) {
216214
int lastDot = beanName.lastIndexOf('.');
217-
beanName = (lastDot != -1) ? beanName.substring(lastDot + 1) : beanName;
215+
beanName = (lastDot != -1 ? beanName.substring(lastDot + 1) : beanName);
218216
int lastDollar = beanName.lastIndexOf('$');
219-
beanName = (lastDollar != -1) ? beanName.substring(lastDollar + 1) : beanName;
217+
beanName = (lastDollar != -1 ? beanName.substring(lastDollar + 1) : beanName);
220218
return StringUtils.uncapitalize(beanName);
221219
}
222220

spring-beans/src/main/java/org/springframework/beans/factory/support/ConstructorResolver.java

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -975,19 +975,19 @@ public Executable resolveConstructorOrFactoryMethod(String beanName, RootBeanDef
975975
Assert.state(isCompatible, () -> String.format(
976976
"Incompatible target type '%s' for factory bean '%s'",
977977
resolvableType.toClass().getName(), factoryBeanClass.getName()));
978-
Executable executable = resolveConstructor(beanName, mbd,
978+
Constructor<?> constructor = resolveConstructor(beanName, mbd,
979979
() -> ResolvableType.forClass(factoryBeanClass), valueTypes);
980-
if (executable != null) {
981-
return executable;
980+
if (constructor != null) {
981+
return constructor;
982982
}
983983
throw new IllegalStateException("No suitable FactoryBean constructor found for " +
984984
mbd + " and argument types " + valueTypes);
985985

986986
}
987987

988-
Executable resolvedConstructor = resolveConstructor(beanName, mbd, beanType, valueTypes);
989-
if (resolvedConstructor != null) {
990-
return resolvedConstructor;
988+
Constructor<?> constructor = resolveConstructor(beanName, mbd, beanType, valueTypes);
989+
if (constructor != null) {
990+
return constructor;
991991
}
992992

993993
throw new IllegalStateException("No constructor or factory method candidate found for " +
@@ -1030,7 +1030,7 @@ private ResolvableType determineParameterValueType(RootBeanDefinition mbd, Value
10301030
}
10311031

10321032
@Nullable
1033-
private Executable resolveConstructor(String beanName, RootBeanDefinition mbd,
1033+
private Constructor<?> resolveConstructor(String beanName, RootBeanDefinition mbd,
10341034
Supplier<ResolvableType> beanType, List<ResolvableType> valueTypes) {
10351035

10361036
Class<?> type = ClassUtils.getUserClass(beanType.get().toClass());
@@ -1054,22 +1054,22 @@ private Executable resolveConstructor(String beanName, RootBeanDefinition mbd,
10541054
}
10551055
return types;
10561056
};
1057-
List<? extends Executable> matches = Arrays.stream(ctors)
1057+
List<Constructor<?>> matches = Arrays.stream(ctors)
10581058
.filter(executable -> match(parameterTypesFactory.apply(executable),
10591059
valueTypes, FallbackMode.NONE))
10601060
.toList();
10611061
if (matches.size() == 1) {
10621062
return matches.get(0);
10631063
}
1064-
List<? extends Executable> assignableElementFallbackMatches = Arrays
1064+
List<Constructor<?>> assignableElementFallbackMatches = Arrays
10651065
.stream(ctors)
10661066
.filter(executable -> match(parameterTypesFactory.apply(executable),
10671067
valueTypes, FallbackMode.ASSIGNABLE_ELEMENT))
10681068
.toList();
10691069
if (assignableElementFallbackMatches.size() == 1) {
10701070
return assignableElementFallbackMatches.get(0);
10711071
}
1072-
List<? extends Executable> typeConversionFallbackMatches = Arrays
1072+
List<Constructor<?>> typeConversionFallbackMatches = Arrays
10731073
.stream(ctors)
10741074
.filter(executable -> match(parameterTypesFactory.apply(executable),
10751075
valueTypes, FallbackMode.TYPE_CONVERSION))
@@ -1121,7 +1121,7 @@ else if (candidates.size() > 1) {
11211121
}
11221122
return types;
11231123
};
1124-
result = (Method) resolveFactoryMethod(candidates, parameterTypesFactory, valueTypes);
1124+
result = resolveFactoryMethod(candidates, parameterTypesFactory, valueTypes);
11251125
}
11261126

11271127
if (result == null) {
@@ -1138,24 +1138,24 @@ else if (candidates.size() > 1) {
11381138
}
11391139

11401140
@Nullable
1141-
private Executable resolveFactoryMethod(List<Method> executables,
1141+
private Method resolveFactoryMethod(List<Method> executables,
11421142
Function<Method, List<ResolvableType>> parameterTypesFactory,
11431143
List<ResolvableType> valueTypes) {
11441144

1145-
List<? extends Executable> matches = executables.stream()
1145+
List<Method> matches = executables.stream()
11461146
.filter(executable -> match(parameterTypesFactory.apply(executable), valueTypes, FallbackMode.NONE))
11471147
.toList();
11481148
if (matches.size() == 1) {
11491149
return matches.get(0);
11501150
}
1151-
List<? extends Executable> assignableElementFallbackMatches = executables.stream()
1151+
List<Method> assignableElementFallbackMatches = executables.stream()
11521152
.filter(executable -> match(parameterTypesFactory.apply(executable),
11531153
valueTypes, FallbackMode.ASSIGNABLE_ELEMENT))
11541154
.toList();
11551155
if (assignableElementFallbackMatches.size() == 1) {
11561156
return assignableElementFallbackMatches.get(0);
11571157
}
1158-
List<? extends Executable> typeConversionFallbackMatches = executables.stream()
1158+
List<Method> typeConversionFallbackMatches = executables.stream()
11591159
.filter(executable -> match(parameterTypesFactory.apply(executable),
11601160
valueTypes, FallbackMode.TYPE_CONVERSION))
11611161
.toList();

spring-context/src/test/java/org/springframework/context/event/AnnotationDrivenEventListenerTests.java

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -517,7 +517,6 @@ void replyWithPayload() {
517517
ReplyEventListener replyEventListener = this.context.getBean(ReplyEventListener.class);
518518
TestEventListener listener = this.context.getBean(TestEventListener.class);
519519

520-
521520
this.eventCollector.assertNoEventReceived(listener);
522521
this.eventCollector.assertNoEventReceived(replyEventListener);
523522
this.context.publishEvent(event);
@@ -634,6 +633,17 @@ void orderedListeners() {
634633
assertThat(listener.order).contains("first", "second", "third");
635634
}
636635

636+
@Test
637+
void publicSubclassWithInheritedEventListener() {
638+
load(PublicSubclassWithInheritedEventListener.class);
639+
TestEventListener listener = this.context.getBean(PublicSubclassWithInheritedEventListener.class);
640+
641+
this.eventCollector.assertNoEventReceived(listener);
642+
this.context.publishEvent("test");
643+
this.eventCollector.assertEvent(listener, "test");
644+
this.eventCollector.assertTotalEventsCount(1);
645+
}
646+
637647
@Test @Disabled // SPR-15122
638648
void listenersReceiveEarlyEvents() {
639649
load(EventOnPostConstruct.class, OrderedTestListener.class);
@@ -646,7 +656,7 @@ void listenersReceiveEarlyEvents() {
646656
void missingListenerBeanIgnored() {
647657
load(MissingEventListener.class);
648658
context.getBean(UseMissingEventListener.class);
649-
context.getBean(ApplicationEventMulticaster.class).multicastEvent(new TestEvent(this));
659+
context.publishEvent(new TestEvent(this));
650660
}
651661

652662

@@ -753,7 +763,6 @@ static class ContextEventListener extends AbstractTestEventListener {
753763
public void handleContextEvent(ApplicationContextEvent event) {
754764
collectEvent(event);
755765
}
756-
757766
}
758767

759768

@@ -979,7 +988,6 @@ public void handleString(GenericEventPojo<String> value) {
979988
}
980989

981990

982-
983991
@EventListener
984992
@Retention(RetentionPolicy.RUNTIME)
985993
public @interface ConditionalEvent {
@@ -1031,7 +1039,7 @@ public void handleRatio(Double ratio) {
10311039
}
10321040

10331041

1034-
@Configuration
1042+
@Component
10351043
static class OrderedTestListener extends TestEventListener {
10361044

10371045
public final List<String> order = new ArrayList<>();
@@ -1055,6 +1063,11 @@ public void handleSecond(String payload) {
10551063
}
10561064

10571065

1066+
@Component
1067+
public static class PublicSubclassWithInheritedEventListener extends TestEventListener {
1068+
}
1069+
1070+
10581071
static class EventOnPostConstruct {
10591072

10601073
@Autowired

spring-core/src/main/java/org/springframework/core/MethodIntrospector.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2018 the original author or authors.
2+
* Copyright 2002-2023 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.
@@ -74,7 +74,8 @@ public static <T> Map<Method, T> selectMethods(Class<?> targetType, final Metada
7474
T result = metadataLookup.inspect(specificMethod);
7575
if (result != null) {
7676
Method bridgedMethod = BridgeMethodResolver.findBridgedMethod(specificMethod);
77-
if (bridgedMethod == specificMethod || metadataLookup.inspect(bridgedMethod) == null) {
77+
if (bridgedMethod == specificMethod || bridgedMethod == method ||
78+
metadataLookup.inspect(bridgedMethod) == null) {
7879
methodMap.put(specificMethod, result);
7980
}
8081
}

0 commit comments

Comments
 (0)