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 d18d76b297d..bde55493f49 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 @@ -111,11 +111,14 @@ class BeanDefinitionMethodGeneratorFactory { private boolean isImplicitlyExcluded(RegisteredBean registeredBean) { Class beanClass = registeredBean.getBeanClass(); - if (BeanRegistrationExcludeFilter.class.isAssignableFrom(beanClass)) { - return false; + if (BeanFactoryInitializationAotProcessor.class.isAssignableFrom(beanClass)) { + return true; } - return BeanFactoryInitializationAotProcessor.class.isAssignableFrom(beanClass) - || BeanRegistrationAotProcessor.class.isAssignableFrom(beanClass); + if (BeanRegistrationAotProcessor.class.isAssignableFrom(beanClass)) { + BeanRegistrationAotProcessor processor = this.aotProcessors.findByBeanName(registeredBean.getBeanName()); + return (processor == null) || processor.isBeanExcludedFromAotProcessing(); + } + return false; } private List getAotContributions( 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 646b632958d..044b68aeb91 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 @@ -47,4 +47,16 @@ public interface BeanRegistrationAotProcessor { @Nullable BeanRegistrationAotContribution processAheadOfTime(RegisteredBean registeredBean); + /** + * Return if the bean instance associated with this processor should be + * excluded from AOT processing itself. By default this method will return + * {@code true} to automatically exclude the bean, if the definition should + * be written then this method may be overridden to return {@code true}. + * @return if the bean should be excluded from AOT processing + * @see BeanRegistrationExcludeFilter + */ + default boolean isBeanExcludedFromAotProcessing() { + return true; + } + } 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 95f1e0da753..6d922ec2164 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 @@ -127,11 +127,11 @@ class BeanDefinitionMethodGeneratorFactoryTests { } @Test - void getBeanDefinitionMethodGeneratorWhenRegisteredBeanIsAotProcessorAndFiltersBeanBeanRegistrationExcludeFilterDoesNotFilterBean() { + void getBeanDefinitionMethodGeneratorWhenRegisteredBeanIsAotProcessorAndIsNotExcludedAndBeanRegistrationExcludeFilterDoesNotFilterBean() { MockSpringFactoriesLoader springFactoriesLoader = new MockSpringFactoriesLoader(); DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory(); beanFactory.registerBeanDefinition("test", BeanDefinitionBuilder - .rootBeanDefinition(TestBeanRegistrationAotProcessorAndFilterBean.class).getBeanDefinition()); + .rootBeanDefinition(TestBeanRegistrationAotProcessorAndNotExcluded.class).getBeanDefinition()); RegisteredBean registeredBean1 = RegisteredBean.of(beanFactory, "test"); BeanDefinitionMethodGeneratorFactory methodGeneratorFactory = new BeanDefinitionMethodGeneratorFactory( AotServices.factoriesAndBeans(springFactoriesLoader, beanFactory)); @@ -197,12 +197,11 @@ class BeanDefinitionMethodGeneratorFactoryTests { } - static class TestBeanRegistrationAotProcessorAndFilterBean - extends TestBeanRegistrationAotProcessorBean - implements BeanRegistrationExcludeFilter { + static class TestBeanRegistrationAotProcessorAndNotExcluded + extends TestBeanRegistrationAotProcessorBean { @Override - public boolean isExcluded(RegisteredBean registeredBean) { + public boolean isBeanExcludedFromAotProcessing() { return false; }