2009-12-17 6 views
7

Ich bin heute mit Spring 3.0 über ein ziemlich seltsames Problem gestolpert:Was ist der Unterschied zwischen der Verarbeitung von @Component- und @Repository/@Service-Annotationen?

Es gibt eine abstrakte Klasse A und ihre konkrete Implementierung A_Impl. A_Impl ist als @Repository annotiert und wird von Spring automatisch gescannt (<context:component-scan> und <context:annotation-config/> sind beide im Kontext deklariert). A und A_Impl werden in separaten JARs bereitgestellt (nicht sicher, ob das wichtig ist). Alles funktioniert gut.

Nun, ich überprüfte diesen Code und @Repository schien nicht semantisch gut zu passen (die betreffende Klasse hat nichts mit Persistenz zu tun), also habe ich mich entschieden - in meiner unendlichen Weisheit -, das zu ändern generische @Component. Unnötig zu sagen, dass alles explodierte und mich wie ein kompletter Idiot aussehen ließ. Der Fehler (der während der Spring-Kontextinitialisierung auftrat) war Spring's ClassPathResource.getInputStream()-Methode, die sich darüber beschwert, dass die A-Klasse nicht da ist (es ist, ich habe es manuell überprüft; plus regulärer Classloader findet es ganz gut)

Nichts anderes hat geändert . Wenn ich @Component für @Repository-Kontext vertausche, initialisiert, wenn ich sie zurück tausche es nicht mit dem obigen Fehler. Spring documentation claims there's no difference zwischen @Component und @Repository was eindeutig eine verdammte Lüge ist :-) Also ich frage mich - was ist der Unterschied?

Antwort

4

Ich habe @Component ohne Probleme verwendet.

Die einzige Sache (obwohl nicht so intelligente), die mir als Möglichkeit in den Sinn kommt, ist, dass Ihr @Component nicht der Frühling sein könnte. Tapestry zum Beispiel hat eine Annotation, die auf die gleiche Weise benannt ist. Andere Frameworks können es auch haben. Überprüfen Sie also Ihre Importe.

+0

Guter Punkt, aber es ist auf jeden Fall Spring '' Component'. Wäre es nicht, würde es einfach nicht abgeholt werden - aber es ist und es sprengt den Kontext in dem Prozess. – ChssPly76

+0

hm. Ist die Ausnahme die eine, die "keine Bohne vom Typ .. gefunden wird", oder eine andere? – Bozho

+0

Nein, die Ausnahme ist 'FileNotFoundException', die von' ClassPathResource.getInputStream() 'ausgelöst wird, weil der Klassenlader keinen' InputStream' für 'A.class' öffnen kann. Ich bin nicht so sehr damit beschäftigt, diesen Fehler per se zu beheben - ich bin mir ziemlich sicher, dass es Spring's Bug ist und ich werde den Code durchgehen, wenn ich eine Chance bekomme und bestätige - da ich gerne wissen möchte (und warum) Die @ Repository- und @ Component-Verarbeitung unterscheidet sich. – 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)  | 

Verwendung von @Service und @Repository Anmerkungen sind wichtig, aus Datenbankverbindung Perspektive.

  1. Verwenden @Service für alle Ihre Web-Service Art von DB-Verbindungen
  2. Verwenden @Repository für alle gespeicherten proc DB-Verbindungen

Wenn Sie nicht über die richtigen Anmerkungen verwenden Sie außer Kraft gesetzt begehen gegenüberstellen können Ausnahmen durch Rollback-Transaktionen. Während des Belastungstests werden Ausnahmen angezeigt, die sich auf Rollback-JDBC-Transaktionen beziehen.

+0

Könnte jemand klären, was mit "Web Service Art der DB Verbindungen" und "Stored Proc DB-Verbindungen "? Ich frage mich, ob Satish "Service Layer" fälschlicherweise als Web Services bezeichnet. – spaaarky21

Verwandte Themen