##7.11 Using JSR 330 Standard Annotations 從spring3.0開始,spring提供對JSR-330標準註解的支持.這些註解同spring註解的掃描方式相同.你只需將在你的類路徑裏添加相關的jar包.java
若是你使用Maven,那麼java.inject產品能夠在標準的Maven倉庫得到.你能夠將如下依賴加到你的pom.xml文件裏:spring
<dependency> <groupId>javax.inject</groupId> <artifactId>javax.inject</artifactId> <version>1</version> </dependency>
###7.11.1 使用@Inject和@Named進行依賴注入 相比@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()方法的調用,按需在更小的做用域獲得beans或者懶加載獲取其餘bean.一個變種以下:ui
import javax.inject.Inject; import javax.inject.Provider; public class SimpleMovieLister { private Provider<MovieFinder> movieFinder; public void listMovies() { this.movieFinder.get().findMovies(...); ... } }
若是你習慣使用匹配符來約束你要注入的依賴,你應該以下使用@Named註解:this
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; } // ... }
###7.11.2 @Named And @ManagedBean :standard equivalents to the @Component annotation (@componet 註解的等價註解) 同@Component相比,@javax.inject.Named或javax.annotation.ManagedBean能夠以下使用:code
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能夠在類似的情景下使用:xml
import javax.inject.Inject; import javax.inject.Named; @Named public class SimpleMovieLister { private MovieFinder movieFinder; @Inject public void setMovieFinder(MovieFinder movieFinder) { this.movieFinder = movieFinder; } // ... }
@Configuration @ComponentScan(basePackages = "org.example") public class AppConfig { ... }
注:與@Component相比,JSR-330的Named註解和JSR-250的ManagedBean註解沒法被組合.你可使用spring的模板類型模式來建立自定義組件註解. ###7.11.3 JSR-330標準註解的侷限性 當你使用標準註解時,瞭解下面列表中展現的它們局詳性是很是重要的:作用域
@Autowired -->@Inject @Inject沒有"required"屬性,但可使用java 8的Optional來替代;字符串
@Component-->@Named/@ManagedBean JSR-330沒法提供組合模型的功能,只是一種標誌名稱組件的方式 @Scope("singleton")-->@Singleton JSR-330默認的做用域同spring的protype相同.可是,爲了同spring的基本默認保持一致,在spring容器裏的jsr-330的bean默認都是單例.爲了使用非單例的做用域,你可使用spring的@Scope做用域.這個註解只用於建立本身的註解時使用.get
@Qualifier-->@Qualifier/@Named javax.inject.Qualfier是一個建立自定義匹配符的元註解.它能夠和javax.inject.Named協同來組合字符串匹配符
@Value-->無 @Required -->無 @Lazy-->無 @ObjectFactory-->Provider javax.inject.Provider是spring的ObjectFactory的替代,它有一個get()方法.它能夠同spring的Autowired註解或者沒有註解的構造器或set方法一塊兒使用.