Das neue Release mit Annotationen

Spring 2.5

Eberhard Wolff

Das neue Release des Spring-Frameworks ist draußen. Etwas mehr als ein Jahr nach 2.0 steht damit das nächste größere Update ins Haus – was gibt es an Neuem?

Wenn wir schon bei Versionen sind: Spring 2.5 setzt JDK 1.4 oder 1.5 voraus – die Unterstützung von JDK 1.3 ist gestrichen, da diese Version auch das End-Of-Life erreicht hat. Neu ist die Unterstützung für JDK 1.6 und dabei vor allem für JDBC 4.0. Neben Java EE 1.4 und 1.3 wird nun auch Java EE 5 mit den entsprechenden API-Versionen unterstützt. Wesentliche Neuerung ist dabei auch die Unterstützung für JSR 250 (Common Annotations).

Und das zeigt auch, in welchem Bereich die meisten Neuerungen zu finden sind: Spring bietet nun die Möglichkeit, die Konfiguration der Spring-Beans durch Annotationen vorzunehmen. Ein Beispiel zeigt Listing 1: Durch @Resource wird eine abhängige Spring-Bean injiziert. Dabei steht in der Annotation der Namen der Spring-Bean, die injiziert werden soll. Letztendlich ist dies also ein Autowiring-By-Name, sodass der Code selber auch Hinweise auf die Spring-Konfiguration enthält, was man eigentlich vermeiden sollte. Mit den Annotationen @PreDestroy und @PostConstruct können Methoden annotiert werden, die nach dem Erzeugen der Beans zur Initialisierung oder vor dem Zerstören der Beans zum Aufräumen von Ressourcen verwendet werden können. Neben diesen Annotationen kann man sich mit Spring 2.5 durch @EJB eine EJB-3-Bean injizieren lassen und durch @WebServiceRef einen Web Service. Sogar die Definition von Transaktions-Attributen mit der aus EJB 3 bekannten @TransactionAttribute-Annotation ist möglich, wenn man mit den gegenüber der Spring-Annotation @Transactional erheblich eingeschränkten Konfigurations-Möglichkeiten leben kann.

Listing 1
public class CustomerDao {

    private DataSource dataSource;

    @Resource(name = "dataSource")
    public void setDataSource(DataSource dataSource) {
        this.dataSource = dataSource;
    }

    @PreDestroy
    public void callMeBeforeDestruction() { . }

    @PostConstruct
    public void callMeAfterConstruction() { . }


}

Dennoch reichen diese standardisierten Annotationen nicht aus. So möchte man sicher auch die Möglichkeit haben, Spring-Bean nach Typen statt nach Namen injizieren zu lassen – allein schon, um die Abhängigkeiten zu der Spring-Konfiguration zu minimieren. Dazu kann man in Spring 2.5 die Annotation @Autowired nutzen – übrigens bei Feldern, Setter-Methoden oder Konstruktor-Parametern. Listing 2 zeigt ein Beispiel. Diese Annotation ergänzt das Autowiring-By-Type um eine genaue Spezifikation, wo etwas injiziert werden soll, was dieses Verfahren in der Praxis deutlich besser einsetzbar macht. Übrigens kann man Spring auch so umkonfigurieren, dass statt der @Autowired-Annotation eine eigene Annotation verwendet wird, was die Abhängigkeiten zu Spring im eigentlichen Code natürlich reduziert. Und es gibt neben dem Typ über Qualifiers die Möglichkeit, die zu injizierende Spring-Bean noch weiter zu spezifizieren.

Listing 2
@Component
public class Service {
    
    private CustomerDao customerDao;
    
    @Autowired
    public void setCustomerDao(CustomerDao customerDao) {
        this.customerDao = customerDao;
    }

}

Soweit also die Definition, wo Beans injiziert werden sollen. Fehlt noch eine Möglichkeit, Spring-Beans mit Annotationen zu definieren. Auch dazu hilft ein Blick in Listing 2: Mit @Component kann eine Klasse annotiert werden, sodass automatisch eine Instanz dieser Klasse unter dem übergebenen Namen als Spring-Bean zur Verfügung steht. Auch @Repository hat jetzt eine solche Semantik. Diese Annotation wurde in Spring 2.0 eingeführt, um Repositories – im Wesentlichen ist das nur eine andere Bezeichnung für DAO – zu markieren, sodass die proprietären Persistenz-Exceptions in Spring-Exceptions umgewandelt werden.

Um diese Annotationen tatsächlich auszuwerten, kann man in der XML-Konfiguration entsprechende Einstellungen vornehmen, um zum einen die JSR-250-Annotationen und die Annotationen z.B. zum Autowiring zu aktivieren. Dazu dient das Element annotation-config aus dem neu geschaffenen context-Namespace. Um @Component zu aktivieren, muss man component-scan nutzen. Dabei muss man die Packages, die nach der @Component-Annotation durchsucht werden, durch base-package einschränken, um so den Aufbau des ApplicationContext nicht unnötig zu verlangsamen. Eine Verwendung dieser XML-Konfigurationen kann man in Listing 3 sehen.

Listing 3

.
  

Neben diesen Annotationen für die Dependency-Injection-Konfiguration gibt es folgende weitere neuen Features:

  • In Spring MVC kann man mit @Controller und @RequestMapping ebenfalls nur mit Annotationen einen Controller definieren.
  • Das Spring-Test-Framework unterstützt nun neben JUnit 3 auch JUnit 4 und TestNG. Auch hier werden nun zunehmend Annotationen verwendet.
  • Die Spring JARs sind jetzt OSGi-Bundles, was das Fundament für eine Nutzung von Spring mit OSGi schafft.
  • Man kann Spring-Anwendungen nun als JCA-RARs verpacken, was eine neue Deployment-Option in einem Java-EE-Application-Server schafft. So ist es möglich, Anwendungen, die keine Benutzer-Interaktion erfordern, nicht als WAR-Datei zu deployen, die gar keine echte Web-Anwendung enthält.
  • AspecJ-Load-Time-Weaving ist jetzt durch eine einfache Spring-Konfiguration möglich. Dabei macht sich Spring 2.5 die in 2.0 neu implementierte ClassLoader-Abstraktion zu nutze, die damals für JPA eingeführt wurde. In 2.5 ist es also sehr einfach, AspectJ-Load-Time-Weaving zu verwenden, was diese Option deutlich einfacher nutzbar macht. Dabei wird der Bytecode beim Laden um Aspekte ergänzt, sodass man gegenüber dem Spring-AOP-Modell mit Proxies wesentlich effizienter ist, aber das Projekt nicht auf den AspectJ-Compiler umstellen muss. Mit dieser Option kann man beispielsweise auch @Transaction über AspectJ auswerten lassen.
  • Im Bereich JMS gibt es den neuen jms-Namespace in der XML-Konfiguration und Unterstützung für JCA-Message-Endpoints, was die Integration einiger JMS-Lösungen vereinfacht.
Fazit

Spring 2.5 bringt Änderungen vor allem in dem Bereich, der den Kern von Spring darstellt: Dependency Injection und die damit verbundene Konfiguration. Die neuen Möglichkeiten sind interessante Alternativen, die vor allem Autowiring wesentlich besser nutzbar machen. Es ist nicht nur einfach eine Einbeziehung von Annotationen, sondern stellt eine sinnvolle Erweiterung der bisherigen Spring-Konzepte dar. Gleichzeitig erhält Spring die Rückwärtskompatibilität bis auf Features wie den JDK-1.3-Support, die sowieso die Code-Basis nur unnötig belasten würden. Man kann schon auf die Neuerungen in Spring 3.0 gespannt sein!

Eberhard Wolff arbeitet als Managing Director in Deutschland für Spring Source, der Firma hinter dem Spring-Framework. Er ist regelmäßiger Autor im Java Magazin und Redner auf verschiedenen Fach-Konferenzen. Außerdem ist er Autor des ersten deutschen Buchs über Spring.
Geschrieben von
Eberhard Wolff
Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.