Сообщения

Показаны сообщения с ярлыком "@Component"

Spring IoC контейнер: Java конфигурация, условно включать классы @Configuration или @Bean-методы

Изображение
Часто бывает полезно условно включить или отключить весь класс @Configuration или даже отдельные методы @Bean на основе некоторого произвольного состояния системы. Одним из распространенных примеров этого является использование аннотации @Profile для активации bean-компонентов только тогда, когда в среде Spring включен конкретный профиль. Аннотация @Profile фактически реализована с помощью гораздо более гибкой аннотации под названием @Conditional. Аннотация @Conditional указывает конкретные реализации org.springframework.context.annotation.Condition, с которыми следует проконсультироваться до регистрации @Bean. Реализации интерфейса Condition предоставляют метод matches(…​), который возвращает true или false. Например, в следующем листинге показана фактическая реализация Condition, используемая для @Profile: Java @Override public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { // Считываем атрибуты аннотации @Profile MultiValueMap<String, O...

Spring IoC контейнер: Java конфигурация, композиция конфигураций на основе Java, полностью квалифицированные импортированные бины для простоты навигации

Изображение
В предыдущем посте использование @Autowired хорошо работает и обеспечивает желаемую модульность, но определение того, где именно объявляются определения autowired bean, все еще остается несколько неоднозначным. Например, как разработчик, просматривающий ServiceConfig, как узнать, где именно объявлен компонент @Autowired AccountRepository? Это не явно указано в коде, и это может быть нормально. Помните, что Spring Tools для Eclipse предоставляет инструменты, которые могут отображать графики, показывающие, как все подключено, что может быть тем, что вам нужно. Кроме того, ваша Java IDE может легко найти все объявления и варианты использования типа AccountRepository и быстро показать вам расположение методов @Bean, возвращающих этот тип. В случаях, когда эта двусмысленность неприемлема и вы хотите иметь прямую навигацию из вашей IDE от одного класса @Configuration к другому, рассмотрите возможность автоматического подключения самих классов конфигурации. В следующем примере показано, как...

Spring IoC контейнер: ограничения стандартных аннотаций JSR 330

Изображение
При работе со стандартными аннотациями вы должны знать, что некоторые важные функции недоступны, как показано в следующей таблице: Spring javax.inject.* javax.inject ограничения/комментарии @Autowired @Inject @Inject не имеет атрибута 'required'. Вместо этого может использоваться с Optional Java 8. @Component @Named / @ManagedBean JSR-330 не предоставляет составную модель, только способ идентифицировать именованные компоненты. @Scope("singleton") @Singleton Область действия JSR-330 по умолчанию похожа на прототип (prototype) в Spring. Тем не менее, чтобы поддерживать его в соответствии с общими значениями по умолчанию Spring, bean-компонент JSR-330, объявленный в контейнере Spring, по умолчанию является одноэлементным (singleton). Чтобы использовать область, отличную от singleton, вы должны использовать аннотацию Spring @Scope. javax.inject также предоставляет аннотацию @Scope. Тем не менее, она предназначена только для создания ваших собственных ...

Spring IoC контейнер: аннотации JSR 330, @Named и @ManagedBean - стандартные эквиваленты аннотации @Component

Изображение
Вместо @Component вы можете использовать @javax.inject.Named или javax.annotation.ManagedBean, как показано в следующем примере: Java import javax.inject.Inject; import javax.inject.Named; // @ManagedBean("movieListener") также может быть использован @Named("movieListener") public class SimpleMovieLister { private MovieFinder movieFinder; @Inject public void setMovieFinder(MovieFinder movieFinder) { this.movieFinder = movieFinder; } // ... } Kotlin import javax.inject.Inject import javax.inject.Named // @ManagedBean("movieListener") также может быть использован @Named("movieListener") class SimpleMovieLister { @Inject lateinit var movieFinder: MovieFinder // ... } Очень часто используется @Component без указания имени для компонента. @Named можно использовать аналогичным образом, как показано в следующем примере: Java import javax.inject.Inject; import javax.inject.Named; @Na...

Spring IoC контейнер: сканирование classpath, @Component и дополнительные стереотипные аннотации

Изображение
Аннотация @Repository является маркером для любого класса, который выполняет роль или стереотип репозитория (также известный как объект доступа к данным (Data Access Object) или DAO). Среди применений этого маркера - автоматический перевод исключений. Spring предоставляет дополнительные стереотипные аннотации: @Component, @Service и @Controller. @Component - это общий стереотип для любого компонента, управляемого Spring. @Repository, @Service и @Controller являются специализациями @Component для более конкретных случаев использования (соответственно, в слоях постоянства (persistence), обслуживания (service) и представления (presentation)). Следовательно, вы можете аннотировать свои классы компонентов с помощью @Component, но, вместо этого, аннотируя их с помощью @Repository, @Service или @Controller, ваши классы лучше подходят для обработки инструментами или связи с аспектами. @Repository, @Service и @Controller могут содержать дополнительную семантику в будущих версиях Spring Framewo...