Spring5使用JSR 330標準註解的方法
之前的文章我們有講過,從Spring3.0之後,除瞭Spring自帶的註解,我們也可以使用JSR330的標準註解。不過需要加入maven依賴如下:
<dependencies> <dependency> <groupId>javax.inject</groupId> <artifactId>javax.inject</artifactId> <version>1</version> </dependency> </dependencies>
下面是標準註解和Spring註解的區別:
Spring | javax.inject.* | javax.inject限制/描述 |
---|---|---|
@Autowired | @Inject | @Inject沒有required屬性,可以使用Java8的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隻是一個用來構建自定義Qualifier的元註解。具體的字符串限定符(如帶value的Spring的@Qualifier)可以通過javax.inject.Named關聯。 |
@Value | – | 沒有相同功能 |
@Required | – | 沒有相同功能 |
@Lazy | – | 沒有相同功能 |
ObjectFactory | Provider | javax.inject.Provider是Spring的ObjectFactory的直接替代品,它隻使用瞭較短的get()方法名。它還可以與Spring的@Autowired結合使用,或者與無註解的構造函數和setter方法結合使用。 |
下面我們分別來介紹。
@Inject 和 @Named
@Inject可以用來替換@Autowired:
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。下面是Provider的例子:
public class SimpleMovieProviderLister { private Provider<MovieFinder> movieFinder; @Inject public void setMovieFinder(Provider<MovieFinder> movieFinder) { this.movieFinder = movieFinder; } public void listMovies() { this.movieFinder.get().findMovies(); } }
可以使用@Named註解來為註入的參數限定名字:
@Inject public void setMovieFinderNamed(@Named("main") MovieFinder movieFinder) { this.movieFinder = movieFinder; }
與@Autowired一樣,@Inject也可以與java.util.Optional或@Nullable一起使用。下面是例子:
@Inject public void setMovieFinder(Optional<MovieFinder> movieFinder) { } @Inject public void setMovieFinder(@Nullable MovieFinder movieFinder) { }
@Named 和 @ManagedBean
除瞭使用@Component,你也可以使用@javax.inject.Named 或者 javax.annotation.ManagedBean,如下:
@Named("movieListener") // @ManagedBean("movieListener") could be used as well public class SimpleMovieNamedLister { private MovieFinder movieFinder; @Inject public void setMovieFinder(MovieFinder movieFinder) { this.movieFinder = movieFinder; } }
到此這篇關於Spring5使用JSR 330標準註解的方法的文章就介紹到這瞭,更多相關Spring5 JSR 330註解內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- 淺談spring DI 依賴註入方式和區別
- spring IOC控制反轉原理詳解
- 深入分析@Resource和@Autowired註解區別
- Java經典面試題匯總:Spring
- Spring IOC簡單理解及創建對象的方式