2010-03-18 17 views
5

Ich habe meine Klassen mit @Repository, @Resource, @Component, @Service-Annotationen versehen, aber diese Klassen müssen in 2 Umgebungen ausgeführt werden. Die erste Umgebung basiert auf der Feder 2.x, während die andere keine Feder hat. Ich bin sicher, der Code wird ohne die Frühlingsgläser fehlschlagen & Ich möchte Ideen von Ihnen wissen, wie ich die Anmerkungen behalten kann, aber immer noch in beiden UmgebungenAbhängigkeit von Spring-Anmerkungen

Antwort

0

Da Sie einen akzeptierten Beitrag nicht löschen können, schlage ich vor, Sie lesen/Stimme Hans' Post, die eine viel bessere Erklärung als mein Originals ist: Dependency on Spring's annotations


Wenn das Klischee Anmerkungen mit (@Service usw.), besteht der Nachteil darin, dass Sie die Bean-Validierung für die Kompilierung erhalten, indem Sie mit der Spring-Kontext-Bibliothek in Ihrem Code verbunden werden. Ich sehe 3 sofortige Optionen:

1) Entfernen Sie die Anmerkungen, und konfigurieren Sie Ihre Beans in XML.

2) Kopieren Sie die Datei spring-context.jar (oder die entsprechende Bibliothek, die Ihre Stereotyp-Annotationen enthält) in Ihr Nicht-Spring-Projekt, um die Abhängigkeiten aufzulösen. Lassen Sie Spring jedoch nicht konfiguriert, damit es in Ihrem Code nicht verwendet wird.

3) Entfernen Sie die Anmerkungen aus Ihren konkreten Klassen, und erweitern Sie sie mit "Spring" -Versionen. Dieser Ansatz kann oder auch nicht ein wenig invasiven Ihren Entwurf sein, aber eine Überlegung wert:

public class MyDAO { 
    protected SessionFactory sessionFactory; 

    public void setSessionFactory(SessionFactory sessionFactory) { 
     this.sessionFactory = sessionFactory; 
    } 

    // .. Your DAO code resides here .. 
} 

und die Federunterklasse:

@Repository 
public class MySpringDAO extends MyDAO { 

    @AutoWired 
    protected SessionFactory sessionFactory; 
} 

Auf diese Weise Ihr nicht-Spring-Projekt verwenden kann " MyDAO "und schließen Sie die Klasse" MySpringDAO "aus dem Build aus.

+0

Ich wählte # 2 und es funktioniert gut. –

+0

Danke Sean, das ist gnädig von dir. –

1

Für jede Anmerkung in Java gibt es eine entsprechende Klassendatei. Wenn Sie herausfinden, welche Anmerkungen Sie verwenden, können Sie die Klassendateien in die andere Umgebung kopieren.

Ich bin nicht sicher, ob diese Klassen auch von anderen Klassen abhängig sind; sie sind es wahrscheinlich nicht, da Annotationen unveränderbare Nur-Daten-Objekte sind. Wenn die Klasse auch Methoden hat, können Sie die Annotationsquellen ohne die Methoden (d. H. Nur die Felder) für die Verwendung in der anderen Umgebung neu kompilieren (mit derselben Serialisierungs-ID).

5

Um in der Lage zu sein, die von Ihnen erwähnten Anmerkungen zu verwenden oder Spring wirklich zu verwenden, damit Sie den Vorteil erhalten, müssen Sie mindestens Spring 2.5.x verwenden, das ist, als sie eingeführt wurden.

Darüber hinaus müssen Anmerkungen nicht im Klassenpfad enthalten sein. Sie werden einfach ignoriert werden. Seit du Frühling 2.0 verwendest, gibt es keinen Code, der nach ihnen "scannen" möchte.

+0

Sie haben immer noch Kompilierungszeitabhängigkeiten von diesen Anmerkungen. Und da Ihre .class-Dateien die Anmerkungen enthalten, würde ich annehmen, dass Sie die .class-Dateien der Annotationen auch auf Ihrem Klassenpfad benötigen würden. Ist das nicht der Fall? –

+1

Nein :) um es zu überprüfen, habe ich gerade getestet. Ich habe ein kleines Projekt mit einem main() erstellt. Die Klasse ist mit MyAnnotation versehen, die ich geschrieben habe. Ich habe es auf der Kommandozeile ausgeführt, dann manuell die .class-Datei für die Annotation gelöscht und erneut ausgeführt. Es funktionierte immer noch. Probieren Sie es selbst aus :) Beachten Sie, dass meine Anmerkung mit @Retention (RetentionPolicy.RUNTIME) selbst notiert wurde. –

+0

Sehr gut zu wissen, tatsächlich ... –

0

Es wäre nicht Frühling, wenn Sie gezwungen wären, Ihre Klassen direkt davon abhängig zu machen.

Sie können Ihre eigenen Anmerkungen definieren, die den gleichen Zweck erfüllen wie die im Frühling bewährten. I.e. define com.yourcompany .... Komponente usw.

Ich nehme an, dass Sie einen <context:component-scan .../> irgendwo in Ihrem Frühling Config verwenden. Fügen Sie einfach use-default-filters="false" hinzu und definieren Sie Ihren eigenen Filter, der Ihren Anmerkungen entspricht.

Suchen Sie nach den PostProcessors, die tatsächlich die Grunt-Arbeit erledigen.Sie können so konfiguriert werden, dass sie einen alternativen Satz von Anmerkungen verwenden. @Repository wird durch PersistenceExceptionTranslationPostProcessor untersucht. Dieser PostProcessor kann so konfiguriert werden, dass er Ihr Äquivalent zur Annotation verwendet.

Verwandte Themen