Сообщения

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

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

Изображение
@Configuration - это аннотация на уровне класса, указывающая, что объект является источником определений bean-компонентов. Классы @Configuration объявляют компоненты с помощью общедоступных аннотированных методов @Bean. Вызовы методов @Bean в классах @Configuration также можно использовать для определения зависимостей между компонентами. Внедрение зависимостей между компонентами Когда компоненты имеют зависимости друг от друга, выразить эту зависимость так же просто, как заставить один метод компонента вызывать другой, как показано в следующем примере: Java @Configuration public class AppConfig { @Bean public BeanOne beanOne() { return new BeanOne(beanTwo()); } @Bean public BeanTwo beanTwo() { return new BeanTwo(); } } Kotlin @Configuration class AppConfig { @Bean fun beanOne() = BeanOne(beanTwo()) @Bean fun beanTwo() = BeanTwo() } В примере beanOne получает ссылку на beanTwo через внедрение конструктора. Эт...

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

Изображение
Настройка именования бинов По умолчанию классы конфигурации используют имя метода @Bean в качестве имени полученного компонента. Однако эту функцию можно переопределить атрибутом name, как показано в следующем примере: Java @Configuration public class AppConfig { @Bean(name = "myThing") public Thing thing() { return new Thing(); } } Kotlin @Configuration class AppConfig { @Bean("myThing") fun thing() = Thing() } Псевдонимы бинов Иногда желательно дать одному бину несколько имен, иначе называемых псевдонимами бинов (bean aliasing). Атрибут name аннотации @Bean принимает массив String для этой цели. В следующем примере показано, как установить ряд псевдонимов для компонента: Java @Configuration public class AppConfig { @Bean({"dataSource", "subsystemA-dataSource", "subsystemB-dataSource"}) public DataSource dataSource() { // создать экземпляр, // сконфигурироват...

Spring IoC контейнер: Java конфигурация, указание Scope бинов

Изображение
Spring включает аннотацию @Scope, так что вы можете указать область действия компонента с помощью нее. Использование аннотации @Scope Вы можете указать, что ваши bean-компоненты, определенные с аннотацией @Bean, должны иметь определенную область действия. Вы можете использовать любую из стандартных областей, указанных в посте области действия bean . Область по умолчанию - singleton, но вы можете переопределить это с помощью аннотации @Scope, как показано в следующем примере: Java @Configuration public class MyConfiguration { @Bean @Scope("prototype") public Encryptor encryptor() { // ... } } Kotlin @Configuration class MyConfiguration { @Bean @Scope("prototype") fun encryptor(): Encryptor { // ... } } @Scope и scoped-proxy Spring предлагает удобный способ работы с зависимостями в пределах области с помощью прокси-объектов. Самый простой способ создать такой прокси при использовании конфигурации XML...

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

Изображение
Любые классы, определенные с помощью аннотации @Bean, поддерживают обычные обратные вызовы жизненного цикла и могут использовать аннотации @PostConstruct и @PreDestroy из JSR-250. Обычные обратные вызовы жизненного цикла Spring также полностью поддерживаются. Если bean-компонент реализует InitializingBean, DisposableBean или Lifecycle, контейнер вызывает их соответствующие методы. Стандартный набор *Aware интерфейсов (таких как BeanFactoryAware, BeanNameAware, MessageSourceAware, ApplicationContextAware и т. д.) также полностью поддерживается. Аннотация @Bean поддерживает указание произвольных методов обратного вызова инициализации и уничтожения, во многом как атрибуты init-метода и destroy-метода Spring XML для элемента bean, как показано в следующем примере: Java public class BeanOne { public void init() { // логика инициализации } } public class BeanTwo { public void cleanup() { // логика разрушения } } @Configuration public class AppConfi...

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

Изображение
Аннотированный @Bean метод может иметь произвольное количество параметров, описывающих зависимости, необходимые для построения этого bean-компонента. Например, если нашему TransferService требуется AccountRepository, мы можем материализовать эту зависимость с помощью параметра метода, как показано в следующем примере: Java @Configuration public class AppConfig { @Bean public TransferService transferService(AccountRepository accountRepository) { return new TransferServiceImpl(accountRepository); } } Kotlin @Configuration class AppConfig { @Bean fun transferService(accountRepository: AccountRepository): TransferService { return TransferServiceImpl(accountRepository) } } Механизм разрешения в значительной степени идентичен внедрению зависимостей на основе конструктора. Читайте также: Spring IoC контейнер: Java конфигурация, @Bean и @Configuration Spring IoC контейнер: Java конфигурация, создание контейнера Spring с помощью Anno...

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

Изображение
Использование аннотации @Bean @Bean - это аннотация уровня метода и прямой аналог элемента XML <bean/>. Аннотация поддерживает некоторые атрибуты, предлагаемые <bean/>, такие как: * init-method * destroy-method * autowiring * name. Вы можете использовать аннотацию @Bean в аннотированном @Configuration классе или в классе, аннотированном @Component. Объявление Bean Чтобы объявить бин, вы можете аннотировать метод аннотацией @Bean. Этот метод используется для регистрации определения компонента в ApplicationContext типа, указанного в качестве возвращаемого значения метода. По умолчанию имя компонента совпадает с именем метода. В следующем примере показано объявление метода @Bean: Java @Configuration public class AppConfig { @Bean public TransferServiceImpl transferService() { return new TransferServiceImpl(); } } Kotlin @Configuration class AppConfig { @Bean fun transferService() = TransferServiceImpl() } Предыдущая конфигурация...

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

Изображение
В этом посте описывается Spring AnnotationConfigApplicationContext, представленный в Spring 3.0. Эта универсальная реализация ApplicationContext способна принимать в качестве входных данных не только классы @Configuration, но и простые классы @Component и классы, аннотированные метаданными JSR-330. Когда классы @Configuration предоставляются в качестве входных данных, сам класс @Configuration регистрируется как определение компонента, и все объявленные методы @Bean в классе также регистрируются как определения компонента. Когда предоставляются классы @Component и JSR-330, они регистрируются как определения bean-компонентов, и предполагается, что метаданные внедрения зависимостей, такие как @Autowired или @Inject, используются в этих классах, где это необходимо. Простая конструкция Аналогично тому, как XML-файлы Spring используются в качестве входных данных при создании экземпляра ClassPathXmlApplicationContext, вы можете использовать классы @Configuration в качестве входных данных ...

Spring IoC контейнер: Java конфигурация, @Bean и @Configuration

Изображение
Центральными артефактами поддержки Java-конфигурации Spring с использованием new являются @Configuration-аннотированные классы и @Bean-аннотированные методы. Аннотация @Bean используется для указания того, что метод создает, настраивает и инициализирует новый объект, который будет управляться контейнером Spring IoC. Для сравнения с XML-конфигурацией Spring <beans/>, аннотация @Bean играет ту же роль, что и элемент <bean/>. Вы можете использовать аннотированные @Bean методы с любым Spring @Component. Однако они чаще всего используются с bean-компонентами @Configuration. Аннотирование класса с помощью @Configuration указывает на то, что его основное назначение - источник определений бина. Кроме того, классы @Configuration позволяют определять зависимости между компонентами, вызывая другие методы @Bean в том же классе. Простейший из возможных классов @Configuration выглядит следующим образом: Java @Configuration public class AppConfig { @Bean public MyService m...

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 контейнер: использование стандартных аннотаций JSR 330, внедрение зависимостей с @Inject и @Named

Изображение
Начиная со Spring 3.0, Spring предлагает поддержку стандартных аннотаций JSR-330 (Dependency Injection). Эти аннотации сканируются так же, как аннотации Spring. Чтобы использовать их, вы должны иметь соответствующие jar в вашем classpath. Если вы используете Maven, артефакт javax.inject доступен в стандартном репозитории Maven (https://repo1.maven.org/maven2/javax/inject/javax.inject/1/). Вы можете добавить следующую зависимость в ваш файл pom.xml: <dependency> <groupId>javax.inject</groupId> <artifactId>javax.inject</artifactId> <version>1</version> </dependency> Внедрение зависимостей с @Inject и @Named Вместо @Autowired вы можете использовать @javax.inject.Inject следующим образом: Java import javax.inject.Inject; public class SimpleMovieLister { private MovieFinder movieFinder; @Inject public void setMovieFinder(MovieFinder movieFinder) { this.movieFinder = movieFinder; } publi...

Spring IoC контейнер: сканирование classpath, генерация индекса компонентов-кандидатов

Изображение
Хотя сканирование пути к классам очень быстрое, можно улучшить производительность запуска больших приложений, создав статический список кандидатов во время компиляции. В этом режиме все модули, которые являются целью сканирования компонентов, должны использовать этот механизм. Ваши существующие директивы @ComponentScan или <context:component-scan должны оставаться без изменений, чтобы запрашивать контекст для сканирования кандидатов в определенных пакетах. Когда ApplicationContext обнаруживает такой индекс, он автоматически использует его, а не сканирует путь к классам. Чтобы создать индекс, добавьте дополнительную зависимость к каждому модулю, который содержит компоненты, которые являются целями для директив сканирования компонентов. В следующем примере показано, как это сделать с Maven: <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-indexer</artifactId> <version...

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 контейнер: сканирование classpath, предоставление области действия для автоопределенных компонентов

Изображение
Как и в случае с компонентами, управляемыми Spring в целом, по умолчанию и наиболее распространенной областью действия для автоматически обнаруживаемых компонентов является singleton. Однако иногда вам нужна другая область, которая может быть указана в аннотации @Scope. Вы можете указать имя области в аннотации, как показано в следующем примере: Java @Scope("prototype") @Repository public class MovieFinderImpl implements MovieFinder { // ... } Kotlin @Scope("prototype") @Repository class MovieFinderImpl : MovieFinder { // ... } Аннотации @Scope используются только для конкретного класса компонентов (для аннотированных компонентов) или для фабричного метода (для методов @Bean). В отличие от определений bean-компонентов XML, понятие наследования определений bean отсутствует, и иерархии наследования на уровне класса не имеют значения для целей метаданных. Как и в случае с предварительно созданными аннотациями для областей, вы также можете создав...

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

Изображение
Когда компонент автоматически определяется как часть процесса сканирования, его имя компонента создается стратегией BeanNameGenerator, известной этому сканеру. По умолчанию любая стереотипная аннотация Spring (@Component, @Repository, @Service и @Controller), которая содержит значение имени, тем самым предоставляет это имя соответствующему определению компонента. Если такая аннотация не содержит значения имени или какого-либо другого обнаруженного компонента (например, обнаруженного с помощью пользовательских фильтров), генератор имен компонентов по умолчанию возвращает некапитализированное неквалифицированное имя класса. Например, если были обнаружены следующие классы компонентов, имена будут myMovieLister и movieFinderImpl: Java @Service("myMovieLister") public class SimpleMovieLister { // ... } Kotlin @Service("myMovieLister") class SimpleMovieLister { // ... } Java @Repository public class MovieFinderImpl implements MovieFinder { ...

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

Изображение
Компоненты Spring также могут предоставлять метаданные определения компонента в контейнер. Это можно сделать с помощью той же аннотации @Bean, которая используется для определения метаданных bean-компонентов в аннотированных классах @Configuration. В следующем примере показано, как это сделать: Java @Component public class FactoryMethodComponent { @Bean @Qualifier("public") public TestBean publicInstance() { return new TestBean("publicInstance"); } public void doWork() { // Реализация метода компонента опущена } } Kotlin @Component class FactoryMethodComponent { @Bean @Qualifier("public") fun publicInstance() = TestBean("publicInstance") fun doWork() { // Реализация метода компонента опущена } } Предыдущий класс является компонентом Spring, который имеет специфичный для приложения код в своем методе doWork(). Однако он также вносит определение bean-компонента, ...

Spring IoC контейнер: сканирование classpath, использование фильтров для настройки сканирования

Изображение
По умолчанию классы, аннотированные @Component, @Repository, @Service, @Controller, @Configuration или пользовательские аннотации, которые сами аннотируются @Component, являются единственными обнаруженными компонентами-кандидатами. Однако вы можете изменить и расширить это поведение, применяя пользовательские фильтры. Добавьте их как атрибуты includeFilters или excludeFilters аннотации @ComponentScan (или как дочерние элементы <context:include-filter /> или <context:exclude-filter /> элемента <context:component-scan> в конфигурации XML). Каждый элемент фильтра требует атрибутов типа и выражения. В следующей таблице описаны параметры фильтрации: Тип фильтра Пример выражения Описание annotation (default) org.example.SomeAnnotation Аннотация, которая должна присутствовать или мета-присутствовать на уровне типа в целевых компонентах. assignable org.example.SomeClass Класс (или интерфейс), которому целевые компоненты могут быть назначены (расширены или реал...

Spring IoC контейнер: сканирование classpath, автоматическое определение классов и регистрация определений бинов

Изображение
Spring может автоматически обнаруживать стереотипные классы и регистрировать соответствующие экземпляры BeanDefinition с помощью ApplicationContext. Например, следующие два класса имеют право на такое автоопределение: Java @Service public class SimpleMovieLister { private MovieFinder movieFinder; public SimpleMovieLister(MovieFinder movieFinder) { this.movieFinder = movieFinder; } } Kotlin @Service class SimpleMovieLister(private val movieFinder: MovieFinder) Java @Repository public class JpaMovieFinder implements MovieFinder { // реализация исключена для ясности } Kotlin @Repository class JpaMovieFinder : MovieFinder { // реализация исключена для ясности } Для автоматического определения этих классов и регистрации соответствующих bean-компонентов вам необходимо добавить @ComponentScan в ваш класс @Configuration, где атрибут basePackages является общим родительским пакетом для этих двух классов. (В качестве альтернативы вы мож...

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

Изображение
Многие из аннотаций, предоставляемых Spring, могут использоваться как метааннотации в вашем собственном коде. Метааннотация - это аннотация, которая может быть применена к другой аннотации. Например, упомянутая ранее аннотация @Service мета-аннотирована с помощью @Component, как показано в следующем примере: Java @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Component // Component заставляет @Service обрабатываться так же, как @Component. public @interface Service { // ... } Kotlin @Target(AnnotationTarget.TYPE) @Retention(AnnotationRetention.RUNTIME) @MustBeDocumented @Component // Component заставляет @Service обрабатываться так же, как @Component. annotation class Service { // ... } Вы также можете комбинировать метааннотации для создания "составных аннотаций". Например, аннотация @RestController из Spring MVC состоит из @Controller и @ResponseBody. Кроме того, составные аннотации могут по желанию повторно объявлять ...

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...