Skip to content

Latest commit

 

History

History
88 lines (74 loc) · 3.57 KB

SpringShell.md

File metadata and controls

88 lines (74 loc) · 3.57 KB

Spring Shell

Speing Shell - для создания консольных приложений

Аннотации (legacy):

@ShellComponent - набор методов-команд, вешать над классом
@ShellMethod("CommandName") - метод-команда, вешать над методом
@ShellOption - аргумент (передается как --name, обязательно по умолчанию в 2.0.0), вешать рядом с принимаемым аргументом
@ShellMethodAvailability - позволяет управлять доступностью команд (это метод)

Аннотации (modern):
Command(group = "commands group") - набор методов-команд, вешать над классом
@Command(description = "command description, command = "commandName, alias = {"com", "cmd"}) - метод-команда, вешать над методом
@Option(defaultValue = "defValue") - аргумент (передается как --name, обязательно по умолчанию в 2.0.0), вешать рядом с принимаемым аргументом @CommandAvailability(provider = "someBean") - позволяет управлять доступностью команд. Provider - это БИН!!! ->
@CommandScan - над Main классом - ищет команды, делает из них бины и складывает в контекст

Пример бина для @CommandAvailability

@Configuration
public class ShellBeanConfig {

    @Bean
    public AvailabilityProvider publishEventCommandAvailabilityProvider(SomeBean someBean) {
        return () -> someBean.someMethod()
                ? Availability.available()
                : Availability.unavailable("some reason");
    }
}

2 варианта использования:

  • legacy (примеры по нему будут)
  • modern - современный

зависимость:

<dependency>
    <groupId>org.springframework.shell</groupId>
    <artifactId>spring-shell-starter</artifactId>
</dependency>

Пример класса команд:

@ShellComponent
@RequiredArgsConstructor
public class ShellCommandExample {
    private final HelloService helloService;

    /**
     * команда в консоли: Hello Vadim
     * value - то, что будет показано в help
     * key - алиасы команды
     * availability - название метода с условием
     */
    @ShellMethod(value = "Hello", key = {"l", "login"})
    @ShellMethodAvailability("isHelloCommandAvailable")
    public String sayHello(@ShellOption(defaultValue = "AnyUserName") String name) {
        return helloService.hello(name);
    }

    private Availability isHelloCommandAvailable() {
        return Availability.available();
//        return Availability.unavailable("some reason");
    }
}

Пример метода команды modern-стиль:

    @Command(description = "Find all books", command = "books", alias = "ab")
    public String findAllBooks() {
        return bookService.findAll().stream()
                .map(Book::toString)
                .collect(Collectors.joining("," + System.lineSeparator()));
    }

Тестирование SpringShell - чтобы он не заблокировал приложение потоком ввода - выключение интерактивного режима

spring:
  shell:
    interactive: 
        enabled: false #true, в обычном состоянии