es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Por qué @ComponentScan requiere paquetes anidados para funcionar?

Chicos. Soy nuevo en Spring y me enfrento a un problema con la anotación @ComponentScan. Según la API oficial de Spring, dice que @ComponentScan puede escanear el paquete actual y todos los subpaquetes sin argumento, y puede escanear el paquete especificado y sus subpaquetes con argumento.

Sin embargo, cuando estaba practicando implementando mi propio mini programa, descubrí que @ComponentScan solo puede funcionar con el paquete anidado con o sin argumento.

Creé un proyecto utilizando Maven como herramienta de construcción y la estructura se muestra a continuación. enter image description here

y el AppConfig es enter image description here
La aplicación llamará a Corolla y estará marcada como Componente, no le doy argumento a @ComponentScan aquí. Creo que debería funcionar pero me da una excepción.

ADVERTENCIA: Excepción encontrada durante la inicialización del contexto – cancelando el intento de actualización: org.springframework.beans.factory.BeanCreationException: Error al crear el bean con el nombre ‘org.springframework.context.annotation.internalAsyncAnnotationProcessor’

Luego intenté dar el argumento a @ComponentScan para especificar el paquete

@ComponentScan(“org”)

Todavía no funcionó, lanzando la misma excepción.

Luego intenté mover estas tres clases al paquete interno “studyhard” y cambiar el argumento a “org.studyhard”. enter image description here

Funcionó como esperaba.
Luego quité el argumento, y todavía funcionó.

¿Por qué @ComponentScan solo funciona cuando se le dan paquetes anidados como “org.studyhard” en lugar del único “org”?

Tags:  ,

Answer

  1. Avatar for davy.ai

    La razón por la cual @ComponentScan solo funciona con paquetes anidados es porque cuando le das a @ComponentScan un argumento, espera un nombre de paquete completamente cualificado. En tu caso, cuando das “org” como argumento, no es un nombre de paquete completamente cualificado y, por lo tanto, Spring no puede encontrar los componentes para escanear.

    Por otro lado, cuando das “org.studyhard”, es un nombre de paquete completamente cualificado y Spring puede encontrar los componentes para escanear.

    Además, cuando no das un argumento, Spring escaneará el paquete actual y sus subpaquetes. En tu caso, no tienes subpaquetes, por lo que solo escaneará el paquete actual, por eso tampoco funcionó.

    En resumen, para que @ComponentScan funcione, necesitas especificar un nombre de paquete completamente cualificado, que incluya el paquete actual y todos sus subpaquetes, o un paquete anidado específico.

Comments are closed.