诚然,当然世界上大部分 Spring Boot 程序是 Web 程序。将视线离开 Web 并放大到整个程序世界,则必将看到控制台程序是更基础也更广泛的一类程序。
用 Java 编写的控制台程序也可以享受 Spring Boot 带来的好处。
以 Spring Boot 为基础开发控制台程序,需要先引入一个 starter
Maven
org.springframework.boot spring-boot-starter
Gradle
implementation('org.springframework.boot:spring-boot-starter')
当然,如果项目所使用的 starter 已经包含了 spring-boot-starter(例如:spring-boot-starter-data-mongodb),则不需要专门引入 spring-boot-starter。
再实现一个接口
@FunctionalInterfacepublic interface CommandLineRunner { void run(String... args) throws Exception;}
例如:
class DartApplication implements CommandLineRunner { @Override public void run(String... args) { System.out.println("程序实际上的入口在这里。"); }}
将这个类加上 @SpringBootApplication
注解,然后编写一个带主函数的类就可以了。
@SpringBootApplicationclass DartApplication implements CommandLineRunner { @Override public void run(String... args) { System.out.println("程序实际上的入口在这里。"); }}public class App { public static void main(String[] args) { SpringApplication.run(DartApplication.class, args); }}
当然,把主函数放进 DartApplication
里面也可以
@SpringBootApplicationpublic class DartApplication implements CommandLineRunner { public static void main(String[] args) { SpringApplication.run(DartApplication.class, args); } @Override public void run(String... args) { System.out.println("程序实际上的入口在这里。"); }}
Spring 提供的注解,Spring Boot 提供的方便的 starter,在这里仍然能用。
例如自动装配:
@Componentclass Diablo { void firenova() { System.out.println("释放烈火新星"); }}@SpringBootApplicationpublic class DartApplication implements CommandLineRunner { public static void main(String[] args) { SpringApplication.run(DartApplication.class, args); } @Autowired public DartApplication(Diablo diablo) { this.diablo = diablo; } private final Diablo diablo; @Override public void run(String... args) { this.diablo.firenova(); }}
总之,基于 Spring Boot 开发控制台程序,就是实现个接口,其他照旧即可。