Сообщения

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

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

Изображение
Профиль по умолчанию представляет собой профиль, который включен по умолчанию. Рассмотрим следующий пример: Java @Configuration @Profile("default") public class DefaultDataConfig { @Bean public DataSource dataSource() { return new EmbeddedDatabaseBuilder() .setType(EmbeddedDatabaseType.HSQL) .addScript("classpath:com/bank/config/sql/schema.sql") .build(); } } Kotlin @Configuration @Profile("default") class DefaultDataConfig { @Bean fun dataSource(): DataSource { return EmbeddedDatabaseBuilder() .setType(EmbeddedDatabaseType.HSQL) .addScript("classpath:com/bank/config/sql/schema.sql") .build() } } Если ни один профиль не активен, dataSource создается. Вы можете рассматривать это как способ предоставить определение по умолчанию для одного или нескольких компонентов. Если какой-либо профиль включен, профиль по ...

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

Изображение
Теперь, когда мы обновили нашу конфигурацию, нам все еще нужно указать Spring, какой профиль активен. Если бы мы запустили наш пример приложения прямо сейчас, мы бы увидели исключение NoSuchBeanDefinitionException, потому что контейнер не смог найти bean-компонент Spring с именем dataSource. Активация профиля может быть выполнена несколькими способами, но самый простой - это сделать это программно с помощью API среды, доступного через ApplicationContext. В следующем примере показано, как это сделать: Java AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(); ctx.getEnvironment().setActiveProfiles("development"); ctx.register(SomeConfig.class, StandaloneDataConfig.class, JndiDataConfig.class); ctx.refresh(); Kotlin val ctx = AnnotationConfigApplicationContext().apply { environment.setActiveProfiles("development") register(SomeConfig::class.java, StandaloneDataConfig::class.java, JndiDataConfig::class.java) refresh...

Spring IoC контейнер: абстракция Environment, профили определения компонентов, использование @Profile

Изображение
Аннотация @Profile позволяет указать, что компонент имеет право на регистрацию, если активен один или несколько указанных профилей. Используя наш предыдущий пример , мы можем переписать конфигурацию источника данных следующим образом: Java @Configuration @Profile("development") public class StandaloneDataConfig { @Bean public DataSource dataSource() { return new EmbeddedDatabaseBuilder() .setType(EmbeddedDatabaseType.HSQL) .addScript("classpath:com/bank/config/sql/schema.sql") .addScript("classpath:com/bank/config/sql/test-data.sql") .build(); } } Kotlin @Configuration @Profile("development") class StandaloneDataConfig { @Bean fun dataSource(): DataSource { return EmbeddedDatabaseBuilder() .setType(EmbeddedDatabaseType.HSQL) .addScript("classpath:com/bank/config/sql/schema.sql") .addScript(...

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

Изображение
В приложениях, где классы @Configuration являются основным механизмом настройки контейнера, по-прежнему, вероятно, необходимо использовать хотя бы некоторый XML. В этих сценариях вы можете использовать @ImportResource и определять столько XML, сколько вам нужно. Таким образом достигается "ориентированный на Java" подход к настройке контейнера и сводится к минимуму XML. В следующем примере (который включает класс конфигурации, XML-файл, определяющий bean-компонент, файл свойств и основной класс) показано, как использовать аннотацию @ImportResource для достижения "Java-ориентированной" конфигурации, которая использует XML по мере необходимости: Java @Configuration @ImportResource("classpath:/com/acme/properties-config.xml") public class AppConfig { @Value("${jdbc.url}") private String url; @Value("${jdbc.username}") private String username; @Value("${jdbc.password}") private String password; ...

Spring IoC контейнер: Java конфигурация, объединение конфигурации Java и XML

Изображение
Поддержка класса @Configuration в Spring не ставит своей целью полностью заменить Spring XML. Некоторые средства, такие как пространства имен Spring XML, остаются идеальным способом настройки контейнера. В тех случаях, когда XML удобен или необходим, у вас есть выбор: либо создать экземпляр контейнера "XML-ориентированным" способом, используя, например, ClassPathXmlApplicationContext, либо создать его "Java-ориентированным" способом, используя AnnotationConfigApplicationContext и аннотации @ImportResource для импорта XML по мере необходимости. XML-ориентированное использование классов @Configuration Может быть предпочтительнее загружать контейнер Spring из XML и включать классы @Configuration в специальном режиме. Например, в большой существующей кодовой базе, которая использует Spring XML, проще создавать классы @Configuration по мере необходимости и включать их из существующих файлов XML. Объявление классов @Configuration как простых элементов Spring <bean/...

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 контейнер: 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 контейнер: Java конфигурация, композиция конфигураций на основе Java, использование аннотации @Import

Изображение
Функция конфигурации Spring на основе Java позволяет вам составлять аннотации, которые могут снизить сложность вашей конфигурации. Использование аннотации @Import Подобно тому, как элемент <import/> используется в файлах Spring XML для упрощения модуляции конфигураций, аннотация @Import позволяет загружать определения @Bean из другого класса конфигурации, как показано в следующем примере: Java @Configuration public class ConfigA { @Bean public A a() { return new A(); } } @Configuration @Import(ConfigA.class) public class ConfigB { @Bean public B b() { return new B(); } } Kotlin @Configuration class ConfigA { @Bean fun a() = A() } @Configuration @Import(ConfigA::class) class ConfigB { @Bean fun b() = B() } Теперь вместо того, чтобы указывать одновременно ConfigA.class и ConfigB.class при создании экземпляра контекста, необходимо явно указать только ConfigB, как показано в следующем примере: Java p...

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

Изображение
Рассмотрим следующий пример, который показывает, что аннотированный метод @Bean вызывается дважды: Java @Configuration public class AppConfig { @Bean public ClientService clientService1() { ClientServiceImpl clientService = new ClientServiceImpl(); clientService.setClientDao(clientDao()); return clientService; } @Bean public ClientService clientService2() { ClientServiceImpl clientService = new ClientServiceImpl(); clientService.setClientDao(clientDao()); return clientService; } @Bean public ClientDao clientDao() { return new ClientDaoImpl(); } } Kotlin @Configuration class AppConfig { @Bean fun clientService1(): ClientService { return ClientServiceImpl().apply { clientDao = clientDao() } } @Bean fun clientService2(): ClientService { return ClientServiceImpl().apply { clientDao = clientDao() } } ...

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

Изображение
Внедрение метода поиска - это расширенная функция, которую следует использовать редко. Это полезно в случаях, когда bean-компонент с одноэлементной областью видимости зависит от bean-компонента с областью действия прототипа. Использование Java для этого типа конфигурации предоставляет естественные средства для реализации этого шаблона. В следующем примере показано, как использовать внедрение метода поиска: Java public abstract class CommandManager { public Object process(Object commandState) { // захватываем новый экземпляр // соответствующего Command интерфейса Command command = createCommand(); // устанавливаем состояние // (надеясь, нового) экземпляра Command command.setState(commandState); return command.execute(); } // хорошо ... а где реализация этого метода? protected abstract Command createCommand(); } Kotlin abstract class CommandManager { fun process(commandState: Any): Any { //...

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