Let's assume this simple example:

@Configuration(proxyBeanMethods = false)
static class TaskExecutorConfiguration {

    @Condition1
    @Bean(TaskExecutionAutoConfiguration.APPLICATION_TASK_EXECUTOR_BEAN_NAME)
    SimpleAsyncTaskExecutor applicationTaskExecutor1() { ... }

    @ConditionNot1
    @Bean(TaskExecutionAutoConfiguration.APPLICATION_TASK_EXECUTOR_BEAN_NAME)
    ThreadPoolTaskExecutor applicationTaskExecutor2() { ... }
}

This works fine as if one is enabled, the other isn't. However, this is problematic if we want to refresh a context that needs to consider all options. In this case, the conditions aren't evaluated and the processing fails:

org.springframework.beans.factory.support.BeanDefinitionOverrideException: Invalid bean definition with name 'applicationTaskExecutor' defined in class path resource [org/springframework/boot/autoconfigure/task/TaskExecutorConfigurations$TaskExecutorConfiguration.class]: @Bean method override with same bean name but different method name: Root bean: class=null; scope=; abstract=false; lazyInit=null; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; fallback=false; factoryBeanName=org.springframework.boot.autoconfigure.task.TaskExecutorConfigurations$TaskExecutorConfiguration; factoryMethodName=applicationTaskExecutorVirtualThreads; initMethodNames=null; destroyMethodNames=[(inferred)]; defined in class path resource [org/springframework/boot/autoconfigure/task/TaskExecutorConfigurations$TaskExecutorConfiguration.class]

    at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.isOverriddenByExistingDefinition(ConfigurationClassBeanDefinitionReader.java:333)
    at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitionsForBeanMethod(ConfigurationClassBeanDefinitionReader.java:222)
    at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitionsForConfigurationClass(ConfigurationClassBeanDefinitionReader.java:147)
    at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitions(ConfigurationClassBeanDefinitionReader.java:123)
    at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:454)
    at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:306)
    at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:349)
    at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:118)

It would be nice if we could configure a BeanNameGenerator that always take precedence, even if @Bean has a name. This clearly is very particular for AOT processing so it doesn't need to be front and center.

Comment From: snicoll

Given that ConfigurationBeanNameGenerator has been introduced in 7.0, we could change the method to takes the method metadata and a @Nullable bean name. With that change, implementations could determine what to do if the provided bean name is not null (rather than not being called at all).

Comment From: snicoll

Juergen and I discussed and we'd like to give that option a try.

Comment From: SuganthiThomas

Hi, I’m interested in working on this issue. I have experience with Java and Spring Boot. Could I take this up?

Comment From: snicoll

Thanks for the offer but this issue is assigned so it's not open for contributions.