The IoC Container 1.11
2019-02-24 本文已影响0人
小鲍比大爷
1.11. Using JSR 330 Standard Annotations
Spring支持JSR 330的注解,如果想使用,需要引入下面的包:
<dependency>
<groupId>javax.inject</groupId>
<artifactId>javax.inject</artifactId>
<version>1</version>
</dependency>
1.11.1. Dependency Injection with @Inject and @Named
@javax.inject.Inject用来替换@Autowired:
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(...);
...
}
}
@Inject can also be used with java.util.Optional or @Nullable:
public class SimpleMovieLister {
@Inject
public void setMovieFinder(Optional<MovieFinder> movieFinder) {
...
}
}
public class SimpleMovieLister {
@Inject
public void setMovieFinder(@Nullable MovieFinder movieFinder) {
...
}
}
@Named可以用来指定bean name,Spring就会按照bean的名称进行查找:
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;
}
// ...
}
1.11.2. @Named and @ManagedBean: Standard Equivalents to the @Component Annotation
可以用@Named和@ManagedBean代替@Component:
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;
}
// ...
}
@Named也可以和@Component一样不指定参数:
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 {
...
}