Эта статья участвовала в третьем этапе курса «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
Дополнительные руководства см.блог флайдина