从Spring 3.0开始,提供对JSR 330标准注解(依赖注入)的支持。这些注解与Spring注解以相同的方式进行扫描。须要添加相关的jar文件到类路径。java
若是使用Maven,那么javax.inject artifact 在标准Maven存储库中可用http://repo1.maven.org/maven2/javax/inject/javax.inject/1/。能够添加以下依赖到pom.xml文件:maven
<dependency> <groupId>javax.inject</groupId> <artifactId>javax.inject</artifactId> <version>1</version> </dependency>
做为@Autowired的替代,@javax.inject.Inject使用以下:ide
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进行按需访问货对其它bean进行延迟访问。下面的例子是上面示例的变体:函数
import javax.inject.Inject; import javax.inject.Provider; public class SimpleMovieLister { private Provider<MovieFinder> movieFinder; @Inject public void setMovieFinder(Provider<MovieFinder> movieFinder) { this.movieFinder = movieFinder; } public void listMovies() { this.movieFinder.get().findMovies(...); ... } }
若是对将要注入的依赖使用限定名,能够像下面同样使用@Name注解:ui
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; } // ... }
做为@Component的替代,@javax.inject.Named和javax.annotation.ManagedBean能够以下使用:this
import javax.inject.Inject; import javax.inject.Named; @Named("movieListener") // @ManagedBean("movieListener") could be used as well public class SimpleMovieLister { private MovieFinder movieFinder; @Inject public void setMovieFinder(MovieFinder movieFinder) { this.movieFinder = movieFinder; } // ... }
在使用@Component注解时不指定组件的名字是常见的。@Named也能够以相似的方式使用:prototype
import javax.inject.Inject; import javax.inject.Named; @Named public class SimpleMovieLister { private MovieFinder movieFinder; @Inject public void setMovieFinder(MovieFinder movieFinder) { this.movieFinder = movieFinder; } // ... }
当使用@Name或@ManagedBean时,能够用与使用Spring注解彻底相同的方式进行组件扫描:code
@Configuration @ComponentScan(basePackages = "org.example") public class AppConfig { ... }
与@Component相反,JSR-330的@Name和JSR-250的@ManagedBean不可组合。请使用Spring的原型模型来构建自定义的组件注解。xml
当使用标准注解时,重要的是要知道一些重要的功能是不可用的,以下表所述:作用域
Spring | javax.inject.* | javax.inject 限制/ 注释 |
---|---|---|
@Autowired | @Inject | @Inject 没有 'required' 属性;能够使用Java 8 的Optional替代 |
@Component | @Named/@ManagedBean | JSR-330没有提供组合模型,只是一种识别命名组件的方法 |
@Scope( " singleton " ) | @Singleton | JSR-330 默认做用域和 Spring 的 prototype类似。可是,要保持和 Spring的默认值一致,在 Spring 容器中 JSR-330 的 bean 声明默认是 singleton 的。要使用另外的范围,你应该使用 Spring 的@Scope 注解。javax.inject也提供@Scope 注解。不过这仅仅用于建立你本身的注解。 |
@Qualifier | @Qualifier/@Named | javax.inject.Qualifier仅仅是构建自定义限定值的元注解。具体的字符串限定值(相似带值的Spring@Qualifier注解)能够经过javax.inject.Named关联 |
@Value | - | 没有等价形式 |
@Required | - | 没有等价形式 |
@Lazy | - | 没有等价形式 |
ObjectFactory | Provider | javax.inject.Provier是Spring的ObjectFactory的直接替代方法,只须要一个较短的get()方法名称。它也能够与Spring的@Autowired或非注解知识的构造函数和setter方法结合使用。 |