Spring Boot总结(十):自动配置实现原理

Spring Boot总结(一):入门

Spring Boot总结(二):Spring Boot中使用数据库

Spring Boot总结(三):Spring Boot界面设计

Spring Boot总结(四):提高数据库访问性能

Spring Boot总结(五):安全设计

Spring Boot总结(六):Spring Boot SSO

Spring Boot总结(七):使用分布式文件系统

Spring Boot总结(八):云应用开发

Spring Boot总结(九):构建高性能的服务平台

Spring Boot总结(十):自动配置实现原理

Spring Boot总结(十一):数据访问实现原理

Spring Boot总结(十二):微服务核心技术实现原理

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注解其实又包含了三个非常重要的注解:

  1. @Configuration
  2. @EnableAutoConfiguration  启用自动配置的,并将导入一些自动配置的类定义
  3. 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占有率;

猜你喜欢

转载自blog.csdn.net/qq_36807862/article/details/81285040
今日推荐