你可以使用 @javax.inject.Namedjavax.annotation.ManagedBean来代替 @Component,如下例所示:

    1. import javax.inject.Inject;
    2. import javax.inject.Named;
    3. @Named("movieListener") // @ManagedBean("movieListener") 也可以使用这种方式
    4. public class SimpleMovieLister {
    5. private MovieFinder movieFinder;
    6. @Inject
    7. public void setMovieFinder(MovieFinder movieFinder) {
    8. this.movieFinder = movieFinder;
    9. }
    10. // ...
    11. }

    使用 @Component而不指定组件的名称是很常见的。@Named可以以类似的方式使用,如下面的例子所示:

    1. import javax.inject.Inject;
    2. import javax.inject.Named;
    3. @Named
    4. public class SimpleMovieLister {
    5. private MovieFinder movieFinder;
    6. @Inject
    7. public void setMovieFinder(MovieFinder movieFinder) {
    8. this.movieFinder = movieFinder;
    9. }
    10. // ...
    11. }

    当你使用 @Named@ManagedBean时,你可以以与使用 Spring 注解完全相同的方式使用组件扫描,正如下面的例子所示:

    1. @Configuration
    2. @ComponentScan(basePackages = "org.example")
    3. public class AppConfig {
    4. // ...
    5. }

    :::info 与 @Component 相比,JSR-330 的 @Named 和 JSR-250 的 ManagedBean 注解是不可组合的。你应该使用 Spring 的原型模型来构建自定义组件注解。 :::