<para>Starting from Spring 3.0, Spring offers support for JSR-330 standard annotations (Dependency Injection).
<para>Starting with Spring 3.0, Spring offers support for JSR-330 standard annotations (Dependency Injection).
Those annotations are scanned in the same way as the Spring annotations. You just need to have the relevant jars in your classpath.
</para>
<note>
If you are using Maven, the <interfacename>javax.inject</interfacename> artifact is available on the standard Maven repository (<ulinkurl="http://repo1.maven.org/maven2/javax/inject/javax.inject/1/">http://repo1.maven.org/maven2/javax/inject/javax.inject/1/</ulink>). You can add the following dependency to your file pom.xml:
<programlistinglanguage="xml">
<dependency>
<groupId>javax.inject</groupId>
<artifactId>javax.inject</artifactId>
<version>1</version>
</dependency>
</programlisting>
<para>
If you are using Maven, the <interfacename>javax.inject</interfacename> artifact is available
As for <interfacename>@Autowired</interfacename>, it is possible to use <interfacename>@Inject</interfacename> at the class-level, field-level, method-level and constructor-argument level.
<para>As with <interfacename>@Autowired</interfacename>, it is possible to use <interfacename>@Inject</interfacename>
at the class-level, field-level, method-level and constructor-argument level.
If you would like to use a qualified name for the dependency that should be injected, you should use the <interfacename>@Named</interfacename> annotation as follows:
<programlistinglanguage="java">
import javax.inject.Inject;
import javax.inject.Named;
public class SimpleMovieLister {
If you would like to use a qualified name for the dependency that should be injected,
you should use the <interfacename>@Named</interfacename> annotation as follows:
It is very common to use <interfacename>@Component</interfacename> without specifying a name for the component. <interfacename>@Named</interfacename> can be used in a similar fashion:
<programlistinglanguage="java">
import javax.inject.Inject;
import javax.inject.Named;
It is very common to use <interfacename>@Component</interfacename> without
specifying a name for the component. <interfacename>@Named</interfacename>
@ -93,39 +104,38 @@ It is very common to use <interfacename>@Component</interfacename> without speci
@@ -93,39 +104,38 @@ It is very common to use <interfacename>@Component</interfacename> without speci
this.movieFinder = movieFinder;
}
<lineannotation>// ...</lineannotation>
}
</programlisting>
}</programlisting>
</para>
<para>
When using <interfacename>@Named</interfacename>, it is possible to use component-scanning in the exact same way as when using Spring annotations:
<title>Limitations of the standard approach</title>
<para>When working with standard annotations, it is important to know that some significant features are not available as shown in the table below:</para>
<para>When working with standard annotations, it is important to know that
some significant features are not available as shown in the table below:</para>
<para><tableid="annotations-comparison">
<title>Spring annotations vs standard annotations</title>
<title>Spring annotations vs. standard annotations</title>
@ -133,58 +143,51 @@ When using <interfacename>@Named</interfacename>, it is possible to use componen
@@ -133,58 +143,51 @@ When using <interfacename>@Named</interfacename>, it is possible to use componen
<tbody>
<row>
<entry>@Autowired</entry>
<entry>@Inject</entry>
<entry>@Inject has no 'required' attribute</entry>
</row>
<row>
<entry>@Component</entry>
<entry>@Named</entry>
<entry></entry>
<entry>—</entry>
</row>
<row>
<entry>@Scope("singleton")</entry>
<entry>@Singleton</entry>
<entry>
<para>
jsr-330 default scope is like Spring's <interfacename>prototype</interfacename>. However, in order to keep it consistent with Spring's general defaults, a jsr-330 bean declared in the Spring container is a <interfacename>singleton</interfacename> by default. In order to use another scope than <interfacename>singleton</interfacename>, you should use Spring's <interfacename>@Scope</interfacename> annotation.
The JSR-330 default scope is like Spring's <interfacename>prototype</interfacename>.
However, in order to keep it consistent with Spring's general defaults,
a JSR-330 bean declared in the Spring container is a
<interfacename>singleton</interfacename> by default. In order to use a
scope other than <interfacename>singleton</interfacename>, you should use Spring's
<interfacename>@Scope</interfacename> annotation.
</para>
<para>
<interfacename>javax.inject</interfacename> also provides a <ulinkurl="http://download.oracle.com/javaee/6/api/javax/inject/Scope.html">@Scope</ulink> annotation. Nevertheless, this one only aims to be used for creating your own annotations.
<interfacename>javax.inject</interfacename> also provides a
Nevertheless, this one is only intended to be used for creating your own annotations.
</para>
</entry>
</row>
<row>
<entry>@Qualifier</entry>
<entry>@Named</entry>
<entry></entry>
<entry>—</entry>
</row>
<row>
<entry>@Value</entry>
<entry>-</entry>
<entry>—</entry>
<entry>no equivalent</entry>
</row>
<row>
<entry>@Required</entry>
<entry>-</entry>
<entry>—</entry>
<entry>no equivalent</entry>
</row>
<row>
<entry>@Lazy</entry>
<entry>-</entry>
<entry>—</entry>
<entry>no equivalent</entry>
</row>
</tbody>
@ -193,4 +196,5 @@ When using <interfacename>@Named</interfacename>, it is possible to use componen
@@ -193,4 +196,5 @@ When using <interfacename>@Named</interfacename>, it is possible to use componen