##7.11 Using JSR 330 Standard Annotations 从spring3.0开始,spring提供对JSR-330标准注解的支持.这些注解同spring注解的扫描方式相同.你只需将在你的类路径里添加相关的jar包.
如果你使用Maven,那么java.inject产品可以在标准的Maven仓库获得.你可以将以下依赖加到你的pom.xml文件里:
<dependency>
<groupId>javax.inject</groupId>
<artifactId>javax.inject</artifactId>
<version>1</version>
</dependency>
###7.11.1 使用@Inject和@Named进行依赖注入 相比@Autowired,@javax.inject.Inject可以如下使用:
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.一个变种如下:
import javax.inject.Inject;
import javax.inject.Provider;
public class SimpleMovieLister {
private Provider<MovieFinder> movieFinder;
public void listMovies() {
this.movieFinder.get().findMovies(...);
...
}
}
如果你习惯使用匹配符来约束你要注入的依赖,你应该如下使用@Named注解:
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可以如下使用:
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可以在相似的情景下使用:
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作用域.这个注解只用于创建自己的注解时使用.
@Qualifier-->@Qualifier/@Named javax.inject.Qualfier是一个创建自定义匹配符的元注解.它可以和javax.inject.Named协同来组合字符串匹配符
@Value-->无 @Required -->无 @Lazy-->无 @ObjectFactory-->Provider javax.inject.Provider是spring的ObjectFactory的替代,它有一个get()方法.它可以同spring的Autowired注解或者没有注解的构造器或set方法一起使用.