Spring Boot的自动配置、Command-line Runner

本文介绍如何使用start.spring.io创建SpringBoot项目,并详细讲解SpringBoot的自动配置原理及Command-lineRunner的应用场景。
Spring Boot的自动配置、Command-line Runner

接下来关于SpringBoot的一系列文章和例子,都来自《Spring Boot Cookbook》这本书,本文的主要内容是
start.spring.io的使用、Spring Boot的自动配置以及CommandRunner的角色和应用场景。


1. start.spring.io的使用
首先带你浏览http://start.spring.io/,在这个网址中有一些Spring Boot提供的组件,然后会给你展示如何
让你的Spring工程变得“Bootiful”,我称之为“Boot化”。


在网站Spring Initializr上填对应的表单,描述Spring Boot项目的主要信息,例如Project Metadata、
Dependency等。在Project Dependencies区域,你可以根据应用程序的功能需要选择相应的starter。


Spring Boot starters可以简化Spring项目的库依赖管理,将某一特定功能所需要的依赖库都整合在一起,
就形成一个starter,例如:连接数据库、springmvc、spring测试框架等等。简单来说,spring boot使得
你的pom文件从此变得很清爽且易于管理。


常用的starter以及用处可以列举如下:

spring-boot-starter: 这是核心Spring Boot starter,提供了大部分基础功能,其他starter都依赖于
它,因此没有必要显式定义它。
spring-boot-starter-actuator:主要提供监控、管理和审查应用程序的功能。
spring-boot-starter-jdbc:该starter提供对JDBC操作的支持,包括连接数据库、操作数据库,以及管理
数据库连接等等。
spring-boot-starter-data-jpa:JPA starter提供使用Java Persistence API(例如Hibernate等)的依
赖库。
spring-boot-starter-data-*:提供对MongoDB、Data-Rest或者Solr的支持。
spring-boot-starter-security:提供所有Spring-security的依赖库。
spring-boot-starter-test:这个starter包括了spring-test依赖以及其他测试框架,例如JUnit和
Mockito等等。
spring-boot-starter-web:该starter包括web应用程序的依赖库。

How do
首先我们要通过start.spring.io创建一个图书目录管理程序,它会记录出版图书的记录,包括作者、审阅人、出版社等等。我们将这个项目命名为BookPub,具体的操作步骤如下:

点击“Switch to the full version.”,展示完整页面;
Group设置为:org.test;
Artifact设置为:bookpub;
Name设置为:BookPub;
Package Name设置为:org.test.bookpub;
Packaging代表打包方式,我们选jar;
Spring Boot Version选择最新的1.3.0;
创建Maven工程,当然,对Gradle比较熟悉的同学可以选择Gradle工程。
点击“Generate Project”下载工程包。
利用IDEA或eclipse导入下载的工程,可以看到pom文件的主体如下如下所示:

<groupId>com.test</groupId>
    <artifactId>bookpub</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>BookPub</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.3.0.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

2. Spring Boot的自动配置

在Spring Boot项目中,xxxApplication.java会作为应用程序的入口,负责程序启动以及一些基础性的工
作。@SpringBootApplication是这个注解是该应用程序入口的标志,然后有熟悉的main函数,通过
SpringApplication.run(xxxApplication.class, args)来运行Spring Boot应用。打开
SpringBootApplication注解可以发现,它是由其他几个类组合而成的:@Configuration(等同于spring中
的xml配置文件,使用Java文件做配置可以检查类型安全)、@EnableAutoConfiguration(自动配置,稍后细
讲)、@ComponentScan(组件扫描,大家非常熟悉的,可以自动发现和装配一些Bean)。


我们在pom文件里可以看到,com.h2database这个库起作用的范围是runtime,也就是说,当应用程序启动
时,如果Spring Boot在classpath下检测到org.h2.Driver的存在,会自动配置H2数据库连接。现在启动应
用程序来观察,以验证我们的想法。打开shell,进入项目文件夹,利用mvn spring-boot:run启动应用程
序,如下图所示。

Spring Bootçèªå¨éç½® 

可以看到类似Building JPA container EntityManagerFactory for persistence unit 'defaultHHH000412: Hibernate Core {4.3.11.Final}HHH000400: Using dialect: org.hibernate.dialect.H2Dialect这些Info信息;由于我们之前选择了jdbc和jpa等starters,Spring Boot将自动创建JPA容器,并使用Hibernate4.3.11,使用H2Dialect管理H2数据库(内存数据库)。

 

3. 使用Command-line runners

我们新建一个StartupRunner类,该类实现CommandLineRunner接口,

这个接口只有一个函数:public void run(String... args)

最重要的是:这个方法会在应用程序启动后首先被调用

How do
在src/main/java/org/test/bookpub/下建立StartRunner类,代码如下:

package com.test.bookpub;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.CommandLineRunner;

public class StartupRunner implements CommandLineRunner {
    protected final Logger logger = LoggerFactory.getLogger(StartupRunner.class);
    @Override
    public void run(String... strings) throws Exception {
        logger.info("hello");
    }
}

在BookPubApplication类中创建bean对象,代码如下:
    @Bean
    public StartupRunner schedulerRunner() {
        return new StartupRunner();
    }

还是用mvn spring-boot:run命令启动程序,可以看到hello的输出。对于那种只需要在应用程序启动时执行
一次的任务,非常适合利用Command line runners来完成。Spring Boot应用程序在启动后,会遍历
CommandLineRunner接口的实例并运行它们的run方法。也可以利用@Order注解(或者实现Order接口)来规定
所有CommandLineRunner实例的运行顺序。


利用command-line runner的这个特性,再配合依赖注入,可以在应用程序启动时后首先引入一些依赖bean,
例如data source、rpc服务或者其他模块等等,这些对象的初始化可以放在run方法中。不过,需要注意的
是,在run方法中执行初始化动作的时候一旦遇到任何异常,都会使得应用程序停止运行,因此最好利用
try/catch语句处理可能遇到的异常。

转自:   http://www.jianshu.com/u/28d7875c78df

<think> 我们正在解决Spring Boot应用启动时出现的"Command line is too long"问题。根据之前的讨论,这个问题通常发生在Windows系统中,因为命令行长度有限制(约8191个字符)。Spring Boot应用启动时类路径(classpath)可能非常长,导致超出限制。以下是几种解决方案: ### 解决方案一:通过IntelliJ IDEA修改运行配置(推荐) 1. 打开运行配置:在IntelliJ IDEA中,点击右上角的运行配置下拉菜单,选择`Edit Configurations...`。 2. 选择应用配置:在`Run/Debug Configurations`窗口中,选择你的Spring Boot应用配置(例如`PPServiceApplication`)。 3. 修改命令行缩短选项: - 在配置选项卡中,找到`Shorten command line`选项(可能需要点击`Modify options`来展开更多选项)。 - 选择`JAR manifest`或`classpath file`。 - `JAR manifest`:将类路径存储在一个临时jar文件的manifest中。 - `classpath file`:将类路径存储在一个文本文件中。 4. 应用并运行:点击`Apply`,然后重新运行应用。 这种方法是最直接且有效的,因为它避免了在命令行中直接列出所有类路径,而是通过文件来传递[^1][^3]。 ### 解决方案二:调整Spring Boot Maven插件配置 在项目的`pom.xml`文件中,配置Spring Boot Maven插件以使用类路径索引(layers),这有助于减少类路径的长度: ```xml <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <layers> <enabled>true</enabled> </layers> </configuration> </plugin> </plugins> </build> ``` 配置后,重新构建项目(`mvn clean package`),然后运行生成的jar文件。这个配置通过创建分层jar来优化类路径,从而减少命令行长度[^2][^4]。 ### 解决方案三:缩短项目路径 将整个项目移动到一个较短的路径下,例如: - 原路径:`C:\Users\longusername\Documents\very-long-project-name\` - 新路径:`C:\dev\project\` 这样可以显著减少类路径中每个依赖项的路径长度。 ### 其他建议 - **清理依赖**:检查`pom.xml`文件,移除不必要的依赖,以减少类路径条目数量。 - **环境变量**:缩短`JAVA_HOME`、`MAVEN_HOME`等环境变量的路径。 ### 注意事项 - 以上方法中,**修改IntelliJ运行配置**是最常用且立即生效的解决方案。 - 如果使用命令行直接运行jar包,可以考虑使用`classpath file`方式。例如,可以将类路径写入一个文件,然后使用`@`符号引用: ``` java @classpath.txt -jar app.jar ``` 其中`classpath.txt`包含类路径信息(每行一个路径)。 --- ### 相关问题 1. 如何在Spring Boot中优化启动性能以减少类加载时间? 2. IntelliJ IDEA中还有哪些配置可以优化大型Spring Boot应用的启动? 3. 如何分析Maven依赖树并排除不必要的依赖? [^1]: Spring Boot命令行运行器接口的作用 [^2]: Spring Boot的端口配置 [^3]: 命令行设置Spring Boot配置文件和配置位置 [^4]: Spring Boot的核心优势 [^5]: 《学习Spring Boot 3.0》的内容简介 </think> ### 解决 Spring Boot 应用命令行过长问题的方法 针对您遇到的 **"Command line is too long. Shorten command line for PPServiceApplication or also for Spring Boot default configuration"** 错误💻,以下是已验证的解决方案(按优先级排序): --- #### ✅ 优先级1:修改 IDE 运行配置(推荐) **适用于 IntelliJ IDEA**: 1. 打开 `Run/Debug Configurations` 2. 选择您的 `PPServiceApplication` 配置 3. 在 `Configuration` 标签页找到 **`Shorten command line`** 选项 4. 修改为以下任一模式: - **`JAR manifest`**(生成临时 JAR 存储类路径) - **`classpath file`**(生成类路径文本文件) 5. 点击 `Apply` → 重新启动应用 ![IDEA 配置示例](https://example.com/shorten-cmd.png) > 💡 **原理**:将冗长的类路径存储在临时文件(.jar/.classpath)中,避免直接拼接命令行参数[^1][^3]。Windows 命令行上限为 8191 字符,此方法可绕过限制。 --- #### ✅ 优先级2:Spring Boot 插件优化 在 `pom.xml` 中添加类路径索引配置: ```xml <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <layers> <enabled>true</enabled> <!-- 关键参数 --> </layers> </configuration> </plugin> </plugins> </build> ``` 执行步骤: ```bash mvn clean package # 重新构建 java -jar target/your-app.jar # 启动 ``` 此配置通过分层打包优化类路径结构,减少启动命令长度[^2][^5]。 --- #### ✅ 优先级3:路径与环境优化 1. **缩短项目路径**: ```diff - C:\Users\long_name\projects\very_long_project_name\ + C:\dev\app\ ``` 2. **精简依赖**:排除无用库 ```xml <dependency> <groupId>com.example</groupId> <artifactId>unused-lib</artifactId> <exclusions> <exclusion> <groupId>transitive-dependency</groupId> </exclusion> </exclusions> </dependency> ``` 3. **简化启动命令**:使用配置文件替代参数[^3] ```bash # 替代:java -jar app.jar --long.param1=x --long.param2=y java -jar app.jar --spring.config.location=classpath:/short.conf ``` --- ### 效果对比 | 方案 | 命令行长度减少 | 适用场景 | |-----------------------|----------------|-----------------------| | IDE 配置 (`JAR manifest`) | 70%-90% | 开发环境调试 | | Spring Boot 分层打包 | 50%-70% | 生产部署 | | 路径缩短 | 30%-60% | 路径深度过大的项目 | --- ### 📝 注意事项 1. 优先尝试 **IDE 配置修改**,90% 案例可解决[^3] 2. 检查 `target` 目录下的 `spring-boot-classpath-index` 文件是否存在 3. 避免在参数中使用绝对路径,改用相对路径: ```bash # 不推荐 --spring.config.location=C:\long_path\config\app.properties # 推荐 --spring.config.location=classpath:/config/app.properties ``` --- ### 相关问题 1. 如何分析 Spring Boot 应用的类路径依赖树? 2. IntelliJ IDEA 中有哪些优化大型项目启动性能的技巧? 3. Spring Boot 分层打包(Layered JAR)的工作原理是什么? [^1]: CommandLineRunner 的作用与使用场景 [^2]: Spring Boot 的默认端口配置与修改方法 [^3]: 命令行设置活动配置文件的技巧 [^5]: Spring Boot 3.0 的新特性与优化
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值