Подтвердить что ты не робот

Основной метод SpringApplication.run

Я создал проект в Eclipse, используя шаблон проекта Spring Starter.

Он автоматически создает файл класса приложения, и этот путь соответствует пути в файле POM.xml, поэтому все хорошо. Вот класс Application:

@Configuration
@ComponentScan
@EnableAutoConfiguration
public class Application {

    public static void main(String[] args) {
        //SpringApplication.run(ReconTool.class, args);  
        ReconTool.main(args);
    }
}

Это приложение командной строки, которое я создаю, и чтобы запустить его, мне пришлось прокомментировать строку SpringApplication.run и просто добавить основной метод из моего другого класса для запуска. Помимо этой быстрой дробилки, я могу создать ее с помощью Maven, и она работает как приложение Spring, вроде.

Я бы предпочел, однако, не прокомментировать эту строку и использовать полную инфраструктуру Spring. Как я могу это сделать?

4b9b3361

Ответ 1

Вам нужно запустить Application.run(), потому что этот метод запускает всю Spring Framework. Приведенный ниже код объединяет ваш main() с Spring Boot.

Application.java

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

ReconTool.java

@Component
public class ReconTool implements CommandLineRunner {

    @Override
    public void run(String... args) throws Exception {
        main(args);
    }

    public static void main(String[] args) {
        // Recon Logic
    }
}

Почему бы и нет SpringApplication.run(ReconTool.class, args)

Потому что таким образом пружина настроена не полностью (без сканирования компонентов и т.д.). Создается только bean-компонент, определенный в run() (ReconTool).

Пример проекта: https://github.com/mariuszs/spring-run-magic

Ответ 2

Использование:

@ComponentScan
@EnableAutoConfiguration
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);  

        //do your ReconTool stuff
    }
}

будет работать при любых обстоятельствах. Хотите ли вы запустить приложение из IDE или из инструмента сборки.

Используя maven, просто используйте mvn spring-boot:run

в то время как в Gradle это будет gradle bootRun

Альтернативой добавлению кода в метод run является наличие Spring Bean, который реализует CommandLineRunner. Это будет выглядеть так:

@Component
public class ReconTool implements CommandLineRunner {

    @Override
    public void run(String... args) throws Exception {
       //implement your business logic here
    }
}

Ознакомьтесь с этим руководством из официального репозитория Spring.

Полную документацию по Spring Boot можно найти здесь here

Ответ 3

Еще один способ - расширить приложение (поскольку мое приложение предназначалось для наследования и настройки родителя). Он автоматически запускает родительский элемент и его commandlinerunner.

@SpringBootApplication
public class ChildApplication extends ParentApplication{
    public static void main(String[] args) {
        SpringApplication.run(ChildApplication.class, args);
    }
}