{"id":81,"date":"2012-06-27T15:53:20","date_gmt":"2012-06-27T13:53:20","guid":{"rendered":"http:\/\/marko-seifert.de\/blog\/?p=81"},"modified":"2020-01-15T12:23:37","modified_gmt":"2020-01-15T10:23:37","slug":"annotaion-in-spring-3-0","status":"publish","type":"post","link":"http:\/\/marko-seifert.de\/blog\/?p=81","title":{"rendered":"Annotaion in Spring 3.0"},"content":{"rendered":"<div>Annotations erfreuen sich immer gr\u00f6\u00dferer Beliebtheit. Egal wo man hinsieht, fast alles kann man mittlerweise damit machen (Caching, Persistenz, deklarative Services in OSGi, \u2026). Seit Spring 3.0 gibt es nun auch im Springframework Annotations.<\/div>\n<div><!--more--><\/div>\n<h2>Ohne Annotations<\/h2>\n<p>Als Beispiel soll ein einfacher HalloWellt-Controller dienen. Klassen, die bei SpringMVC als Controller-Klassen fungieren, m\u00fcssen das Interface Controller implementieren oder einfach von einer bestehenden Implementierungsklasse ableiten (z.B. SimpleFormController).<\/p>\n<pre>&lt;bean id=\"urlMapping\"&gt;\r\n  &lt;property&gt;\r\n    &lt;props&gt;\r\n      &lt;prop key=\"\/hallo\"&gt;halloController&lt;\/prop&gt;\r\n    &lt;\/props&gt;\r\n  &lt;\/property&gt;\r\n&lt;\/bean&gt;\r\n&lt;bean name=\"halloController\"\/&gt;<\/pre>\n<p>\u00dcber das URL-Mapping werden Conroller-Klassen unter einer URL registriert. Dieses wird durch das <code>DispatcherServlet<\/code> bei eingehenden Requests ausgewertet. In unserem Beispiel wird bei <code>\/hallo<\/code> der <code>HalloController<\/code>aufgerufen.<\/p>\n<h2>Mit Annotations<\/h2>\n<p>Mit Spring 3.0 wird durch Einf\u00fchrung von Annotations vieles einfacher. Zum einen f\u00e4llt das Implementieren oder Ableiten von Controller-Interfaces oder Klassen weg. Jede Klasse kann ein Controller sein. Entscheidend ist die Annotation <code><strong>@Controller<\/strong><\/code>.<\/p>\n<pre>package de.communardo.spring.mvc;\r\n\r\nimport org.springframework.stereotype.Controller;\r\nimport org.springframework.web.bind.annotation.RequestMapping;\r\nimport org.springframework.web.bind.annotation.ResponseBody;\r\nimport org.springframework.web.servlet.ModelAndView;\r\n\r\n<strong>@Controller<\/strong>\r\npublic class HalloWeltController {\r\n\r\n  <strong>@RequestMapping<\/strong>(value = \"\/hallo\")\r\n  public <strong>@ResponseBody<\/strong> String helloWorld() {\r\n    return \"Hallo Welt\";\r\n  }\r\n}<\/pre>\n<p>\u00dcber die Annotation <code><strong>@RequestMapping<\/strong><\/code> werden URL-Pfade auf Methoden gemappt. \u00dcber <code><strong>@ResponseBody<\/strong><\/code> wird der R\u00fcckgabewert String (=<code>\"Hallo Welt\"<\/code>) auf <code>Response.out<\/code> geschrieben.<\/p>\n<p>Damit Spring die Klassen mit Annotation (er)kennt, m\u00fcssen folgende 2 Zeilen in der Spring-XML-Konfiguration aufgenommen werden.<\/p>\n<pre>&lt;mvc:annotation-driven \/&gt;\r\n&lt;context:component-scan base-package= \" de.communardo.spring.mvc\" \/&gt;<\/pre>\n<h2>Dependency Injection<\/h2>\n<p>Eines der zentralen Themen bei Spring ist Dependency Injection \u2013 Abh\u00e4ngigkeiten zwischen Komponenten werden durch den Container per Setter injiziert. Bei Klassen, die per Spring-XML erzeugt werden, gibt es da eine spezielle Notation f\u00fcr das Injizieren von ben\u00f6tigten Komponenten.<\/p>\n<pre>&lt;bean name=\"halloController\"&gt;\r\n  &lt;property name=\"serviceLocater\" ref=\"serviceLocater\"\/&gt;\r\n&lt;\/bean&gt;\r\n\r\n&lt;bean\u00a0\u00a0\/&gt;<\/pre>\n<p>F\u00fcr Klassen, die per Annotation erzeugt werden, gibt es daf\u00fcr entsprechende Annotation. \u00dcber die Annotation <strong><code>@Autowired<\/code><\/strong> werden per Setter eine Implementierung des Interfaces ServiceLocater injiziert.<\/p>\n<pre>package de.communardo.spring.mvc;\r\n\r\nimport org.springframework.beans.factory.annotation.Autowired;\r\nimport de.communardo.spring.service.ServiceLocater;\r\n\r\npublic class HalloWeltController {\r\n  private ServiceLocater serviceLocater;\r\n\r\n  <strong>@Autowired<\/strong>\r\n  public void setServiceLocater(ServiceLocater serviceLocater) {\r\n    this.serviceLocater = serviceLocater;\r\n  }\r\n}<\/pre>\n<h3>FormController<\/h3>\n<p>F\u00fcr das Formularhandling kommen weitere Annotations hinzu. @ModelAttribute definiert die Formbean, die an das Formular gebunden wird. Im Beispiel ist das <code>userForm<\/code>, die im Template per <code>&lt;form:form modelAttribute=\"userForm\"&gt;<\/code> benutzt wird.<\/p>\n<pre>import org.springframework.web.bind.annotation.SessionAttributes;\r\nimport org.springframework.web.bind.support.SessionStatus;\r\n\r\nimport de.communardo.spring.domain.User;\r\nimport de.communardo.spring.service.UserService;\r\n\r\n<strong>@Controller<\/strong>\r\n<strong>@RequestMapping<\/strong>(\"\/editUser\")\r\n<strong>@SessionAttributes<\/strong>(\"userForm\")\r\npublic class UserController {\r\n\r\n  private static final String VIEW_TEMPLATE_USER = \"user\";\r\n  private UserService userService;\r\n\r\n  <strong>@RequestMapping<\/strong>(method = RequestMethod.POST)\r\n  public String onSubmit(<strong>@ModelAttribute<\/strong>(\"userForm\") UserForm userForm, BindingResult result, SessionStatus status) {\r\n\r\n    new UserValidator().validate(userForm, result);\r\n    if (result.hasErrors()) {\r\n      return VIEW_TEMPLATE_USER;\r\n    }\r\n    userService.storeUser(new User(userForm.getFirstName(), userForm.getLastName(), userForm.getEmail()));\r\n    return VIEW_TEMPLATE_USER;\r\n  }\r\n\r\n  <strong>@RequestMapping<\/strong>(method = RequestMethod.GET)\r\n  public String setupForm(Model model) {\r\n    UserForm userForm = new UserForm();\r\n    model.addAttribute(\"userForm\", userForm);\r\n    return VIEW_TEMPLATE_USER;\r\n  }\r\n\r\n  <strong>@Autowired<\/strong>\r\n  public void setUserService(UserService userService) {\r\n    this.userService = userService;\r\n  }\r\n}<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Annotations erfreuen sich immer gr\u00f6\u00dferer Beliebtheit. Egal wo man hinsieht, fast alles kann man mittlerweise damit machen (Caching, Persistenz, deklarative Services in OSGi, \u2026). Seit Spring 3.0 gibt es nun auch im Springframework Annotations.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[11,4,10],"tags":[22,23,6,24,25,26],"class_list":["post-81","post","type-post","status-publish","format-standard","hentry","category-development","category-java","category-softwarearchitektur","tag-annotation","tag-dependency-injection","tag-java","tag-mvc","tag-spring","tag-springframework"],"_links":{"self":[{"href":"http:\/\/marko-seifert.de\/blog\/index.php?rest_route=\/wp\/v2\/posts\/81","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/marko-seifert.de\/blog\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/marko-seifert.de\/blog\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/marko-seifert.de\/blog\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/marko-seifert.de\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=81"}],"version-history":[{"count":3,"href":"http:\/\/marko-seifert.de\/blog\/index.php?rest_route=\/wp\/v2\/posts\/81\/revisions"}],"predecessor-version":[{"id":338,"href":"http:\/\/marko-seifert.de\/blog\/index.php?rest_route=\/wp\/v2\/posts\/81\/revisions\/338"}],"wp:attachment":[{"href":"http:\/\/marko-seifert.de\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=81"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/marko-seifert.de\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=81"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/marko-seifert.de\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=81"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}