2009-12-17 19 views
7

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?

Respuesta

4

He estado usando @Component sin problemas.

La única cosa (aunque no tan inteligente) que me viene a la mente como posibilidad es que su @Component podría no ser el primero. Tapiz, por ejemplo, tiene una anotación llamada de la misma manera. Otros marcos también pueden tenerlo. Entonces revisa tus importaciones.

+0

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

+0

hm. ¿Es la excepción la que "no se encuentra el frijol de tipo .." u otra? – Bozho

+0

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

0
|Annotation | Meaning            | 
+------------+-----------------------------------------------------+ 
| @Component | generic stereotype for any Spring-managed component | 
| @Repository| stereotype for persistence layer     | 
| @Service | stereotype for service layer      | 
| @Controller| stereotype for presentation layer (spring-mvc)  | 

El uso de @Service y @Repository anotaciones son importantes desde la perspectiva de la conexión de base de datos.

  1. Uso @Service por toda su tipo de servicio red de conexiones DB
  2. Uso @Repository para todas sus conexiones de base de datos procedimiento almacenado

Si usted no utiliza las anotaciones apropiadas, que se puede encontrar cometer excepciones anulado mediante transacciones de reversión. Verás excepciones durante la prueba de carga de estrés que está relacionada con la reversión de las transacciones JDBC.

+0

¿Podría alguien aclarar qué significa "tipo de servicio web de conexiones DB" y "proceso almacenado" Conexiones de DB "? Me pregunto si Satish interpretará erróneamente la "capa de servicio" como una referencia a los servicios web. – spaaarky21

Cuestiones relacionadas