相比于以前繁琐的基于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下又包含多个子容器。
SpringBoot在命令行指定主类启动程序
SpringBoot程序我们一般会设置使用spring-boot-maven-plugin来生成jar包,配置类似于:
这样我们可以通过-jar的方式直接启动并执行指定的start-class类的main函数:
但当我们需要指定并执行其他类的main函数时,使用-cp参数却行不通:
因为SpringBoot打包时做了处理,启动时的主类也不再是用户指定的,而是由SpringBoot启动后代为调用执行。
此时我们就需要一些trick来解决这个问题。
首先我们要改变spring-boot-maven-plugin的参数:
增加了layoutZIP/layout一行。这将使SpringBoot使用PropertiesLauncher。
然后
可以看到,事实上是以org.springframework.boot.loader.PropertiesLauncher作为主类启动的,设置了loader.main的值,由SpringBoot调用执行。
参考文章:
SpringBoot使用@Schedule启动、停止服务在springboot项目的Application类中增加@EnableScheduling注释,创建bean组件(Component),并使用@Scheduled(cron="00/20***?")
1、这种方式基本就是全局开启了该定时任务,如果直接将任务内容写在其中,那么很难对定时任务的开关进行控制。
2、服务中的异常也无法使用全局异常捕获的方式进行处理。
3、这种定时任务为单线程方式
1、将服务定义成Service,使用Controller控制器调用Service服务,在定时任务中通过RestTemplate访问本地的Controller地址。这解决了全局异常捕获的问题。
2、在配置文件中定义定时任务是否启动的配置项,Schedule中先判断该参数是否为启动。假设默认配置为启动状态,需要对定时任务进行关闭,那么可以在Controller定义一个接口,用来将该参数设置为停止状态。这解决了定时任务的启动与停止切换问题。
3、将其改造为多线程,一般使用线程池,百度上N多案例,不在此介绍
SpringBoot配置的优先级本文主要参考ExternalizedConfiguration
为了能让应用在不同的环境下运行,SpringBoot允许自定义配置文件,如properties文件、yaml文件、系统环境变量参数、命令行参数。配置文件的覆盖优先级如下
DeveloperTools提供了一些开发帮助工具,在build.gradle添加依赖后启用。
SpringBoot会读取在计算机用户的home目录下的.spring-boot-devtools.properties文件里的配置参数到该计算级的所有SpringBoot应用中作为顶层配置,如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一样,这里就不详细展开了。
用命令行方式启动SpringBoot应用程序的时候,可以注入一些配置参数,参数的格式是--key=name。举个简单的例子,程序直接输出一个参数,然后打成jar包后运行。
运行:
java-jar.\springbootconfiguraiton.jar--cl.name="SpringBootArguments"
从输出的结果中可以看到可以读取到命令行中的配置。
可以在环境变量中定义一个key为SPRING_APPLICATION_JSON的参数,值为json字符串,SpringBoot会解析该json字符串作为参数注入到系统中。SPRING_APPLICATION_JSON可以定义在环境变量、系统配置中,命令行也是可以的,例如命令行参数中用到的demo,执行以下的命令也应该能得到相同的参数结果。
java-jar.\springbootconfiguraiton.jarSPRING_APPLICATION_JSON='{"cl":{"name"="SpringBootArguments"}}'
结果输出是undefined,不知道原因,这个配置方式用的应该也很少,放弃研究。。。
优先级是ServletConfigServletContext,可以在application.yml中设置:
随机数配置大多用于测试,支持的类型如下:
其中long\int可以限制数据范围,[]是闭区间,()是开区间。
这个应该是我们用的最多的。首先说优先级,文件可以放在以下4个位置,相同文件从上到下覆盖。外部指的是启动应用程序的目录,例如gradle用application插件打包后,运行的脚本目录就是./:
文件的命名为application-[当前激活的环境名].[yml/properties],当前激活的配置可以用spring.profile.active=[当前激活的环境名]定义,多个环境名用逗号分隔,未设置时用default标识。关于如果修改默认的加载路径和文件名,后面会继续讨论。
SpringBoot系统启动时默认会读取的配置文件,支持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??JavaHeapYoung区大小,不熟悉最好保留默认值;
?-Xss??每个线程的Stack大小,不熟悉最好保留默认值;
-XX:+UseG1GC:用这个GC;
-XX:+PrintGCDetails:打印信息;
修改相应的VMoptions参数即可
复制粘贴到txt文件中,之后,记得改后缀名为“.bat”
TITLE数据上报8090
"C:\Users\guany\Desktop\开发\JDK8\bin\java.exe"-Xms512m-Xmx512m-XX:+UseG1GC-XX:+PrintGCDetails-jarpt_dataPush_api-1.0.0.jar
pause
1
logo设计
创造品牌价值
¥500元起
APP开发
量身定制,源码交付
¥2000元起
商标注册
一个好品牌从商标开始
¥1480元起
公司注册
注册公司全程代办
¥0元起
查
看
更
多
springboot启动参数?
用命令行方式启动SpringBoot应用程序的时候,可以注入一些配置参数,参数的格式是--key=name。举个简单的例子,程序直接输出一个参数,然后打成jar包后运行。 运行: java-jar.\\springbootconfiguraiton.jar--cl.name="SpringBootArguments" 从输出的结果中可以看到可以读取到命令行中的配置。 可以在环境变量中定义一个k...
springboot启动配置(springboot启动配置文件加载顺序)
3.在启动类中加入@SpringBootApplication注解以及run方法 启动流程 1.SpringApplication.run()启动 2.新建SpringApplication实例,主要是初始化一些成员变量,参数列表等 prepareContext(): refreshContext()中refresh(): 核心注解(部分) @SpringBootAppliction启动类 @Configuration+@EnableAutoConfiguration+@ComponentScan @Con...
【SpringBoot 一】SpringApplication启动类的Args详解
传递参数的一种方式,如在启动时使用java -jar --spring.profiles.active=prod或更改自定义配置信息。使用方式是--key=value,其配置优先于项目内部的配置。在大部分使用SpringBoot进行开发的项目中,启动类的格式通常是SpringApplication.run(SpringBootDemoPropertiesApplication.class, args);然而,在日常使...
Spring Boot 3系列之-启动类详解
启动类上 @SpringBootApplication 注解,组合了三个注解:@SpringBootConfiguration, @EnableAutoConfiguration 和 @ComponentScan。@SpringBootConfiguration 是配置类注解,@EnableAutoConfiguration 自动配置组件,@ComponentScan 扫描并注册组件。源码展示:@SpringBootConfiguration 与 @Configuration 类似,用于标注...
springboot怎么运行(springboot怎么运行html)
SpringBootRun方法是一个静态方法,它可以接受一个参数,该参数是一个字符串数组,其中包含要传递给应用程序的参数。在项目中,SpringBoot启动后,需要初始化一些业务,要在服务启动后自动执行,不用人去手动操作,即把一些业务放到某方法中,服务启动后可自动执行。org.springframework.boot.CommandLineRunner...
springboot启动过程图解(springboot的启动流程图)
SpringBoot的启动主要是通过实例化SpringApplication来启动的。启亏竖胡动过程主要做了以下几件事情:配置属性、获取监听器,发布应用开始启动事件初、始化输入参数、配置环境,输出banner、创建上下文、预处理上下文、刷新上下文(加载tomcat容器)、再刷新上下文、发布应用已经启动事件、发布应用启动完成事件。在...
springboot环境配置(配置springboot的环境)
1、在配置文件中指定spring.profiles.active=dev 2、在命令行: java-jarspring-boot-02-config.jar--spring.profiles.active=dev; 可以直接在测试的时候,配置传入命令行参数 3.虚拟机参数 -Dspring.profiles.active=dev springboot启动会扫描以下位置的application.properties或者application.yml文件作为SpringBoot的默认...
springboot常用配置?
:##@SpringBootApplication标识该类为SpringBoot项目启动类。springboot三大核心注解是Configuration,EnableAuto,ComponentScan。SpringBoot最大的特点是无需XML配置文件,能自动扫描包路径装载并注入对象,并能做到根据classpath下的jar包自动配置。SpringBoot的Controller中经常会用到注解@Controller、@...
idea springboot 启动参数设置问题
你直接调试如果能调试成功的话 。进入你这个程序的文件夹进入那个bin文件夹 里面有个exe文件 就是调试生成的如果你没有使用dll文件引用那么把这个exe文件可以直接复制出来使用
springboot启动运行特定代码
在Spring Boot中,我们可以通过使用ApplicationRunner或者CommandLineRunner接口来实现在Spring Boot启动时运行特定代码。一、背景与需求说明 在Spring Boot应用中,有时我们需要在应用启动时运行一些特定的代码,比如进行数据初始化、预加载缓存等操作。为了满足这种需求,Spring Boot提供了两个接口:ApplicationRunner...