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()
        }
    }
}


Читайте также:


Комментарии

Популярные сообщения из этого блога

Методы класса Object в Java

Как получить текущий timestamp в Java

Основные опции JVM для повышения производительности и отладки