從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方法結合使用。 |