Skip to content

Commit 6dcba4d

Browse files
committed
Avoid double proxying for @resource @lazy fallback autowiring
Includes refactored @resource resolver for AOT with lazy resolution support. Closes gh-31447 See gh-29614
1 parent 6bb9775 commit 6dcba4d

File tree

11 files changed

+410
-457
lines changed

11 files changed

+410
-457
lines changed

spring-beans/src/main/java/org/springframework/beans/factory/config/DependencyDescriptor.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2021 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.
@@ -375,6 +375,16 @@ public Class<?> getDependencyType() {
375375
}
376376
}
377377

378+
/**
379+
* Determine whether this dependency supports lazy resolution,
380+
* e.g. through extra proxying. The default is {@code true}.
381+
* @since 6.1.2
382+
* @see org.springframework.beans.factory.support.AutowireCandidateResolver#getLazyResolutionProxyIfNecessary
383+
*/
384+
public boolean supportsLazyResolution() {
385+
return true;
386+
}
387+
378388

379389
@Override
380390
public boolean equals(@Nullable Object other) {

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1343,14 +1343,14 @@ else if (ObjectFactory.class == descriptor.getDependencyType() ||
13431343
else if (javaxInjectProviderClass == descriptor.getDependencyType()) {
13441344
return new Jsr330Factory().createDependencyProvider(descriptor, requestingBeanName);
13451345
}
1346-
else {
1346+
else if (descriptor.supportsLazyResolution()) {
13471347
Object result = getAutowireCandidateResolver().getLazyResolutionProxyIfNecessary(
13481348
descriptor, requestingBeanName);
1349-
if (result == null) {
1350-
result = doResolveDependency(descriptor, requestingBeanName, autowiredBeanNames, typeConverter);
1349+
if (result != null) {
1350+
return result;
13511351
}
1352-
return result;
13531352
}
1353+
return doResolveDependency(descriptor, requestingBeanName, autowiredBeanNames, typeConverter);
13541354
}
13551355

13561356
@Nullable

spring-context/src/main/java/org/springframework/context/annotation/CommonAnnotationBeanPostProcessor.java

Lines changed: 28 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -62,10 +62,7 @@
6262
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
6363
import org.springframework.beans.factory.support.RegisteredBean;
6464
import org.springframework.beans.factory.support.RootBeanDefinition;
65-
import org.springframework.context.aot.ResourceFieldValueResolver;
66-
import org.springframework.context.aot.ResourceMethodArgumentResolver;
6765
import org.springframework.core.BridgeMethodResolver;
68-
import org.springframework.core.MethodParameter;
6966
import org.springframework.core.Ordered;
7067
import org.springframework.core.annotation.AnnotationUtils;
7168
import org.springframework.javapoet.ClassName;
@@ -501,16 +498,9 @@ public Class<?> getTargetClass() {
501498
return element.lookupType;
502499
}
503500
@Override
504-
public boolean isStatic() {
505-
return false;
506-
}
507-
@Override
508501
public Object getTarget() {
509502
return getResource(element, requestingBeanName);
510503
}
511-
@Override
512-
public void releaseTarget(Object target) {
513-
}
514504
};
515505

516506
ProxyFactory pf = new ProxyFactory();
@@ -655,12 +645,23 @@ public final Class<?> getLookupType() {
655645
*/
656646
public final DependencyDescriptor getDependencyDescriptor() {
657647
if (this.isField) {
658-
return new LookupDependencyDescriptor((Field) this.member, this.lookupType);
648+
return new ResourceElementResolver.LookupDependencyDescriptor(
649+
(Field) this.member, this.lookupType, isLazyLookup());
659650
}
660651
else {
661-
return new LookupDependencyDescriptor((Method) this.member, this.lookupType);
652+
return new ResourceElementResolver.LookupDependencyDescriptor(
653+
(Method) this.member, this.lookupType, isLazyLookup());
662654
}
663655
}
656+
657+
/**
658+
* Determine whether this dependency is marked for lazy lookup.
659+
* The default is {@code false}.
660+
* @since 6.1.2
661+
*/
662+
boolean isLazyLookup() {
663+
return false;
664+
}
664665
}
665666

666667

@@ -707,6 +708,11 @@ protected Object getResourceToInject(Object target, @Nullable String requestingB
707708
return (this.lazyLookup ? buildLazyResourceProxy(this, requestingBeanName) :
708709
getResource(this, requestingBeanName));
709710
}
711+
712+
@Override
713+
boolean isLazyLookup() {
714+
return this.lazyLookup;
715+
}
710716
}
711717

712718

@@ -753,6 +759,11 @@ protected Object getResourceToInject(Object target, @Nullable String requestingB
753759
return (this.lazyLookup ? buildLazyResourceProxy(this, requestingBeanName) :
754760
getResource(this, requestingBeanName));
755761
}
762+
763+
@Override
764+
boolean isLazyLookup() {
765+
return this.lazyLookup;
766+
}
756767
}
757768

758769

@@ -812,30 +823,6 @@ else if (this.isDefaultName && !StringUtils.hasLength(this.mappedName)) {
812823
}
813824

814825

815-
/**
816-
* Extension of the DependencyDescriptor class,
817-
* overriding the dependency type with the specified resource type.
818-
*/
819-
private static class LookupDependencyDescriptor extends DependencyDescriptor {
820-
821-
private final Class<?> lookupType;
822-
823-
public LookupDependencyDescriptor(Field field, Class<?> lookupType) {
824-
super(field, true);
825-
this.lookupType = lookupType;
826-
}
827-
828-
public LookupDependencyDescriptor(Method method, Class<?> lookupType) {
829-
super(new MethodParameter(method, 0), true);
830-
this.lookupType = lookupType;
831-
}
832-
833-
@Override
834-
public Class<?> getDependencyType() {
835-
return this.lookupType;
836-
}
837-
}
838-
839826
/**
840827
* {@link BeanRegistrationAotContribution} to inject resources on fields and methods.
841828
*/
@@ -924,11 +911,11 @@ private CodeBlock generateMethodStatementForField(ClassName targetClassName,
924911

925912
private CodeBlock generateFieldResolverCode(Field field, LookupElement lookupElement) {
926913
if (lookupElement.isDefaultName) {
927-
return CodeBlock.of("$T.$L($S)", ResourceFieldValueResolver.class,
914+
return CodeBlock.of("$T.$L($S)", ResourceElementResolver.class,
928915
"forField", field.getName());
929916
}
930917
else {
931-
return CodeBlock.of("$T.$L($S, $S)", ResourceFieldValueResolver.class,
918+
return CodeBlock.of("$T.$L($S, $S)", ResourceElementResolver.class,
932919
"forField", field.getName(), lookupElement.getName());
933920
}
934921
}
@@ -940,7 +927,7 @@ private CodeBlock generateMethodStatementForMethod(ClassName targetClassName,
940927
AccessControl accessControl = AccessControl.forMember(method);
941928
if (!accessControl.isAccessibleFrom(targetClassName)) {
942929
hints.reflection().registerMethod(method, ExecutableMode.INVOKE);
943-
return CodeBlock.of("$L.resolveAndInvoke($L, $L)", resolver,
930+
return CodeBlock.of("$L.resolveAndSet($L, $L)", resolver,
944931
REGISTERED_BEAN_PARAMETER, INSTANCE_PARAMETER);
945932
}
946933
hints.reflection().registerMethod(method, ExecutableMode.INTROSPECT);
@@ -951,11 +938,11 @@ private CodeBlock generateMethodStatementForMethod(ClassName targetClassName,
951938

952939
private CodeBlock generateMethodResolverCode(Method method, LookupElement lookupElement) {
953940
if (lookupElement.isDefaultName) {
954-
return CodeBlock.of("$T.$L($S, $T.class)", ResourceMethodArgumentResolver.class,
941+
return CodeBlock.of("$T.$L($S, $T.class)", ResourceElementResolver.class,
955942
"forMethod", method.getName(), lookupElement.getLookupType());
956943
}
957944
else {
958-
return CodeBlock.of("$T.$L($S, $T.class, $S)", ResourceMethodArgumentResolver.class,
945+
return CodeBlock.of("$T.$L($S, $T.class, $S)", ResourceElementResolver.class,
959946
"forMethod", method.getName(), lookupElement.getLookupType(), lookupElement.getName());
960947
}
961948
}

0 commit comments

Comments
 (0)