he tropezado con un problema bastante extraño hoy en día con Spring 3.0:¿Cuál es la diferencia entre cómo se procesan las anotaciones @Component y @Repository/@Service?
Hay una clase abstracta A
y su aplicación concreta A_Impl
. A_Impl
está anotado como @Repository
y es escaneado automáticamente por Spring (<context:component-scan>
y <context:annotation-config/>
ambos se declaran en contexto). A
y A_Impl
se implementan en JAR separados (no estoy seguro si eso importa). Todo funciona bien
Ahora, estaba revisando ese código y @Repository
no parecía una buena opción semántica (la clase en cuestión no tiene nada que ver con la persistencia) así que, en mi sabiduría infinita, he decidido cambiar eso a más genérico @Component
. Huelga decir que todo explotó, dejándome como un completo idiota. El error (que se produjo durante contexto primavera inicialización) fue ClassPathResource.getInputStream()
método de Primavera quejándose de A
clase no estar allí (que es, he comprobado manualmente; además cargador de clases regulares lo encuentra muy bien)
Nada más ha cambiado . Si canjeo @Component
por @Repository
contexto se inicializa, si lo cambio de nuevo no lo hace con el error anterior. Spring documentation claims there's no difference entre @Component
y @Repository
que es claramente una maldita mentira :-) Así que me pregunto - ¿qué es la diferencia?
Buen punto, pero definitivamente es el '@ Component' de Spring. Si no fuera así, simplemente no sería recogido, pero lo es y explota el contexto en el proceso. – ChssPly76
hm. ¿Es la excepción la que "no se encuentra el frijol de tipo .." u otra? – Bozho
No, la excepción es 'FileNotFoundException' lanzada desde' ClassPathResource.getInputStream() 'porque el cargador de clases no puede abrir un' InputStream' para 'A.class'. No estoy tan preocupado por resolver este error per se: estoy razonablemente seguro de que es el error de Spring y revisaré el código cuando tenga la oportunidad y lo confirme, ya que me gustaría saber cómo (y por qué) El proceso de @Repository y @Component es diferente. – ChssPly76