Spring Boot总结(二):Spring Boot中使用数据库
Spring Boot总结(三):Spring Boot界面设计
Spring Boot总结(六):Spring Boot SSO
10.1 Spring Boot 主程序的功能
Spring Boot应用的一个典型主程序,使用了@SpringBootApplication注解,并使用一个main方法运行SpringApplication的run方法,这个简单的主程序将会加载一个应用所需要的所有资源和配置,最后启动一个应用实例;
1. SpringApplication的run方法
在run方法中,它首先开启一个SpringApplicationRunListeners监听器,然后创建一个应用上下文ConfigurableApplicationContext,通过这个上下文加载应用所需的类和各种环境配置等,最后启动一个应用实例;
在Spring框架中,加载一个应用,主要是通过一些复杂的配置来实现的,SpringBoot帮助我们事先实现了而已;
2. 创建应用上下文
一个应用能够正常的运行起来,需要一些环境变量、各种资源以及一些相关配置
在创建应用上下文ConfigurableApplicationContext的源代码中,我们可以看到这种实现机制;
其中,this.load将调用BeanDefinitionLoader来加载应用定义的和需要的类以及各种资源;
3.自动加载
在BeanDefinitionLoader中,有一个load(Class<?> source)方法用来加载类定义,source就是主程序的.class文件,在程序中通过isComponent检查是否存在直接,如果有注解,则调用注解相关的类定义。这样注解@SpringBootApplication将被调用,它不但会导入一系列自动配置的类,还会加载应用中一些自定义的类;
10.2 Spring Boot自动配置原理
所有的自动配置都是从注解@SpringBootApplication引入的
@SpringBootApplication注解其实又包含了三个非常重要的注解:
- @Configuration
- @EnableAutoConfiguration 启用自动配置的,并将导入一些自动配置的类定义
- ComponentScan 将扫描和加载应用中的一些自定义的类
1.自动配置的即插即用原理
EnableAutoConfiguration 最终会导入一个自动配置的类列表,列表中自动配置的类很多,这些配置类中大都被导入,并处于备用状态,这如同电器准备了插槽一样,即实现了即插即用的原理,这样,当项目中引入了相关的包的时候,相关的功能将被启用,例如在项目的
Maven配置引入了Redis的引用,那么Redis的功能将被启用,这时候启动应用,程序将尝试读取有关Redis的配置信息;
2. 自动配置的约定优先原理
在自动配置中加载一个类的配置的时候,首先读取项目中的配置信息,如果项目中没有找到相关配置,才启用配置的默认值,这就是自动配置的约定优先原理;
10.3 提升应用的性能
Spring Boot的自动配置提供便利的同时,也有些副作用,增加了应用启动的时间,一些内存和CPU的消耗等;
如果应用对性能要求较高,就可以根据自动配置的原理,使用一些技巧进行优化;
1. 更改加载配置的方式
如果能够清楚一个应用需要那些配置,就能够更改加载配置的方式,即不使用自动配置, 而是改为指定加载一些应用所需要的配置;
为了弄清楚一个应用需要加载哪些配置,可以使用Maven调试的方式来启动一个应用,然后从控制台的输出日志中,确定哪些是这个应用需要加载的配置类。
以debug方式运行应用,然后在控制台中找出Positive matches的类。Positive matches就是这个应用所需加载的一些配置类;
根据这个类的加载列表,就可以使用注解@Configuration来代替注解@SpringBootApplication,并用注解@Import指定需要加载的配置类,从而去除掉没有使用到的配置类;
注意:这种改造的作用并不是特别的明显;
2.将Tomcat换成Jetty
另外,为了提高应用的性能,还可以更改默认使用的Tomcat插件,换成更加小巧的Jetty插件,使用如下的配置即可排除引用默认的Tomcat,转而引用Jetty的依赖:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
</dependency>
</dependencies>
在VM options中输入一些配置参数可以使用Jconsole来观察应用运行的各项性能指标;
应用启动之后,使用Jconsole新建一个连接,可以观察应用运行的各项性能指标;包括堆内存、线程、加载的类、CPU占有率;