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?
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
hm. Ist die Ausnahme die eine, die "keine Bohne vom Typ .. gefunden wird", oder eine andere? – Bozho
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