CommandLineRunner在这种情况下做了什么?

时间:2016-01-29 03:55:31

标签: java spring spring-boot

我完全不熟悉Spring&在Java中不是很有经验。我正在尝试浏览spring.io网站上的Building REST services with Spring教程。我遇到了以下代码段,我对它实际上做了什么很困惑。

@Configuration
@ComponentScan
@EnableAutoConfiguration
public class Application {

    @Bean
    CommandLineRunner init(AccountRepository accountRepository,
            BookmarkRepository bookmarkRepository) {
        return (evt) -> Arrays.asList(
                "jhoeller,dsyer,pwebb,ogierke,rwinch,mfisher,mpollack,jlong".split(","))
                .forEach(
                        a -> {
                            Account account = accountRepository.save(new Account(a,
                                    "password"));
                            bookmarkRepository.save(new Bookmark(account,
                                    "http://bookmark.com/1/" + a, "A description"));
                            bookmarkRepository.save(new Bookmark(account,
                                    "http://bookmark.com/2/" + a, "A description"));
                        });
    }

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

我在Spring Boot文档中查找了CommandLineRunner,它说如果你想在应用程序启动时执行一些代码,它就会被实现。但据我所知,CommandLineRunner并未通过上述代码段中的任何内容实现。另外,我不知道init()方法的来源或实际情况。

此外,我从他们的github repo下载了完整的代码,但我不太确定如何实际运行它。我今天早些时候读到SpringApplication.run()使得你不需要像Tomcat这样的外部服务部署任何东西。但是当我为Application类尝试java -jar ./jarFileName时(因为它有main())似乎是一个自然的选择,它给出了一个错误。

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:3)

回答你的第一个问题:

CommandLineRunner由Lambda表达式实现:

return (evt) -> Arrays.asList(...

第二,init()方法是一个Spring Bean定义,如@Bean注释所示。

第三,运行你正确的应用程序的方式。 java -jar jarFile应该运行它。我查看了git repo中的模块,并且一些模块缺少使jars可执行的spring-boot-maven-plugin配置。但您可以从命令行运行它们,如下所示:mvn spring-boot:run