diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/aot/BeanDefinitionMethodGeneratorFactory.java b/spring-beans/src/main/java/org/springframework/beans/factory/aot/BeanDefinitionMethodGeneratorFactory.java index 580a0533ced..6938f0c9ef2 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/aot/BeanDefinitionMethodGeneratorFactory.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/aot/BeanDefinitionMethodGeneratorFactory.java @@ -133,6 +133,10 @@ class BeanDefinitionMethodGeneratorFactory { } private boolean isImplicitlyExcluded(RegisteredBean registeredBean) { + if (Boolean.TRUE.equals(registeredBean.getMergedBeanDefinition() + .getAttribute(BeanRegistrationAotProcessor.IGNORE_REGISTRATION_ATTRIBUTE))) { + return true; + } Class beanClass = registeredBean.getBeanClass(); if (BeanFactoryInitializationAotProcessor.class.isAssignableFrom(beanClass)) { return true; diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/aot/BeanRegistrationAotProcessor.java b/spring-beans/src/main/java/org/springframework/beans/factory/aot/BeanRegistrationAotProcessor.java index 5e2c1716961..30a57779a2c 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/aot/BeanRegistrationAotProcessor.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/aot/BeanRegistrationAotProcessor.java @@ -49,6 +49,15 @@ import org.springframework.lang.Nullable; @FunctionalInterface public interface BeanRegistrationAotProcessor { + /** + * The name of an attribute that can be + * {@link org.springframework.core.AttributeAccessor#setAttribute set} on a + * {@link org.springframework.beans.factory.config.BeanDefinition} to signal + * that its registration should not be processed. + * @since 6.2 + */ + String IGNORE_REGISTRATION_ATTRIBUTE = "aotProcessingIgnoreRegistration"; + /** * Process the given {@link RegisteredBean} instance ahead-of-time and * return a contribution or {@code null}. diff --git a/spring-beans/src/test/java/org/springframework/beans/factory/aot/BeanDefinitionMethodGeneratorFactoryTests.java b/spring-beans/src/test/java/org/springframework/beans/factory/aot/BeanDefinitionMethodGeneratorFactoryTests.java index 24e190ca8b2..7f38730c03f 100644 --- a/spring-beans/src/test/java/org/springframework/beans/factory/aot/BeanDefinitionMethodGeneratorFactoryTests.java +++ b/spring-beans/src/test/java/org/springframework/beans/factory/aot/BeanDefinitionMethodGeneratorFactoryTests.java @@ -36,6 +36,7 @@ import static org.mockito.Mockito.mock; * Tests for {@link BeanDefinitionMethodGeneratorFactory}. * * @author Phillip Webb + * @author Stephane Nicoll */ class BeanDefinitionMethodGeneratorFactoryTests { @@ -58,6 +59,40 @@ class BeanDefinitionMethodGeneratorFactoryTests { AotServices.factories(loader))); } + @Test + void getBeanDefinitionMethodGeneratorWhenExcludedByBeanDefinitionAttributeReturnsNull() { + MockSpringFactoriesLoader springFactoriesLoader = new MockSpringFactoriesLoader(); + DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory(); + RegisteredBean registeredBean = registerTestBean(beanFactory); + registeredBean.getMergedBeanDefinition().setAttribute( + BeanRegistrationAotProcessor.IGNORE_REGISTRATION_ATTRIBUTE, true); + BeanDefinitionMethodGeneratorFactory methodGeneratorFactory = new BeanDefinitionMethodGeneratorFactory( + AotServices.factoriesAndBeans(springFactoriesLoader, beanFactory)); + assertThat(methodGeneratorFactory.getBeanDefinitionMethodGenerator(registeredBean)).isNull(); + } + + @Test + void getBeanDefinitionMethodGeneratorWhenBeanDefinitionAttributeSetToFalseDoesNotFilterBean() { + MockSpringFactoriesLoader springFactoriesLoader = new MockSpringFactoriesLoader(); + DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory(); + RegisteredBean registeredBean = registerTestBean(beanFactory); + registeredBean.getMergedBeanDefinition().setAttribute( + BeanRegistrationAotProcessor.IGNORE_REGISTRATION_ATTRIBUTE, false); + BeanDefinitionMethodGeneratorFactory methodGeneratorFactory = new BeanDefinitionMethodGeneratorFactory( + AotServices.factoriesAndBeans(springFactoriesLoader, beanFactory)); + assertThat(methodGeneratorFactory.getBeanDefinitionMethodGenerator(registeredBean)).isNotNull(); + } + + @Test + void getBeanDefinitionMethodGeneratorWhenBeanDefinitionAttributeIsNotSetDoesNotFilterBean() { + MockSpringFactoriesLoader springFactoriesLoader = new MockSpringFactoriesLoader(); + DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory(); + RegisteredBean registeredBean = registerTestBean(beanFactory); + BeanDefinitionMethodGeneratorFactory methodGeneratorFactory = new BeanDefinitionMethodGeneratorFactory( + AotServices.factoriesAndBeans(springFactoriesLoader, beanFactory)); + assertThat(methodGeneratorFactory.getBeanDefinitionMethodGenerator(registeredBean)).isNotNull(); + } + @Test void getBeanDefinitionMethodGeneratorWhenExcludedByBeanRegistrationExcludeFilterReturnsNull() { MockSpringFactoriesLoader springFactoriesLoader = new MockSpringFactoriesLoader();