IoC容器11——使用JSR 330 標準註解

使用JSR 330 標準註解

從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>

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()的調用對較短做用域的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;
    }

    // ...
}

2 @Named和@ManageBean:@Component註解的標準等價形式

做爲@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

3 標準JSR-330註解的侷限

當使用標準註解時,重要的是要知道一些重要的功能是不可用的,以下表所述:作用域

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方法結合使用。
相關文章
相關標籤/搜索