2009-05-20 2 views
8

Warum sollten Sie bei Verwendung von AspectJ @Component over @Configurable verwenden.Konfigurierbar gegen Komponente mit Feder und AspectJ

Ich habe Spring und AspectJ Setup für @Transactional Unterstützung, Aspekte auf Selbst-Aufruf und Injektion in JPA-Entitäten. Das funktioniert großartig.

Ich verwende @Component für die meisten Klassen, die Injektion benötigen, und damit entweder in ihre Abhängigkeiten injiziert. Oder wenn ich nicht kann, injiziere den ApplicationContext und benutze dann getBean() als letzten Ausweg. Und ich reserviere @Configurable nur für JPA-Entitäten (Hibernate), die eine Injektion benötigen. Ich habe auch angefangen, @Configurable für jUnit-Tests zu verwenden, um das Schreiben von Tests einfach zu machen. Das funktioniert auch super.

Aber ich bin neugierig. Wenn AspectJ nun automatisch etwas mit der @Configurable-Annotation injiziert (bejahet), unabhängig davon, wie es konstruiert wurde; getBean(), new(), @Autowired. Warum sollte ich nicht einfach @Configurable für alle meine Beans verwenden? Dann kann ich den Anwendungskontext und getBean() ganz abschaffen, und nur neue() Klassen, die ich nicht injizieren kann.

Ich weiß, dass ich keine XML-Bean-Konfiguration erwähnt habe. Ich scheue das nicht, aber dieses Projekt benötigt keine. Ich Konstruktor oder Setter injizieren die Abhängigkeiten beim Testen. sehr leicht.

Antwort

1

Ein Grund, warum Sie nicht immer @Configurable verwenden sollten, ist, dass es viel Overhead verursacht: Es dauert oft viel länger, bis die App startet und das Erstellen neuer Instanzen wird langsamer.

Für @Component brauchen Sie es überhaupt nicht, weil normalerweise alle Instanzen von Spring verwaltet werden.

12

@Component ist eine Spring-Marker-Schnittstelle, die Spring-Hinweise geben kann, wenn es um die automatische Erkennung von Bohnen geht.

@Configurable ist ein Marker, der von AOP Load-Time-Weben verwendet wird.

Die beiden haben nicht wirklich viel miteinander zu tun.

6

@Component ist für Klassen, die von Spring selbst instanziiert werden, während @Configurable für Klassen ist, die von Ihrem eigenen Code oder einem anderen Framework instanziiert werden - Entitäten von Hibernate oder Servlets von dem Servlet-Container zum Beispiel.