Solución:
Spring Boot se está compilando con muchas dependencias opcionales; así que cuando se compila Spring Boot, el MyBean.class
está en la ruta de clases.
Ahora su aplicación puede no tener eso MyBean.class
en su classpath, pero no falla en tiempo de ejecución. Esto se debe a que la infraestructura que procesa @ConditionalOnClass
las anotaciones leerán el código de bytes de la configuración y solo las cargarán si eso MyBean.class
está presente. Ver @ConditionalOnClass
javadoc.
Ahora, la configuración automática es un tema amplio, y puede aprender más sobre esto en esta charla.
Como dice la documentación de Spring Boot:
Las anotaciones @ConditionalOnClass y @ConditionalOnMissingClass permiten que la configuración se incluya en función de la presencia o ausencia de clases específicas. Debido al hecho de que los metadatos de las anotaciones se analizan mediante ASM, en realidad puede usar el atributo de valor para hacer referencia a la clase real, aunque esa clase no aparezca en la ruta de clases de la aplicación en ejecución. También puede utilizar el atributo de nombre si prefiere especificar el nombre de la clase mediante un valor de cadena.
Por lo tanto, usan la biblioteca de manipulación de códigos de bytes ASM para poder analizar los nombres de las clases durante el tiempo de ejecución, incluso si las clases ya no están en la ruta de clases. Dado que Spring es de código abierto, incluso puede mirar el código de lectura de anotaciones.