Communardo Software GmbH, Kleiststraße 10 a, D-01129 Dresden
0800 1 255 255

Annotaion in Spring 3.0

Annotations erfreuen sich immer grö­ße­rer Beliebtheit. Egal wo man hin­sieht, fast alles kann man mitt­ler­weise damit machen (Caching, Persistenz, dekla­ra­tive Services in OSGi, …). Seit Spring 3.0 gibt es nun auch im Springframework Annotations.

Ohne Annotations

Als Beispiel soll ein ein­fa­cher HalloWellt-Controller die­nen. Klassen, die bei SpringMVC als Controller-Klassen fun­gie­ren, müs­sen das Interface Controller imple­men­tie­ren oder ein­fach von einer bestehen­den Implementierungsklasse ablei­ten (z.B. SimpleFormController).

<bean id="urlMapping" class="org.springframework…SimpleUrlHandlerMapping">
  <property>
    <props>
      <prop key="/hallo">halloController</prop>
    </props>
  </property>
</bean>
<bean name="halloController" class="de.communardo.spring.mvc.HalloWeltController"/>

Über das URL-Mapping wer­den Conroller-Klassen unter einer URL regis­triert. Dieses wird durch das DispatcherServlet bei ein­ge­hen­den Requests aus­ge­wer­tet. In unse­rem Beispiel wird bei /hallo der HalloControllerauf­ge­ru­fen.

Mit Annotations

Mit Spring 3.0 wird durch Einführung von Annotations vie­les ein­fa­cher. Zum einen fällt das Implementieren oder Ableiten von Controller-Interfaces oder Klassen weg. Jede Klasse kann ein Controller sein. Entscheidend ist die Annotation @Controller.

package de.communardo.spring.mvc;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class HalloWeltController {

  @RequestMapping(value = "/hallo")
  public @ResponseBody String helloWorld() {
    return "Hallo Welt";
  }
}

Über die Annotation @RequestMapping wer­den URL-Pfade auf Methoden gemappt. Über @ResponseBody wird der Rückgabewert String (="Hallo Welt") auf Response.out geschrie­ben.

Damit Spring die Klassen mit Annotation (er)kennt, müs­sen fol­gende 2 Zeilen in der Spring-XML-Konfiguration auf­ge­nom­men wer­den.

<mvc:annotation-driven />
<context:component-scan base-package= " de.communardo.spring.mvc" />

Dependency Injection

Eines der zen­tra­len Themen bei Spring ist Dependency Injection – Abhängigkeiten zwi­schen Komponenten wer­den durch den Container per Setter inji­ziert. Bei Klassen, die per Spring-XML erzeugt wer­den, gibt es da eine spe­zi­elle Notation für das Injizieren von benö­tig­ten Komponenten.

<bean name="halloController">
  <property name="serviceLocater" ref="serviceLocater"/>
</bean>

<bean   class="de.communardo.spring.service.ServiceLocaterImpl"/>

Für Klassen, die per Annotation erzeugt wer­den, gibt es dafür ent­spre­chende Annotation. Über die Annotation @Autowired wer­den per Setter eine Implementierung des Interfaces ServiceLocater inji­ziert.

package de.communardo.spring.mvc;

import org.springframework.beans.factory.annotation.Autowired;
import de.communardo.spring.service.ServiceLocater;

public class HalloWeltController {
  private ServiceLocater serviceLocater;

  @Autowired
  public void setServiceLocater(ServiceLocater serviceLocater) {
    this.serviceLocater = serviceLocater;
  }
}

FormController

Für das Formularhandling kom­men wei­tere Annotations hinzu. @ModelAttribute defi­niert die Formbean, die an das Formular gebun­den wird. Im Beispiel ist das userForm, die im Template per <form:form modelAttribute="userForm"> benutzt wird.

import org.springframework.web.bind.annotation.SessionAttributes;
import org.springframework.web.bind.support.SessionStatus;

import de.communardo.spring.domain.User;
import de.communardo.spring.service.UserService;

@Controller
@RequestMapping("/editUser")
@SessionAttributes("userForm")
public class UserController {

  private static final String VIEW_TEMPLATE_USER = "user";
  private UserService userService;

  @RequestMapping(method = RequestMethod.POST)
  public String onSubmit(@ModelAttribute("userForm") UserForm userForm, BindingResult result, SessionStatus status) {

    new UserValidator().validate(userForm, result);
    if (result.hasErrors()) {
      return VIEW_TEMPLATE_USER;
    }
    userService.storeUser(new User(userForm.getFirstName(), userForm.getLastName(), userForm.getEmail()));
    return VIEW_TEMPLATE_USER;
  }

  @RequestMapping(method = RequestMethod.GET)
  public String setupForm(Model model) {
    UserForm userForm = new UserForm();
    model.addAttribute("userForm", userForm);
    return VIEW_TEMPLATE_USER;
  }

  @Autowired
  public void setUserService(UserService userService) {
    this.userService = userService;
  }
}

Related Posts

Pin It on Pinterest