一 .SpringBoot启动方式讲解和部署war项目到tomcat9
简介:SpringBoot常见启动方式讲解和部署war项目Tomcat
1.springboot启动有多中启动方式,前几节课我们用了直接启动主程序类Application.java即可
还有打jar包之后 java -jar xxx 方式启动,今天我们讲另外的一种方法。
2、war包方式启动: 这种启动springboot用的少,但是开发中可能也用到
1)在pom.xml中将打包形式 jar 修改为war <packaging>war</packaging>
2)构建项目名称 <finalName>xdclass_springboot</finalName>
3)生成war包:工程右键Run As Maven install 在target下即可生成war包
4)修改我们的启动类
5)此时再Maven clean 一下,我们的target就空的了,再 Maven install
6)去下载tocmat: https://tomcat.apache.org/download-90.cgi
7)下载之后,解压进入webapps 将里面的文件删除
8)将我们做好的war包放进来
9) 进入bin目录双击startup.bat 即可,
注意如果出现闪退 说明配置不对
解决:打开startup.bat文件在最后一行加上pause 暂停就不必闪退
启动之后会将war解压
10)访问一下打war时里面的controller 方法
11)结果如下
补充:启动容器介绍和第三方测试数据讲解
使用Jmter测试工具测试性能,QPS,TPS,RT
Tomcat vs. Jetty vs. Undertow:Spring Boot嵌入式Servlet容器的比较
网站: https://examples.javacodegeeks.com/enterprise-java/spring/tomcat-vs-jetty-vs-undertow-comparison-of-spring-boot-embedded-servlet-containers/
二 ,启动原理分析
关于springboot启动原理部分我这里引用简书上一个大神写的
http://tengj.top/2017/03/09/springboot3/
正文
我们开发任何一个Spring Boot项目,都会用到如下的启动类
从上面代码可以看出,Annotation定义(@SpringBootApplication)和类定义(SpringApplication.run)最为耀眼,所以要揭开SpringBoot的神秘面纱,我们要从这两位开始就可以了。
虽然定义使用了多个Annotation进行了原信息标注,但实际上重要的只有三个Annotation:
-
@Configuration(@SpringBootConfiguration点开查看发现里面还是应用了@Configuration)
-
@EnableAutoConfiguration
-
@ComponentScan
所以,如果我们使用如下的SpringBoot启动类,整个SpringBoot应用依然可以与之前的启动类功能对等:
每次写这3个比较累,所以写一个@SpringBootApplication方便点。接下来分别介绍这3个Annotation。
@Configuration
这里的@Configuration对我们来说不陌生,它就是JavaConfig形式的Spring Ioc容器的配置类使用的那个@Configuration,
SpringBoot社区推荐使用基于JavaConfig的配置形式,所以,这里的启动类标注了@Configuration之后,本身其实也是一个IoC容器的配置类。
举几个简单例子回顾下,XML跟config配置方式的区别:
表达形式层面
基于XML配置的方式是这样:
任何一个标注了@Configuration的Java类定义都是一个JavaConfig配置类。
-
注册bean定义层面
基于XML的配置形式是这样 -
如果一个bean的定义依赖其他bean,则直接调用对应的JavaConfig类中依赖bean的创建方法就可以了。
@ComponentScan
@ComponentScan这个注解在Spring中很重要,它对应XML配置中的元素,@ComponentScan的功能其实就是
自动扫描并加载符合条件的组件(比如@Component和@Repository等)或者bean定义,最终将这些bean定义加载到IoC容器中。
我们可以通过basePackages等属性来细粒度的定制@ComponentScan自动扫描的范围,如果不指定,则默认Spring框架实现
会从声明@ComponentScan所在类的package进行扫描。
注:所以SpringBoot的启动类最好是放在root package下,因为默认不指定basePackages。
@EnableAutoConfiguration
个人感觉@EnableAutoConfiguration这个Annotation最为重要,所以放在最后来解读,大家是否还记得Spring框架
提供的各种名字为@Enable开头的Annotation定义?比如@EnableScheduling、@EnableCaching、@EnableMBeanExport等,
@EnableAutoConfiguration的理念和做事方式其实一脉相承,简单概括一下就是,借助@Import的支持,收集和注册特定场景相关的bean定义。
-
@EnableScheduling是通过@Import将Spring调度框架相关的bean定义都加载到IoC容器。
-
@EnableMBeanExport是通过@Import将JMX相关的bean定义加载到IoC容器。
而@EnableAutoConfiguration也是借助@Import的帮助,将所有符合自动配置条件的bean定义加载到IoC容器,仅此而已!
@EnableAutoConfiguration作为一个复合Annotation,其自身定义关键信息如下:
其中,最关键的要属@Import(EnableAutoConfigurationImportSelector.class),借助EnableAutoConfigurationImportSelector,
@EnableAutoConfiguration可以帮助SpringBoot应用将所有符合条件的@Configuration配置都加载到当前SpringBoot创建并使用的IoC容器,就像一只“八爪鱼”一样。
借助于Spring框架原有的一个工具类:SpringFactoriesLoader的支持,@EnableAutoConfiguration可以智能的自动配置功效才得以大功告成!
自动配置幕后英雄:SpringFactoriesLoader详解
SpringFactoriesLoader属于Spring框架私有的一种扩展方案,其主要功能就是从指定的配置文件META-INF/spring.factories加载配置。
上图就是从SpringBoot的autoconfigure依赖包中的META-INF/spring.factories配置文件中摘录的一段内容,可以很好地说明问题。
所以,@EnableAutoConfiguration自动配置的魔法骑士就变成了:从classpath中搜寻所有的META-INF/spring.factories配置文件,并将其中org.springframework.boot.autoconfigure.EnableutoConfiguration对应的配置项通过反射(Java Refletion)实例化为对应的标注了@Configuration的JavaConfig形式的IoC容器配置类,然后汇总为一个并加载到IoC容器。
深入探索SpringApplication执行流程
SpringApplication的run方法的实现是我们本次旅程的主要线路,该方法的主要流程大体可以归纳如下:
1) 如果我们使用的是SpringApplication的静态run方法,那么,这个方法里面首先要创建一个SpringApplication对象实例,然后调用这个创建好的SpringApplication的实例方法。在SpringApplication实例初始化的时候,它会提前做几件事情:
-
根据classpath里面是否存在某个特征类(org.springframework.web.context.ConfigurableWebApplicationContext)来决定是否应该创建一个为Web应用使用的ApplicationContext类型。
-
使用SpringFactoriesLoader在应用的classpath中查找并加载所有可用的ApplicationContextInitializer。
-
使用SpringFactoriesLoader在应用的classpath中查找并加载所有可用的ApplicationListener。
-
推断并设置main方法的定义类。