Using JSR 330 Standard Annotations

##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;
    }

    // ...
}
  • 能夠同@Component同樣定義掃描路徑
@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方法一塊兒使用.

相關文章
相關標籤/搜索