从Spring 3.0开始,Spring开始支持JSR-330标准的注解(依赖注入)。这些注解和Spring注解扫描的方式是一直的,开发者只需要在classpath中配置相关的jar包即可。
如果开发者使用Maven来管理项目的话,javax.injectartifact在Maven仓库中是可用的(http://repo1.maven.org/maven2/javax/inject/javax.inject/1/)。开发者只需要在pom中引用这个依赖即可。
<dependency> <groupId>javax.inject</groupId> <artifactId>javax.inject</artifactId> <version>1</version> </dependency>
通过@Inject和@Named进行依赖注入
JSR-330中,@javax.inject.Inject和Spring中的@Autowired的职责相同
import javax.inject.Inject; public class SimpleMovieLister { private MovieFinder movieFinder; @Inject public void setMovieFinder(MovieFinder movieFinder) { this.movieFinder = movieFinder; } public void listMovies() { this.movieFinder.findMovies(...); ... } }
和@Autowired一致的是,开发者可以使用@Inject在实例变量,方法以及构造参数级别来使用依赖注入。而且,开发者可以将注入声明为Provider,通过Provider.get()来请求那些短作用域或者延迟初始化的Bean。比如如下的例子。
import javax.inject.Inject; import javax.inject.Provider; public class SimpleMovieLister { private Provider<MovieFinder> movieFinder; public void listMovies() { this.movieFinder.get().findMovies(...); ... } }
如果开发者希望来通过名字来限定注入的Bean,可以使用@Named注解
import javax.inject.Inject; import javax.inject.Named; public class SimpleMovieLister { private MovieFinder movieFinder; @Inject public void setMovieFinder(@Named("main") MovieFinder movieFinder) { this.movieFinder = movieFinder; } // ... }