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 {
// захватываем новый экземпляр
// соответствующего Command интерфейса
val command = createCommand()
// устанавливаем состояние
// (надеясь, нового) экземпляра Command
command.setState(commandState)
return command.execute()
}
// хорошо ... а где реализация этого метода?
protected abstract fun createCommand(): Command
}
Используя конфигурацию Java, вы можете создать подкласс CommandManager, в котором абстрактный метод createCommand() переопределяется таким образом, что он ищет новый (prototype) command объект. В следующем примере показано, как это сделать:
Java
@Bean
@Scope("prototype")
public AsyncCommand asyncCommand() {
AsyncCommand command = new AsyncCommand();
// внедряем здесь зависимости по мере необходимости
return command;
}
@Bean
public CommandManager commandManager() {
// возвращаем новую анонимную реализацию CommandManager
// с помощью createCommand() переопределенного,
// чтобы возвращать новый prototype Command объект
return new CommandManager() {
protected Command createCommand() {
return asyncCommand();
}
}
}
Kotlin
@Bean
@Scope("prototype")
fun asyncCommand(): AsyncCommand {
val command = AsyncCommand()
// внедряем здесь зависимости по мере необходимости
return command
}
@Bean
fun commandManager(): CommandManager {
// возвращаем новую анонимную реализацию CommandManager
// с помощью createCommand() переопределенного,
// чтобы возвращать новый prototype Command объект
return object : CommandManager() {
override fun createCommand(): Command {
return asyncCommand()
}
}
}
Читайте также:
- Spring IoC контейнер: Java конфигурация, настройка имен, псевдонимов, описаний бинов
- Spring IoC контейнер: Java конфигурация, использование аннотации @Configuration, внедрение зависимостей между компонентами
- Spring IoC контейнер: Java конфигурация, указание Scope бинов
Комментарии
Отправить комментарий