3springboot执行原理及自动装配

spring boot将各个应用/三方框架 设置成了一个个“场景”stater,在pom.xml文件里面的spring-boot-starter-parent里面的spring-boot-dependencies依赖里面存储

 

 

 

spring-boot-dependencies:存储着各种三方框架的启动和一些依赖版本号,比如tomcat,spring boot把所有版本号都写好了,引用就不用指定版本号,而且版本号没有冲突,没有兼容性问题

我们创建springboot第一个项目时选择了spring web依赖,所以在pom.xml文件里面存在了web工程相关的依赖,这些依赖都是继承的依赖,不用从maven的远程仓库中下载。

 

     

Spring boot执行原理:

         @SpringBootApplication 注解: spring boot的主配置类,启动全部依赖这个配置类

@SpringBootApplication包含两个主要注解:

@SpringBootConfiguration@EnableAutoConfiguration

 

1、@SpringBootConfiguration:

包含@Configuration,表示“配置类”:

  1.该类是一个配置类  

  2.加了@Configuration注解的类,会自动纳入SpringIoc 容器

  Configuration和comopent作用相似,在spring里面comopent是把该类加进ioc容器中,springMVC的service,controller也是

2、@EnableAutoConfiguration:

  1. 开启spring boot自动配置

  2.包含两个主要注解:

    @AutoConfigurationPackage:自动获取主类的包名放入到扫描器

    @Import(AutoConfigurationImportSelector.class):满足条件自动把所依赖的三方依赖包引入。

 

@AutoConfigurationPackage大致流程:

 

@AutoConfigurationPackage里面的Registrar.class类自动找到@SpringBootApplication(main函数)所在类的包

 

获取到包名后自动把该包以及子包添加到注解扫描器里面

 

@Import(AutoConfigurationImportSelector.class)大致流程:

 

getCandidateConfigurations方法:获取三方依赖

里面的loadFactoryNames类的getResources方法获取三方依赖的文件。

 

这个文件路径:

  

spring boot在启动时,会根据META-INF/spring.factories找到相应的三方依赖,并将这些依赖引入本项目

 

总结:

   编写项目时,一般会 对自己写的代码  以及 三方依赖 进行配置。但是spring boot可以自动进行配置:

     a:自己写的代码,spring boot通@SpringBootConfiguration自动帮我们配置,加入springIoc容器中;

     b: 三方依赖 通过spring-boot-autoconfigure-2.0.3.RELEASE.jar(位置在Maven Dependencies的第4个)中的META-INF/spring.factories进行声明,然后通过@EnableAutoConfiguration开启使用即可

   spring-boot-autoconfigure-2.0.3.RELEASE.jar包中 包含了 J2EE整合体系中 需要的依赖。

 

    c.如何自动装配:

自动装配了这么多类,这些类是否都开启了?比如写一个helloWorld不需要用到这么多类。

研究org.springframework.boot.autoconfigure.web.servlet.HttpEncodingAutoConfiguration,\(该文件位置: spring-boot-autoconfigure-2.0.3.RELEASE.jar里面的倒数第6个包里面)

 

通过观察该源码 发现:

@Configuration:标识此类是一个配置类,将此类纳入springIoc容器

@EnableConfigurationProperties(HttpEncodingProperties.class):

通过HttpEncodingProperties将编码设置为了UTF_8 (即自动装配为UTF_8, 如何修改改编码:通过改HttpEncodingProperties的 predfix+属性名 进行修改 [配置文件中,yml/properties])

 

 

即:该注解给了默认编码utf8,并且提供了prefix+属性名 的方式 供我们修改编码。

 

自动装配的类启动是根据条件触发启动的

 

上面三个conditionXX都成立后,执行CharacterEncodingFilter,这个编码拦截器类,获取配置的编码方式,把请求和响应的编码设置为所配置的编码格式

      @ConditionalOnProperty(prefix = "spring.http.encoding", value = "enabled", matchIfMissing = true)

      当属性满足要求时,此条件成立  :要求 如果没有配置spring.http.encoding.enabled=xxx, 则成立。

  

总结:1每一个XXXAutoConfiguration (spring.factories配置文件里)

 

都有很多条件@ConditionalOnXxx,当这些条件都满足时,

   则此配置自动装配生效(utf-8)。但是我们可以手工修改 自动装配: XxxProperties文件中的  prefix(前缀).属性名=value 。例如:

 

2全局配置文件中的key, 来源于某个Properties文件中的 prefix+属性名

下图是一些conditionXXX条件

      如何知道 spring boot开启了哪些自动装配、禁止了哪些自动装配: application.properties中 ,在配置文件里面加上debug=true

 

运行主类(main)后,控制台显示

 

Positive matches列表 表示 spring boot自动开启的装配

Negative matches列表 表示spring boot在此时 并没有启用的自动装配。

猜你喜欢

转载自www.cnblogs.com/unlasting/p/12312362.html