Сообщения

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

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

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

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

Изображение
Пример в предыдущем посте работает, но он упрощен. В большинстве практических сценариев bean-компоненты зависят друг от друга в разных классах конфигурации. При использовании XML это не проблема, потому что компилятор не задействован, и вы можете объявить ref="someBean" и доверять Spring, чтобы решить эту проблему во время инициализации контейнера. При использовании классов @Configuration компилятор Java накладывает ограничения на модель конфигурации, так как ссылки на другие bean-компоненты должны иметь допустимый синтаксис Java. К счастью, решить эту проблему просто. Метод @Bean может иметь произвольное количество параметров, описывающих зависимости bean-компонентов. Рассмотрим следующий более реальный сценарий с несколькими классами @Configuration, каждый из которых зависит от bean-компонентов, объявленных в других: Java @Configuration public class ServiceConfig { @Bean public TransferService transferService(AccountRepository accountRepository) { re...

Spring IoC контейнер: сканирование classpath, предоставление метаданных квалификатора с аннотациями

Изображение
Аннотация @Qualifier обсуждалась в посте " Настройка автопривязки на основе аннотаций с @Qualifier ". Примеры в том посте демонстрируют использование аннотации @Qualifier и пользовательских аннотаций квалификатора для обеспечения детального контроля при разрешении кандидатов с автопривязкой. Поскольку те примеры были основаны на определениях bean-компонентов XML, метаданные квалификатора были предоставлены в определениях bean-кандидатов с использованием квалификатора или мета-дочерних элементов элемента bean-компонента в XML. Полагаясь на сканирование пути к классам для автоматического обнаружения компонентов, вы можете предоставить метаданные квалификатора с аннотациями на уровне типа для класса-кандидата. Следующие три примера демонстрируют эту технику: Java @Component @Qualifier("Action") public class ActionMovieCatalog implements MovieCatalog { // ... } Kotlin @Component @Qualifier("Action") class ActionMovieCatalog : MovieCatalog J...

Spring IoC контейнер: конфигурация на основе аннотаций, использование CustomAutowireConfigurer

Изображение
CustomAutowireConfigurer - это BeanFactoryPostProcessor, который позволяет регистрировать собственные типы аннотаций квалификаторов, даже если они не аннотированы аннотацией Spring @Qualifier. В следующем примере показано, как использовать CustomAutowireConfigurer: <bean id="customAutowireConfigurer" class="org.springframework.beans.factory.annotation.CustomAutowireConfigurer"> <property name="customQualifierTypes"> <set> <value>example.CustomQualifier</value> </set> </property> </bean> AutowireCandidateResolver определяет кандидатов для автоматической привязки по: Значение autowire-candidate каждого определения бина Любые шаблоны default-autowire-candidates, доступные в элементе <beans/> Наличие аннотаций @Qualifier и любых пользовательских аннотаций, зарегистрированных в CustomAutowireConfigurer Когда несколько bean-компонентов квалифицируются к...

Spring IoC контейнер: конфигурация на основе аннотаций, использование дженериков в качестве квалификаторов автопривязки

Изображение
В дополнение к аннотации @Qualifier вы можете использовать универсальные типы Java (дженерики) в качестве неявной формы квалификации. Например, предположим, что у вас есть следующая конфигурация: Java @Configuration public class MyConfiguration { @Bean public StringStore stringStore() { return new StringStore(); } @Bean public IntegerStore integerStore() { return new IntegerStore(); } } Kotlin @Configuration class MyConfiguration { @Bean fun stringStore() = StringStore() @Bean fun integerStore() = IntegerStore() } Предполагая, что предыдущие компоненты реализуют универсальный интерфейс (то есть Store<String> и Store<Integer>), вы можете привязать с помощью @Autowire интерфейс Store, и дженерик используется в качестве квалификатора, как показано в следующем примере: Java @Autowired private Store<String> s1; // <String> qualifier, внедряет stringStore bean @Autowired private Store...

Spring IoC контейнер: конфигурация на основе аннотаций, настройка автопривязки на основе аннотаций с @Qualifier

Изображение
@Primary - эффективный способ использовать автоматическую привязку по типу с несколькими случаями, когда можно определить одного основного кандидата. Когда вам нужно больше контроля над процессом выбора, вы можете использовать аннотацию Spring @Qualifier . Вы можете связать значения квалификатора с конкретными аргументами, сузив набор совпадений типов, чтобы для каждого аргумента был выбран конкретный компонент. В простейшем случае это может быть просто описательное значение, как показано в следующем примере: Java public class MovieRecommender { @Autowired @Qualifier("main") private MovieCatalog movieCatalog; // ... } Kotlin class MovieRecommender { @Autowired @Qualifier("main") private lateinit var movieCatalog: MovieCatalog // ... } Вы также можете указать аннотацию @Qualifier для отдельных аргументов конструктора или параметров метода, как показано в следующем примере: Java public class MovieRecommender { ...

Spring IoC контейнер: конфигурация на основе аннотаций, точная настройка автопривязки на основе аннотаций с @Primary

Изображение
Поскольку автоматическое подключение по типу может привести к нескольким кандидатам, часто необходимо иметь больший контроль над процессом выбора. Одним из способов добиться этого является аннотация Spring @Primary . @Primary указывает, что конкретному bean-компоненту следует отдавать предпочтение, когда несколько bean-компонентов являются кандидатами на автоматическое подключение к однозначной зависимости. Если среди кандидатов существует ровно один основной компонент, он становится значением автопривязки. Рассмотрим следующую конфигурацию, которая определяет firstMovieCatalog в качестве основного MovieCatalog: Java @Configuration public class MovieConfiguration { @Bean @Primary public MovieCatalog firstMovieCatalog() { ... } @Bean public MovieCatalog secondMovieCatalog() { ... } // ... } Kotlin @Configuration class MovieConfiguration { @Bean @Primary fun firstMovieCatalog(): MovieCatalog { ... } @Bean fun secondMovieCatalo...

Spring IoC контейнер: конфигурация на основе аннотаций, использование @Autowired

Изображение
Вы можете применить аннотацию @Autowired к конструкторам, как показано в следующем примере: Java public class MovieRecommender { private final CustomerPreferenceDao customerPreferenceDao; @Autowired public MovieRecommender(CustomerPreferenceDao customerPreferenceDao) { this.customerPreferenceDao = customerPreferenceDao; } // ... } Kotlin class MovieRecommender @Autowired constructor( private val customerPreferenceDao: CustomerPreferenceDao) Начиная с Spring Framework 4.3, аннотация @Autowired для такого конструктора больше не требуется, если целевой бин для начала определяет только один конструктор. Однако, если доступно несколько конструкторов и нет основного/стандартного конструктора, по крайней мере один из конструкторов должен быть аннотирован @Autowired, чтобы указать контейнеру, какой из них использовать. Вы также можете применить аннотацию @Autowired к традиционным методам установки, как показано в следующем примере: Java ...