Polishing
This commit is contained in:
parent
b31a15851e
commit
38c9e7f629
|
@ -46,24 +46,21 @@ import org.springframework.lang.Nullable;
|
||||||
* @author Phillip Webb
|
* @author Phillip Webb
|
||||||
* @since 6.0
|
* @since 6.0
|
||||||
*/
|
*/
|
||||||
class ScopedProxyBeanRegistrationAotProcessor
|
class ScopedProxyBeanRegistrationAotProcessor implements BeanRegistrationAotProcessor {
|
||||||
implements BeanRegistrationAotProcessor {
|
|
||||||
|
|
||||||
private static final Log logger = LogFactory
|
private static final Log logger = LogFactory.getLog(ScopedProxyBeanRegistrationAotProcessor.class);
|
||||||
.getLog(ScopedProxyBeanRegistrationAotProcessor.class);
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public BeanRegistrationAotContribution processAheadOfTime(RegisteredBean registeredBean) {
|
public BeanRegistrationAotContribution processAheadOfTime(RegisteredBean registeredBean) {
|
||||||
Class<?> beanType = registeredBean.getBeanType().toClass();
|
Class<?> beanType = registeredBean.getBeanType().toClass();
|
||||||
if (beanType.equals(ScopedProxyFactoryBean.class)) {
|
if (beanType.equals(ScopedProxyFactoryBean.class)) {
|
||||||
String targetBeanName = getTargetBeanName(
|
String targetBeanName = getTargetBeanName(registeredBean.getMergedBeanDefinition());
|
||||||
registeredBean.getMergedBeanDefinition());
|
BeanDefinition targetBeanDefinition =
|
||||||
BeanDefinition targetBeanDefinition = getTargetBeanDefinition(
|
getTargetBeanDefinition(registeredBean.getBeanFactory(), targetBeanName);
|
||||||
registeredBean.getBeanFactory(), targetBeanName);
|
|
||||||
if (targetBeanDefinition == null) {
|
if (targetBeanDefinition == null) {
|
||||||
logger.warn("Could not handle " + ScopedProxyFactoryBean.class.getSimpleName()
|
logger.warn("Could not handle " + ScopedProxyFactoryBean.class.getSimpleName() +
|
||||||
+ ": no target bean definition found with name " + targetBeanName);
|
": no target bean definition found with name " + targetBeanName);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
return BeanRegistrationAotContribution.ofBeanRegistrationCodeFragmentsCustomizer(codeFragments ->
|
return BeanRegistrationAotContribution.ofBeanRegistrationCodeFragmentsCustomizer(codeFragments ->
|
||||||
|
@ -76,7 +73,7 @@ class ScopedProxyBeanRegistrationAotProcessor
|
||||||
@Nullable
|
@Nullable
|
||||||
private String getTargetBeanName(BeanDefinition beanDefinition) {
|
private String getTargetBeanName(BeanDefinition beanDefinition) {
|
||||||
Object value = beanDefinition.getPropertyValues().get("targetBeanName");
|
Object value = beanDefinition.getPropertyValues().get("targetBeanName");
|
||||||
return (value instanceof String) ? (String) value : null;
|
return (value instanceof String ? (String) value : null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
|
@ -90,23 +87,18 @@ class ScopedProxyBeanRegistrationAotProcessor
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private static class ScopedProxyBeanRegistrationCodeFragments
|
private static class ScopedProxyBeanRegistrationCodeFragments extends BeanRegistrationCodeFragments {
|
||||||
extends BeanRegistrationCodeFragments {
|
|
||||||
|
|
||||||
private static final String REGISTERED_BEAN_PARAMETER_NAME = "registeredBean";
|
private static final String REGISTERED_BEAN_PARAMETER_NAME = "registeredBean";
|
||||||
|
|
||||||
|
|
||||||
private final RegisteredBean registeredBean;
|
private final RegisteredBean registeredBean;
|
||||||
|
|
||||||
private final String targetBeanName;
|
private final String targetBeanName;
|
||||||
|
|
||||||
private final BeanDefinition targetBeanDefinition;
|
private final BeanDefinition targetBeanDefinition;
|
||||||
|
|
||||||
|
ScopedProxyBeanRegistrationCodeFragments(BeanRegistrationCodeFragments codeGenerator,
|
||||||
ScopedProxyBeanRegistrationCodeFragments(
|
RegisteredBean registeredBean, String targetBeanName, BeanDefinition targetBeanDefinition) {
|
||||||
BeanRegistrationCodeFragments codeGenerator,
|
|
||||||
RegisteredBean registeredBean, String targetBeanName,
|
|
||||||
BeanDefinition targetBeanDefinition) {
|
|
||||||
|
|
||||||
super(codeGenerator);
|
super(codeGenerator);
|
||||||
this.registeredBean = registeredBean;
|
this.registeredBean = registeredBean;
|
||||||
|
@ -114,17 +106,14 @@ class ScopedProxyBeanRegistrationAotProcessor
|
||||||
this.targetBeanDefinition = targetBeanDefinition;
|
this.targetBeanDefinition = targetBeanDefinition;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Class<?> getTarget(RegisteredBean registeredBean,
|
public Class<?> getTarget(RegisteredBean registeredBean, Executable constructorOrFactoryMethod) {
|
||||||
Executable constructorOrFactoryMethod) {
|
|
||||||
return this.targetBeanDefinition.getResolvableType().toClass();
|
return this.targetBeanDefinition.getResolvableType().toClass();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public CodeBlock generateNewBeanDefinitionCode(
|
public CodeBlock generateNewBeanDefinitionCode(GenerationContext generationContext,
|
||||||
GenerationContext generationContext, ResolvableType beanType,
|
ResolvableType beanType, BeanRegistrationCode beanRegistrationCode) {
|
||||||
BeanRegistrationCode beanRegistrationCode) {
|
|
||||||
|
|
||||||
return super.generateNewBeanDefinitionCode(generationContext,
|
return super.generateNewBeanDefinitionCode(generationContext,
|
||||||
this.targetBeanDefinition.getResolvableType(), beanRegistrationCode);
|
this.targetBeanDefinition.getResolvableType(), beanRegistrationCode);
|
||||||
|
|
|
@ -180,8 +180,8 @@ public class InitDestroyAnnotationBeanPostProcessor implements DestructionAwareB
|
||||||
|
|
||||||
private String[] safeMerge(@Nullable String[] existingNames, Collection<LifecycleElement> detectedElements) {
|
private String[] safeMerge(@Nullable String[] existingNames, Collection<LifecycleElement> detectedElements) {
|
||||||
Stream<String> detectedNames = detectedElements.stream().map(LifecycleElement::getIdentifier);
|
Stream<String> detectedNames = detectedElements.stream().map(LifecycleElement::getIdentifier);
|
||||||
Stream<String> mergedNames = (existingNames != null
|
Stream<String> mergedNames = (existingNames != null ?
|
||||||
? Stream.concat(Stream.of(existingNames), detectedNames) : detectedNames);
|
Stream.concat(Stream.of(existingNames), detectedNames) : detectedNames);
|
||||||
return mergedNames.distinct().toArray(String[]::new);
|
return mergedNames.distinct().toArray(String[]::new);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -55,7 +55,6 @@ public interface BeanFactoryInitializationAotProcessor {
|
||||||
* @return a {@link BeanFactoryInitializationAotContribution} or {@code null}
|
* @return a {@link BeanFactoryInitializationAotContribution} or {@code null}
|
||||||
*/
|
*/
|
||||||
@Nullable
|
@Nullable
|
||||||
BeanFactoryInitializationAotContribution processAheadOfTime(
|
BeanFactoryInitializationAotContribution processAheadOfTime(ConfigurableListableBeanFactory beanFactory);
|
||||||
ConfigurableListableBeanFactory beanFactory);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -103,9 +103,8 @@ public abstract class BeanRegistrationCodeFragments {
|
||||||
* @return the generated code
|
* @return the generated code
|
||||||
*/
|
*/
|
||||||
public CodeBlock generateSetBeanDefinitionPropertiesCode(
|
public CodeBlock generateSetBeanDefinitionPropertiesCode(
|
||||||
GenerationContext generationContext,
|
GenerationContext generationContext, BeanRegistrationCode beanRegistrationCode,
|
||||||
BeanRegistrationCode beanRegistrationCode, RootBeanDefinition beanDefinition,
|
RootBeanDefinition beanDefinition, Predicate<String> attributeFilter) {
|
||||||
Predicate<String> attributeFilter) {
|
|
||||||
|
|
||||||
return this.codeFragments.generateSetBeanDefinitionPropertiesCode(
|
return this.codeFragments.generateSetBeanDefinitionPropertiesCode(
|
||||||
generationContext, beanRegistrationCode, beanDefinition, attributeFilter);
|
generationContext, beanRegistrationCode, beanDefinition, attributeFilter);
|
||||||
|
@ -122,9 +121,8 @@ public abstract class BeanRegistrationCodeFragments {
|
||||||
* @see #generateInstanceSupplierCode
|
* @see #generateInstanceSupplierCode
|
||||||
*/
|
*/
|
||||||
public CodeBlock generateSetBeanInstanceSupplierCode(
|
public CodeBlock generateSetBeanInstanceSupplierCode(
|
||||||
GenerationContext generationContext,
|
GenerationContext generationContext, BeanRegistrationCode beanRegistrationCode,
|
||||||
BeanRegistrationCode beanRegistrationCode, CodeBlock instanceSupplierCode,
|
CodeBlock instanceSupplierCode, List<MethodReference> postProcessors) {
|
||||||
List<MethodReference> postProcessors) {
|
|
||||||
|
|
||||||
return this.codeFragments.generateSetBeanInstanceSupplierCode(generationContext,
|
return this.codeFragments.generateSetBeanInstanceSupplierCode(generationContext,
|
||||||
beanRegistrationCode, instanceSupplierCode, postProcessors);
|
beanRegistrationCode, instanceSupplierCode, postProcessors);
|
||||||
|
@ -140,13 +138,12 @@ public abstract class BeanRegistrationCodeFragments {
|
||||||
* than always needing an {@link InstanceSupplier}
|
* than always needing an {@link InstanceSupplier}
|
||||||
* @return the generated code
|
* @return the generated code
|
||||||
*/
|
*/
|
||||||
public CodeBlock generateInstanceSupplierCode(GenerationContext generationContext,
|
public CodeBlock generateInstanceSupplierCode(
|
||||||
BeanRegistrationCode beanRegistrationCode,
|
GenerationContext generationContext, BeanRegistrationCode beanRegistrationCode,
|
||||||
Executable constructorOrFactoryMethod, boolean allowDirectSupplierShortcut) {
|
Executable constructorOrFactoryMethod, boolean allowDirectSupplierShortcut) {
|
||||||
|
|
||||||
return this.codeFragments.generateInstanceSupplierCode(generationContext,
|
return this.codeFragments.generateInstanceSupplierCode(generationContext,
|
||||||
beanRegistrationCode, constructorOrFactoryMethod,
|
beanRegistrationCode, constructorOrFactoryMethod, allowDirectSupplierShortcut);
|
||||||
allowDirectSupplierShortcut);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -155,11 +152,10 @@ public abstract class BeanRegistrationCodeFragments {
|
||||||
* @param beanRegistrationCode the bean registration code
|
* @param beanRegistrationCode the bean registration code
|
||||||
* @return the generated code
|
* @return the generated code
|
||||||
*/
|
*/
|
||||||
public CodeBlock generateReturnCode(GenerationContext generationContext,
|
public CodeBlock generateReturnCode(
|
||||||
BeanRegistrationCode beanRegistrationCode) {
|
GenerationContext generationContext, BeanRegistrationCode beanRegistrationCode) {
|
||||||
|
|
||||||
return this.codeFragments.generateReturnCode(generationContext,
|
return this.codeFragments.generateReturnCode(generationContext, beanRegistrationCode);
|
||||||
beanRegistrationCode);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,9 +32,7 @@ import org.springframework.beans.factory.support.RegisteredBean;
|
||||||
class BeanRegistrationsAotProcessor implements BeanFactoryInitializationAotProcessor {
|
class BeanRegistrationsAotProcessor implements BeanFactoryInitializationAotProcessor {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public BeanRegistrationsAotContribution processAheadOfTime(
|
public BeanRegistrationsAotContribution processAheadOfTime(ConfigurableListableBeanFactory beanFactory) {
|
||||||
ConfigurableListableBeanFactory beanFactory) {
|
|
||||||
|
|
||||||
BeanDefinitionMethodGeneratorFactory beanDefinitionMethodGeneratorFactory =
|
BeanDefinitionMethodGeneratorFactory beanDefinitionMethodGeneratorFactory =
|
||||||
new BeanDefinitionMethodGeneratorFactory(beanFactory);
|
new BeanDefinitionMethodGeneratorFactory(beanFactory);
|
||||||
Map<String, BeanDefinitionMethodGenerator> registrations = new LinkedHashMap<>();
|
Map<String, BeanDefinitionMethodGenerator> registrations = new LinkedHashMap<>();
|
||||||
|
|
|
@ -815,13 +815,13 @@ public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFacto
|
||||||
}
|
}
|
||||||
|
|
||||||
BeanFactory parent = getParentBeanFactory();
|
BeanFactory parent = getParentBeanFactory();
|
||||||
if (parent instanceof DefaultListableBeanFactory dlfb) {
|
if (parent instanceof DefaultListableBeanFactory dlbf) {
|
||||||
// No bean definition found in this factory -> delegate to parent.
|
// No bean definition found in this factory -> delegate to parent.
|
||||||
return dlfb.isAutowireCandidate(beanName, descriptor, resolver);
|
return dlbf.isAutowireCandidate(beanName, descriptor, resolver);
|
||||||
}
|
}
|
||||||
else if (parent instanceof ConfigurableListableBeanFactory clfb) {
|
else if (parent instanceof ConfigurableListableBeanFactory clbf) {
|
||||||
// If no DefaultListableBeanFactory, can't pass the resolver along.
|
// If no DefaultListableBeanFactory, can't pass the resolver along.
|
||||||
return clfb.isAutowireCandidate(beanName, descriptor);
|
return clbf.isAutowireCandidate(beanName, descriptor);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -320,7 +320,7 @@ public class RootBeanDefinition extends AbstractBeanDefinition {
|
||||||
* Specify a generics-containing target type of this bean definition, if known in advance.
|
* Specify a generics-containing target type of this bean definition, if known in advance.
|
||||||
* @since 4.3.3
|
* @since 4.3.3
|
||||||
*/
|
*/
|
||||||
public void setTargetType(ResolvableType targetType) {
|
public void setTargetType(@Nullable ResolvableType targetType) {
|
||||||
this.targetType = targetType;
|
this.targetType = targetType;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -432,8 +432,8 @@ public class RootBeanDefinition extends AbstractBeanDefinition {
|
||||||
@Override
|
@Override
|
||||||
public void setInstanceSupplier(@Nullable Supplier<?> instanceSupplier) {
|
public void setInstanceSupplier(@Nullable Supplier<?> instanceSupplier) {
|
||||||
super.setInstanceSupplier(instanceSupplier);
|
super.setInstanceSupplier(instanceSupplier);
|
||||||
Method factoryMethod = (instanceSupplier instanceof InstanceSupplier<?>)
|
Method factoryMethod = (instanceSupplier instanceof InstanceSupplier<?> ?
|
||||||
? ((InstanceSupplier<?>) instanceSupplier).getFactoryMethod() : null;
|
((InstanceSupplier<?>) instanceSupplier).getFactoryMethod() : null);
|
||||||
if (factoryMethod != null) {
|
if (factoryMethod != null) {
|
||||||
setResolvedFactoryMethod(factoryMethod);
|
setResolvedFactoryMethod(factoryMethod);
|
||||||
}
|
}
|
||||||
|
|
|
@ -166,6 +166,7 @@ class BeanDefinitionMethodGeneratorFactoryTests {
|
||||||
return RegisteredBean.of(beanFactory, "test");
|
return RegisteredBean.of(beanFactory, "test");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static class MockBeanRegistrationExcludeFilter implements
|
static class MockBeanRegistrationExcludeFilter implements
|
||||||
BeanRegistrationAotProcessor, BeanRegistrationExcludeFilter, Ordered {
|
BeanRegistrationAotProcessor, BeanRegistrationExcludeFilter, Ordered {
|
||||||
|
|
||||||
|
@ -182,8 +183,7 @@ class BeanDefinitionMethodGeneratorFactoryTests {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public BeanRegistrationAotContribution processAheadOfTime(
|
public BeanRegistrationAotContribution processAheadOfTime(RegisteredBean registeredBean) {
|
||||||
RegisteredBean registeredBean) {
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -46,16 +46,13 @@ import org.springframework.lang.Nullable;
|
||||||
*
|
*
|
||||||
* @author Brian Clozel
|
* @author Brian Clozel
|
||||||
*/
|
*/
|
||||||
class RuntimeHintsBeanFactoryInitializationAotProcessor
|
class RuntimeHintsBeanFactoryInitializationAotProcessor implements BeanFactoryInitializationAotProcessor {
|
||||||
implements BeanFactoryInitializationAotProcessor {
|
|
||||||
|
|
||||||
private static final Log logger = LogFactory
|
private static final Log logger = LogFactory.getLog(RuntimeHintsBeanFactoryInitializationAotProcessor.class);
|
||||||
.getLog(RuntimeHintsBeanFactoryInitializationAotProcessor.class);
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public BeanFactoryInitializationAotContribution processAheadOfTime(
|
public BeanFactoryInitializationAotContribution processAheadOfTime(ConfigurableListableBeanFactory beanFactory) {
|
||||||
ConfigurableListableBeanFactory beanFactory) {
|
|
||||||
Map<Class<? extends RuntimeHintsRegistrar>, RuntimeHintsRegistrar> registrars = AotServices
|
Map<Class<? extends RuntimeHintsRegistrar>, RuntimeHintsRegistrar> registrars = AotServices
|
||||||
.factories(beanFactory.getBeanClassLoader()).load(RuntimeHintsRegistrar.class).stream()
|
.factories(beanFactory.getBeanClassLoader()).load(RuntimeHintsRegistrar.class).stream()
|
||||||
.collect(LinkedHashMap::new, (map, item) -> map.put(item.getClass(), item), Map::putAll);
|
.collect(LinkedHashMap::new, (map, item) -> map.put(item.getClass(), item), Map::putAll);
|
||||||
|
|
|
@ -87,8 +87,7 @@ public class CglibProxyTests extends AbstractAopProxyTests implements Serializab
|
||||||
AdvisedSupport pc = new AdvisedSupport(ITestBean.class);
|
AdvisedSupport pc = new AdvisedSupport(ITestBean.class);
|
||||||
pc.addAdvice(new NopInterceptor());
|
pc.addAdvice(new NopInterceptor());
|
||||||
AopProxy aop = createAopProxy(pc);
|
AopProxy aop = createAopProxy(pc);
|
||||||
assertThatExceptionOfType(AopConfigException.class).isThrownBy(
|
assertThatExceptionOfType(AopConfigException.class).isThrownBy(aop::getProxy);
|
||||||
aop::getProxy);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|
|
@ -129,11 +129,11 @@ class TestClassScanner {
|
||||||
if (logger.isInfoEnabled()) {
|
if (logger.isInfoEnabled()) {
|
||||||
if (packageNames.length > 0) {
|
if (packageNames.length > 0) {
|
||||||
logger.info("Scanning for Spring test classes in packages %s in classpath roots %s"
|
logger.info("Scanning for Spring test classes in packages %s in classpath roots %s"
|
||||||
.formatted(Arrays.toString(packageNames), this.classpathRoots));
|
.formatted(Arrays.toString(packageNames), this.classpathRoots));
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
logger.info("Scanning for Spring test classes in all packages in classpath roots %s"
|
logger.info("Scanning for Spring test classes in all packages in classpath roots %s"
|
||||||
.formatted(this.classpathRoots));
|
.formatted(this.classpathRoots));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -45,6 +45,7 @@ class TransactionBeanRegistrationAotProcessor implements BeanRegistrationAotProc
|
||||||
|
|
||||||
private final static String JAKARTA_TRANSACTIONAL_CLASS_NAME = "jakarta.transaction.Transactional";
|
private final static String JAKARTA_TRANSACTIONAL_CLASS_NAME = "jakarta.transaction.Transactional";
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public BeanRegistrationAotContribution processAheadOfTime(RegisteredBean registeredBean) {
|
public BeanRegistrationAotContribution processAheadOfTime(RegisteredBean registeredBean) {
|
||||||
Class<?> beanClass = registeredBean.getBeanClass();
|
Class<?> beanClass = registeredBean.getBeanClass();
|
||||||
|
@ -68,6 +69,7 @@ class TransactionBeanRegistrationAotProcessor implements BeanRegistrationAotProc
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private static class TransactionBeanRegistrationAotContribution implements BeanRegistrationAotContribution {
|
private static class TransactionBeanRegistrationAotContribution implements BeanRegistrationAotContribution {
|
||||||
|
|
||||||
private final Class<?> beanClass;
|
private final Class<?> beanClass;
|
||||||
|
@ -84,7 +86,8 @@ class TransactionBeanRegistrationAotProcessor implements BeanRegistrationAotProc
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
for (Class<?> proxyInterface : proxyInterfaces) {
|
for (Class<?> proxyInterface : proxyInterfaces) {
|
||||||
runtimeHints.reflection().registerType(proxyInterface, builder -> builder.withMembers(MemberCategory.INVOKE_DECLARED_METHODS));
|
runtimeHints.reflection().registerType(proxyInterface,
|
||||||
|
builder -> builder.withMembers(MemberCategory.INVOKE_DECLARED_METHODS));
|
||||||
}
|
}
|
||||||
runtimeHints.proxies().registerJdkProxy(AopProxyUtils.completeJdkProxyInterfaces(proxyInterfaces));
|
runtimeHints.proxies().registerJdkProxy(AopProxyUtils.completeJdkProxyInterfaces(proxyInterfaces));
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue