首页>>后端>>SpringBoot->springboot启动参数?

springboot启动参数?

时间:2023-12-01 本站 点击:0

SpringBoot的启动过程及部分注解

相比于以前繁琐的基于 Spring 的 Web 应用,SpringBoot 通过默认配置很多框架的方式,极大的简化了项目的搭建以及开发流程。

一个简单的 SpringBoot 应用只需要三步:

1.在 pom.xml 中引入所需要的依赖

2.在 application.yml 配置所需的数据源

3.在启动类中加入 @SpringBootApplication 注解 以及 run 方法

启动流程

1.SpringApplication.run()启动

2.新建 SpringApplication 实例,主要是初始化一些成员变量,参数列表等

prepareContext():

refreshContext() 中 refresh():

核心注解(部分)

@SpringBootAppliction 启动类

@Configuration + @EnableAutoConfiguration + @ComponentScan

@Configuration

允许在应用上下文中注册其它的 bean,可用 @Component代替

@Configuration 会为 bean 创建一个代理类,这个类会拦截所有被 @Bean 修饰的方法,从容器中返回所需要的单例对象;@Component 不会创建代理类,会直接执行方法,每次返回一个新的对象

@EnableAutoConfiguration

启用 springboot 自动装配,该参数位于 spring.factories 中 org.springframework.boot.autoconfigure.EnableAutoConfiguration

@ComponentScan

扫描被@Component (@Service,@Controller)注解的 bean,注解默认会扫描该类所在的包下所有的类

@Autowired

自动导入对象到类中,被注入进的类被 Spring 容器管理 Service-Controller

@Component

通用的注解,可标注任意类为 Spring 组件

@Repository 持久层

@Service 服务层

@Controller 控制层

@Bean

用于告诉方法产生一个 Bean 对象,然后这个对象交给 IOC 容器管理。产生这个Bean对象的方法Spring只会调用一次,然后将这个Bean对象放在 IOC 容器中

springboot启动流程

springboot启动流程如下:

启动流程主要分为三个部分,第一部分进行、SpringApplication的初始化模块,配置一些基本的环境变量、资源、构造器、监听器,第二部分实现了应用具体的启动方案,包括启动流程的监听模块、加载配置环境模块。

及核心的创建上下文环境模块,第三部分是自动化配置模块,该模块作为springboot自动配置核心,在后面的分析中会详细讨论。在下面的启动程序中我们会串联起结构中的主要功能。

启动过程主要做了以下几件事情:

配置属性、获取监听器,发布应用开始启动事件初、始化输入参数、配置环境,输出banner、创建上下文、预处理上下文、刷新上下文(加载tomcat容器)、再刷新上下文、发布应用已经启动事件、发布应用启动完成事件。

在SpringBoot中启动tomcat的工作在刷新上下这一步。

而tomcat的启动主要是实例化两个组件:Connector、Container,一个tomcat实例就是一个Server,一个Server包含多个Service,也就是多个应用程序,每个Service包含多个Connector和一个Container,而一个Container下又包含多个子容器。

Spring Boot 在命令行指定主类启动程序

Spring Boot 程序我们一般会设置使用 spring-boot-maven-plugin 来生成 jar 包,配置类似于:

这样我们可以通过 -jar 的方式直接启动并执行指定的 start-class 类的 main 函数:

但当我们需要指定并执行其他类的 main 函数时,使用 -cp 参数却行不通:

因为 Spring Boot 打包时做了处理,启动时的主类也不再是用户指定的,而是由 Spring Boot 启动后代为调用执行。

此时我们就需要一些 trick 来解决这个问题。

首先我们要改变 spring-boot-maven-plugin 的参数:

增加了 layoutZIP/layout 一行。这将使 Spring Boot 使用 PropertiesLauncher 。

然后

可以看到,事实上是以 org.springframework.boot.loader.PropertiesLauncher 作为主类启动的,设置了 loader.main 的值,由 Spring Boot 调用执行。

参考文章:

Spring Boot使用@Schedule启动、停止服务

在spring boot项目的Application类中增加@EnableScheduling注释,创建bean组件(Component),并使用@Scheduled(cron= "0 0/20 * * * ?")

1、这种方式基本就是全局开启了该定时任务,如果直接将任务内容写在其中,那么很难对定时任务的开关进行控制。

2、服务中的异常也无法使用全局异常捕获的方式进行处理。

3、这种定时任务为单线程方式

1、将服务定义成Service,使用Controller控制器调用Service服务,在定时任务中通过RestTemplate访问本地的Controller地址。这解决了全局异常捕获的问题。

2、在配置文件中定义定时任务是否启动的配置项,Schedule中先判断该参数是否为启动。假设默认配置为启动状态,需要对定时任务进行关闭,那么可以在Controller定义一个接口,用来将该参数设置为停止状态。这解决了定时任务的启动与停止切换问题。

3、将其改造为多线程,一般使用线程池,百度上N多案例,不在此介绍

Spring Boot 配置的优先级

本文主要参考 Externalized Configuration

为了能让应用在不同的环境下运行,Spring Boot允许自定义配置文件,如properties文件、yaml文件、系统环境变量参数、命令行参数。配置文件的覆盖优先级如下

Developer Tools 提供了一些开发帮助工具,在build.gradle添加依赖后启用。

Spring Boot会读取在计算机用户的home目录下的 .spring-boot-devtools.properties 文件里的配置参数到该计算级的所有Spring Boot应用中作为顶层配置,如Linux环境下root用户下 ~/.spring-boot-devtools.properties 文件。开发过程中,可以将一些个人参数记录在这个配置文件中,例如ip地址,机器uuid,datasource参数等。在该配置文件中的定义的配置环境并不会影响到应用配置的读取,官方原话是:

但要注意,该配置优先级最高,设置的时候需要做好记录否则会出现"原因不明的bug",不过应该很少人会用到这个功能。分析下源码,就是加了一个配置切面,并把其设置为顶层配置:

在测试的时候,可能会使用另一套测试专用的配置,该套配置的优先级高于系统环境变量、java系统参数、程序内部参数, @TestPropertySource 注解就是用来指定这一类配置的。该注解一共有5个参数可以设置:

如果使用注解的时候没有任何参数,那么会从标注了注解的测试类的包中尝试读取配置文件,例如测试类 com.spring.test.DemoTest ,那么相应的默认配置文件为 com.spring.test.DemoTest.properties ,如果没有找到默认的配置文件则抛出非法状态异常。

AbstractTestContextBootstrapper 在初始化上下文的时候会调用一个读取、合并配置的方法 buildMergedContextConfiguration ,该方法通过工具类 TestPropertySourceUtils 读取类的注解信息。 TestPropertySourceUtils 从类的注解解析配置信息后返回一个可合并的配置源。

@SpringBootTest 的value\properties属性用于注入一些自定义的注解,语法要求和 @TestPropertySource 的properties一样,这里就不详细展开了。

用命令行方式启动Spring Boot应用程序的时候,可以注入一些配置参数,参数的格式是 --key=name 。举个简单的例子,程序直接输出一个参数,然后打成jar包后运行。

运行:

java -jar .\springbootconfiguraiton.jar --cl.name="Spring Boot Arguments"

从输出的结果中可以看到可以读取到命令行中的配置。

可以在环境变量中定义一个key为SPRING_APPLICATION_JSON的参数,值为json字符串,Spring Boot会解析该json字符串作为参数注入到系统中。SPRING_APPLICATION_JSON可以定义在环境变量、系统配置中,命令行也是可以的,例如命令行参数中用到的demo,执行以下的命令也应该能得到相同的参数结果。

java -jar .\springbootconfiguraiton.jar SPRING_APPLICATION_JSON='{"cl":{"name"="Spring Boot Arguments"}}'

结果输出是undefined,不知道原因,这个配置方式用的应该也很少,放弃研究。。。

优先级是 ServletConfig ServletContext ,可以在application.yml中设置:

随机数配置大多用于测试,支持的类型如下:

其中long\int可以限制数据范围,[]是闭区间,()是开区间。

这个应该是我们用的最多的。首先说优先级,文件可以放在以下4个位置,相同文件从上到下覆盖。外部指的是启动应用程序的目录,例如gradle用application插件打包后,运行的脚本目录就是 ./ :

文件的命名为 application-[当前激活的环境名].[yml/properties] ,当前激活的配置可以用 spring.profile.active=[当前激活的环境名] 定义,多个环境名用逗号分隔,未设置时用 default 标识。关于如果修改默认的加载路径和文件名,后面会继续讨论。

Spring Boot系统启动时默认会读取的配置文件,支持properties\yml格式。也就是说,会先加载 application.properties ,根据 spring.profile.active 的设置加载相应的 application-XX.properties 配置,然后按优先级合并配置文件。

不同文件目录下application.properties的优先级和 自定义配置文件 的顺序是一样的。

类似 @TestPropertySource注解 ,在项目中可以方便的注入自定义的配置文件,注解一共有5个参数:

SpringBoot修改JVM参数(内置Tomcat命令行启动和IDEA工具配置修改)

在 “-jar” 之前加上相应参数即可

-Xms:初始堆的分配大小,默认为物理内存的六十四分之一(Server端JVM最好将-Xms和-Xmx设为相同值);

-Xmx:堆的最大分配大小(默认为物理内存的四分之一);

-Xmn   Java Heap Young区大小,不熟悉最好保留默认值;

 -Xss   每个线程的Stack大小,不熟悉最好保留默认值;

-XX:+UseG1GC:用这个GC;

-XX:+PrintGCDetails:打印信息;

修改相应的 VM options参数即可

复制粘贴到txt文件中,之后,记得改后缀名为“.bat”

TITLE 数据上报 8090

"C:\Users\guany\Desktop\开发\JDK8\bin\java.exe" -Xms512m -Xmx512m -XX:+UseG1GC -XX:+PrintGCDetails -jar pt_dataPush_api-1.0.0.jar

pause

1


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:/SpringBoot/6093.html