Справочное руководство Spring5: Стандартные аннотации JSR 330

Spring Boot Java задняя часть Spring

Эта статья участвовала в третьем этапе курса «High Yield Update» тренировочного лагеря для создателей Nuggets. Подробнее см.:Dig Li Project | Идет третий этап тренировочного лагеря создателя, «написание» личного влияния.

В предыдущей статье мы упоминали, что начиная с Spring 3.0, в дополнение к собственным аннотациям Spring, мы также можем использовать стандартные аннотации JSR330. Однако вам нужно добавить зависимости maven следующим образом:

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

Ниже приведены различия между стандартными аннотациями и аннотациями Spring:

Spring javax.inject.* ограничения/описания javax.inject
@Autowired @Inject @Inject не имеет обязательного атрибута, вместо него вы можете использовать необязательный атрибут Java8.
@Component @Named / @ManagedBean JSR-330 не предоставляет шаблон композиции, есть только один способ пометить именованные компоненты.
@Scope("singleton") @Singleton Область JSR-330 по умолчанию аналогична прототипу Spring, но для соответствия значению Spring по умолчанию bean-компонент JSR-330 по умолчанию, определенный в Spring, является одноэлементным. Если вы хотите использовать другие области, вам нужно использовать аннотацию Spring @Scope. javax.inject также предоставляет аннотацию @Scope. Но эта аннотация используется только для создания ваших собственных аннотаций.
@Qualifier @Qualifier / @Named javax.inject.Qualifier — это просто мета-аннотация для создания пользовательских квалификаторов. Конкретные строковые квалификаторы (такие как Spring @Qualifier со значением) могут быть связаны через javax.inject.Named.
@Value - не имеет той же функции
@Required - не имеет той же функции
@Lazy - не имеет той же функции
ObjectFactory Provider javax.inject.Provider является заменой Spring ObjectFactory, которая просто использует более короткое имя метода get(). Его также можно использовать в сочетании с Spring @Autowired или с неаннотированными конструкторами и методами установки.

Давайте представим их отдельно.

@Inject и @Named

@Inject можно использовать вместо @Autowired:

public class SimpleMovieLister {

    private MovieFinder movieFinder;

    @Inject
    public void setMovieFinder(MovieFinder movieFinder) {
        this.movieFinder = movieFinder;
    }

    public void listMovies() {
        this.movieFinder.findMovies();
    }
}

Как и @Autowired, вы можете использовать @Inject на уровне поля, метода и параметра конструктора. Кроме того, точка внедрения может быть объявлена ​​как Provider, предоставляя доступ по запросу к bean-компонентам с более короткой областью действия или отложенный доступ к другим bean-компонентам с помощью вызова Provider.get(). Ниже приведен пример поставщика:

public class SimpleMovieProviderLister {
    private Provider<MovieFinder> movieFinder;

    @Inject
    public void setMovieFinder(Provider<MovieFinder> movieFinder) {
        this.movieFinder = movieFinder;
    }

    public void listMovies() {
        this.movieFinder.get().findMovies();
    }
}

Вы можете использовать аннотацию @Named для уточнения имен для введенных параметров:

    @Inject
    public void setMovieFinderNamed(@Named("main") MovieFinder movieFinder) {
        this.movieFinder = movieFinder;
    }

Как и @Autowired, @Inject также можно использовать с java.util.Optional или @Nullable. Вот пример:

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

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

@Named и @ManagedBean

Вместо использования @Component вы также можете использовать @javax.inject.Named или javax.annotation.ManagedBean следующим образом:

@Named("movieListener")  // @ManagedBean("movieListener") could be used as well
public class SimpleMovieNamedLister {
    
    private MovieFinder movieFinder;

    @Inject
    public void setMovieFinder(MovieFinder movieFinder) {
        this.movieFinder = movieFinder;
    }

}

Примеры в этом разделе могут относиться кjsr330

Дополнительные руководства см.блог флайдина