{"id":147,"date":"2008-05-09T07:51:00","date_gmt":"2008-05-09T07:51:00","guid":{"rendered":"http:\/\/www.tutego.de\/blog\/javainsel\/?p=147"},"modified":"2008-05-09T07:51:00","modified_gmt":"2008-05-09T07:51:00","slug":"annotationen-in-spring-2-02-5-fur-autowire-und-neue-beans","status":"publish","type":"post","link":"https:\/\/www.tutego.de\/blog\/javainsel\/2008\/05\/annotationen-in-spring-2-02-5-fur-autowire-und-neue-beans\/","title":{"rendered":"Annotationen in Spring 2.0\/2.5 f\u00fcr Autowire und neue Beans"},"content":{"rendered":"<p>Bis Spring 2.0 gab es im Wesentlichen nur eine M&#246;glichkeit, Spring-Beans zu deklarieren und Bean-Referenzen zu injizieren. Ab Spring 2.0 und besonders in Spring 2.5 gibt es einen Richtungswechsel. Statt Bean-Definitionen und Injizierungsanweisungen ausschlie&#223;lich &#252;ber XML-Dokumente zu beschreiben, kommen Annotationen hinzu. Spring nutzt zum Einen Standard-Annotationen aus Java 6 (Common Annoations) aber auch eigene.<\/p>\n<p>Nehmen wir zwei Beans an:<\/p>\n<p><\/p>\n<pre>    &lt;bean id=&quot;today&quot; class=&quot;java.util.Date&quot; \/&gt; <br \/>    &lt;bean id=&quot;calendarPrinter&quot; <br \/>      class=&quot;com.tutego.spring.annotation.CalendarPrinter&quot; \/&gt; <br \/><\/pre>\n<p><\/p>\n<p>Die Bean CalendarPrinter soll ein Datum injiziert bekommen.<\/p>\n<p><\/p>\n<pre>    public class CalendarPrinter { <br \/>      public void setDate( Date date ) \u2026 <br \/><\/pre>\n<p><\/p>\n<p>&#220;ber XML l&#228;sst sich das einfach beschreiben, doch seit Spring 2.5 veranlasst eine Annotation Spring dazu, die Verweise automatisch zu injizieren:   <br \/>@Autowired<\/p>\n<p><\/p>\n<p>@Autowired ist eine Annotation f&#252;r Methoden und Attribute, damit Spring selbst&#228;ndig den Verweis setzt: <\/p>\n<p><\/p>\n<pre>    public class CalendarPrinter { <br \/>      @Autowired <br \/>      public void setDate(@Qualifier(&quot;today&quot;) Date d) \u2026 <br \/>    } <\/pre>\n<p><\/p>\n<p>Die Annotation @Qualifier ist nur dann n&#246;tig, wenn es mehrere Beans dieses Typs gibt. (Nicht bei uns.)<\/p>\n<p><\/p>\n<p>Damit Spring &#252;berhaupt die Verkn&#252;pfung vornimmt, ist in der XML-Datei ein Hinweis zu setzen.<\/p>\n<p>Die erste M&#246;glichkeit ist:<\/p>\n<p><\/p>\n<pre>    &lt;bean class=&quot;org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor&quot;\/&gt;<\/pre>\n<p><\/p>\n<p>Eine im Allgemeinen bessere Alternative (die AutowiredAnnotationBeanPostProcessor und CommonAnnotationBeanPostProcessor zusammenfasst) ist<\/p>\n<p><\/p>\n<pre>    &lt;context:annotation-config\/&gt;<\/pre>\n<p><\/p>\n<p>Die Annotation @Autowired ist genauso g&#252;ltig bei Attributen:<\/p>\n<p><\/p>\n<pre>    public class CalendarPrinter <br \/>    { <br \/>      @Autowired Date date;<br \/><br \/>&#160;&#160;&#160;&#160;&#160; public void doIt() <br \/>&#160;&#160;&#160;&#160;&#160; { <br \/>&#160;&#160;&#160;&#160;&#160;&#160;&#160; System.out.println( date ); <br \/>&#160;&#160;&#160;&#160;&#160; } <br \/>&#160;&#160;&#160; }<\/pre>\n<p><\/p>\n<pre>&lt;beans xmlns=&quot;<a href=\"http:\/\/www.springframework.org\/schema\/beans\">http:\/\/www.springframework.org\/schema\/beans&quot;<\/a> <br \/>  xmlns:xsi=&quot;<a href=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\">http:\/\/www.w3.org\/2001\/XMLSchema-instance&quot;<\/a> <br \/>  xmlns:context=&quot;<a href=\"http:\/\/www.springframework.org\/schema\/context\">http:\/\/www.springframework.org\/schema\/context&quot;<\/a> <br \/>  xsi:schemaLocation=&quot;<a href=\"http:\/\/www.springframework.org\/schema\/beans\">http:\/\/www.springframework.org\/schema\/beans<\/a> <br \/><a href=\"http:\/\/www.springframework.org\/schema\/beans\/spring-beans-2.5.xsd\">http:\/\/www.springframework.org\/schema\/beans\/spring-beans-2.5.xsd<\/a> <br \/><a href=\"http:\/\/www.springframework.org\/schema\/context\">http:\/\/www.springframework.org\/schema\/context<\/a> <br \/><a href=\"http:\/\/www.springframework.org\/schema\/context\/spring-context-2.5.xsd\">http:\/\/www.springframework.org\/schema\/context\/spring-context-2.5.xsd&quot;<\/a>&gt; <br \/>&lt;context:annotation-config\/&gt; <br \/>&lt;bean id=&quot;today&quot; class=&quot;java.util.Date&quot; \/&gt; <br \/>&lt;bean id=&quot;calendarPrinter&quot; class=&quot;com.tutego.spring.annotation.CalendarPrinter&quot; \/&gt; <br \/>&lt;\/beans&gt;<\/pre>\n<p><\/p>\n<p>Java 6 (f&#252;r Java 5 ist ein Extra-Jar n&#246;tig) f&#252;hrt aus JSR-250 die Lebenszyklus-Annotationen @PostConstruct und @PreDestroy sowie @Resource ein.<\/p>\n<p><\/p>\n<pre>    public class CalendarPrinter { <br \/>      @PostConstruct public void initialize() { <br \/>        System.out.println( &quot;init&quot; ); <br \/>      } <br \/>      \/* @PreDestroy public void remove() { <br \/>        System.out.println( &quot;destroy&quot; ); <br \/>      } *\/ <br \/>    }<\/pre>\n<p><\/p>\n<p><strong>Beans deklarieren<\/strong><\/p>\n<p><\/p>\n<p>Die Verkn&#252;pfung ist durch Autowire automatisiert und minimiert die XML-Konfigurationsdatei.   <br \/>Zum Deklarieren von neuen Beans bringt Spring ebenfalls Annotationen mit.    <br \/>Statt in der XML-Datei zu schreiben<\/p>\n<p><\/p>\n<pre>    &lt;bean id=&quot;calendarPrinter&quot; class=&quot;com.tutego.spring.annotation.CalendarPrinter&quot; \/&gt; <\/pre>\n<p><\/p>\n<p>k\u00f6nnen wir annotieren:<\/p>\n<p><\/p>\n<pre>    @Component class CalendarPrinter<\/pre>\n<p><\/p>\n<p>Damit Spring nach annotierten Beans sucht, ist n&#246;tig:<\/p>\n<p><\/p>\n<pre>    &lt;context:component-scan base-package=&quot;com.tutego.spring&quot; \/&gt;<\/pre>\n<p><\/p>\n<p>Die Annotation @Component ist an allen Typen erlaubt und nat&#252;rlich zur Laufzeit sichtbar:<\/p>\n<p><\/p>\n<pre>    @Target(value=TYPE) <br \/>    @Retention(value=RUNTIME) <br \/>    @Documented <br \/>    public @interface Component <br \/>    { <br \/>      String value(); <br \/>    } <br \/><\/pre>\n<p><\/p>\n<p>API zur Eigenschaft: &#8222;The value may indicate a suggestion for a logical component name, to be turned into a Spring bean in case of an autodetected component.&#8220;<\/p>\n<p><\/p>\n<p>Geben wir dem CalendarPrinter den Bean-Namen &#8222; cal-printer&#8220;:<\/p>\n<p><\/p>\n<pre>    @Component(&quot;cal-printer&quot;) <br \/>    public class CalendarPrinter<\/pre>\n<p><\/p>\n<p>Aus dem ApplicationContext genommen folgt:<\/p>\n<p><\/p>\n<pre>    ApplicationContext context = <br \/>      new ClassPathXmlApplicationContext( \u2026 ); <br \/>    Object bean = context.getBean( &quot;cal-printer&quot; ); <br \/>    System.out.println( bean.getClass() ); <br \/>    \/\/ class com.tutego.spring.annotation.CalendarPrinter<\/pre>\n<p><\/p>\n<p>@Component ist eine sehr allgemeine Annotation.<\/p>\n<p><\/p>\n<p>Besser ist es, semantische Annotationen zu nutzen, die @Component erweitern. Spring liefert drei mit:<\/p>\n<p><\/p>\n<ol> <\/p>\n<li>@Target(value=TYPE) &#8230; @Component <br \/>public @interface Repository <\/li>\n<p><\/p>\n<li>@Target(value=TYPE) &#8230; @Component <br \/>public @interface Service <\/li>\n<p> <\/p>\n<li>@Target(value=TYPE) &#8230; @Component <br \/>public @interface Controller<\/li>\n<p><\/ol>\n","protected":false},"excerpt":{"rendered":"<p>Bis Spring 2.0 gab es im Wesentlichen nur eine M&#246;glichkeit, Spring-Beans zu deklarieren und Bean-Referenzen zu injizieren. Ab Spring 2.0 und besonders in Spring 2.5 gibt es einen Richtungswechsel. Statt Bean-Definitionen und Injizierungsanweisungen ausschlie&#223;lich &#252;ber XML-Dokumente zu beschreiben, kommen Annotationen hinzu. Spring nutzt zum Einen Standard-Annotationen aus Java 6 (Common Annoations) aber auch eigene. Nehmen [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":"","_links_to":"","_links_to_target":""},"categories":[3],"tags":[],"class_list":["post-147","post","type-post","status-publish","format-standard","hentry","category-spring"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/147","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/comments?post=147"}],"version-history":[{"count":0,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/147\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/media?parent=147"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/categories?post=147"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/tags?post=147"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}