2.11 Spring Framework 5.x 之JSR-330 javax.inject 标准注解

1.11 使用JSR 330标准注解

从Spring 3.0开始,Spring提供对JSR-330标准注解(依赖注入)的支持。这些注解的扫描方式与Spring注解相同。要使用它们,您需要在类路径中包含相关的jar。

如果您使用Maven,则javax.inject工件可在标准Maven存储库中找到( http://repo1.maven.org/maven2/javax/inject/javax.inject/1/)。您可以将以下依赖项添加到文件pom.xml:

<dependency>
    <groupId>javax.inject</groupId>
    <artifactId>javax.inject</artifactId>
    <version>1</version>
</dependency>

1.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在字段级别,方法级别和构造函数 - 参数级别使用。此外,您可以将注入点声明为a Provider,允许按需访问较短范围的bean或通过Provider.get()调用对其他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(...);
        ...
    }
}

如果要为应注入的依赖项使用限定名称,则应使用@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;
    }

    // ...
}

与之一样@Autowired,@Inject也可以与java.util.Optional或 一起使用@Nullable。这在这里更适用,因为@Inject没有required属性。以下一对示例显示了如何使用@Inject和 @Nullable:

public class SimpleMovieLister {

    @Inject
    public void setMovieFinder(Optional<MovieFinder> movieFinder) {
        ...
    }
}
public class SimpleMovieLister {

    @Inject
    public void setMovieFinder(@Nullable MovieFinder movieFinder) {
        ...
    }
}

1.11.2 @Named和@ManagedBean:@Component注释的标准等价物

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

    // ...
}

使用@Named或时@ManagedBean,可以使用与使用Spring注释时完全相同的方式使用组件扫描,如以下示例所示:

@Configuration
@ComponentScan(basePackages = "org.example")
public class AppConfig  {
    ...
}

与此相反@Component,JSR-330 @Named和JSR-250 ManagedBean 注释不可组合。您应该使用Spring的构造型模型来构建自定义组件注释。

1.11.3 JSR-330标准注释的局限性

使用标准注解时,您应该知道某些重要功能不可用,如下表所示:
表6. Spring组件模型元素与JSR-330变体

Spring javax.inject.* javax.inject restrictions / comments
@Autowired @Inject @Inject没有“必需”属性。可以与Java 8一起使用Optional。
@Component @Named / @ManagedBean JSR-330不提供可组合模型,只是一种识别命名组件的方法。
@Scope(“singleton”) @Singleton JSR-330默认范围就像Spring一样prototype。但是,为了使其与Spring的一般默认值保持一致,singleton默认情况下在Spring容器中声明的JSR-330 bean是一个默认值。为了使用除以外的范围singleton,您应该使用Spring的@Scope注释。javax.inject还提供了 @Scope注释。然而,这个仅用于创建自己的注释。
@Qualifier @Qualifier / @Named javax.inject.Qualifier只是构建自定义限定符的元注释。具体String限定符(如@Qualifier带有值的Spring )可以通过关联javax.inject.Named。
@Value - 没有等价物
@Required - 没有等价物
@Lazy - 没有等价物
ObjectFactory Provider javax.inject.Provider是Spring的直接替代品ObjectFactory,只有较短的get()方法名称。它也可以与Spring @Autowired或非注释构造函数和setter方法结合使用。

猜你喜欢

转载自blog.csdn.net/hadues/article/details/86439927
今日推荐