AOT generation with Spring Cloud is broken as ConfigurationPropertiesBeanFactoryInitializationAotProcessor loops over all the @ConfigurationProperties-annotated types and try to get its merged bean definition to register the necessary hints. A singleton does not have a bean definition, which leads to:

Exception in thread "main" org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'keyProperties' available
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition(DefaultListableBeanFactory.java:860)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getMergedLocalBeanDefinition(AbstractBeanFactory.java:1302)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getMergedBeanDefinition(AbstractBeanFactory.java:1092)
    at org.springframework.boot.context.properties.ConfigurationPropertiesBeanFactoryInitializationAotProcessor.processAheadOfTime(ConfigurationPropertiesBeanFactoryInitializationAotProcessor.java:67)
    at org.springframework.context.aot.BeanFactoryInitializationAotContributions.getContributions(BeanFactoryInitializationAotContributions.java:67)
    at org.springframework.context.aot.BeanFactoryInitializationAotContributions.<init>(BeanFactoryInitializationAotContributions.java:49)
    at org.springframework.context.aot.BeanFactoryInitializationAotContributions.<init>(BeanFactoryInitializationAotContributions.java:44)
    at org.springframework.context.aot.ApplicationContextAotGenerator.generateApplicationContext(ApplicationContextAotGenerator.java:55)
    at org.springframework.boot.AotProcessor.performAotProcessing(AotProcessor.java:150)
    at org.springframework.boot.AotProcessor.process(AotProcessor.java:110)
    at org.springframework.boot.AotProcessor.main(AotProcessor.java:227)

Comment From: snicoll

Interestingly enough, Spring Native uses the same logic so it should be something new in Spring Cloud.

Comment From: spencergibb

https://github.com/spring-projects/spring-framework/issues/28487 for some history. "keyProperties" and "textEncryptor" are registered the same way