[有书共读16]Spring Boot第二章
第二章 Spring Boot核心
Spring Boot的核心注解
- Spring Boot项目中一般会有注解*Application标注的入口类,入口类中会有main方法,特别的,用核心注解@SpringBootApplication标注的入口类就是Spring Boot项目的启动类,通常我们可以在main方法中通过SpringApplication.run()来启动项目。
- @SpringBootApplication注解是组合注解,主要组合以下注解:
- @SpringBootConfiguration:Spring Boot项目配置注解,也是一个组合注解。
- @EnableAutoConfiguration:启动自动配置,即根据依赖的jar包自动配置项目的相关配置项。
- @ComponentScan:扫描配置,Spring Boot默认会扫描@SpringBootApplication所在类的同级包以及它的子包。
Spring Boot的基本配置
- 关闭自动配置(以关闭Redis自动配置为例)
@SpringBootApplication(exclude={RedisAutoConfiguration.class})
- 定制启动banner
- 在浏览器中打开网站TAAG如图所示
- 单击网站左下方“Select&Copy”,将图案保存至新建的bannner.text文件中。
- 再将该文件放入项目的src/main/resources目录下
- 启动程序效果如图所示
- 在浏览器中打开网站TAAG如图所示
- 应用的全局配置文件
在*src/main/resources*目录下创建一个*application.properties*或者*application.yml*文件就可用于修改Spring Boot项目的默认配置值
Spring Boot的自动配置原理
- Spring Boot在进行SpringApplication对象实例化是画家在META-INF/spring.factories文件,将该配置文件中的配置载入Spring容器,进行自动配置。
-
spring.factories分析
# PropertySource Loaders org.springframework.boot.env.PropertySourceLoader=\ org.springframework.boot.env.PropertiesPropertySourceLoader,\ org.springframework.boot.env.YamlPropertySourceLoader
PropertySourceLoader对应的值表示指定Spring Boot配置文件支持的格式。Spring Boot的配置文件内置支持properties、xml、yml和yaml几种格式,而properties和xml对应的Loader类为PropertiesPropertySourceLoader,yml和yaml对应则为YamlPropertySourceLoader。
# Run Listeners org.springframework.boot.SpringApplicationRunListener=\ org.springframework.boot.context.event.EventPublishingRunListener
SpringApplicationRunListener对应的值表示运行的***类。EventPublishingRunListener,顾名思义,在SpringApplication对象的run方法执行到不同的阶段时,发布相应的event给SpringApplication对象。
# Application Context Initializers org.springframework.context.ApplicationContextInitializer=\ org.springframework.boot.context.ConfigurationWarningsApplicationContextInitializer,\ org.springframework.boot.context.ContextIdApplicationContextInitializer,\ org.springframework.boot.context.config.DelegatingApplicationContextInitializer,\ org.springframework.boot.web.context.ServerPortInfoApplicationContextInitializer
ApplicationContextInitializer对应的值表示Spring Boot中的应用程序的初始化类。
ApplicationContextInitializer类| 作用
---|---
ConfigurationWarningsApplicationContextInitializer | 报告常见的配置错误
ContextIdApplicationContextInitializer | 给ApplicationContext设置一个ID
DelegatingApplicationContextInitializer | 将初始化的工作委托给context.initializer.classes环境变量指定的初始化器
ServerPortInfoApplicationContextInitializer | 监听EmbeddedServletContainerInitializedEvent类型的事件,将内嵌的Web服务器使用的端口设置到ApplicationContext中# Application Listeners org.springframework.context.ApplicationListener=\ org.springframework.boot.ClearCachesApplicationListener,\ org.springframework.boot.builder.ParentContextCloserApplicationListener,\ org.springframework.boot.context.FileEncodingApplicationListener,\ org.springframework.boot.context.config.AnsiOutputApplicationListener,\ org.springframework.boot.context.config.ConfigFileApplicationListener,\ org.springframework.boot.context.config.DelegatingApplicationListener,\ org.springframework.boot.context.logging.ClasspathLoggingApplicationListener,\ org.springframework.boot.context.logging.LoggingApplicationListener,\ org.springframework.boot.liquibase.LiquibaseServiceLocatorApplicationListener
ApplicationListener对应的值表示Spring Boot中的应用程序***,共9个。
*** | 作用
--- | ---
ClearCachesApplicationListener | 在Spring的context容器完成refresh()方法时调用,用来清除缓存信息
ParentContextCloserApplicationListener | 当容器关闭时发出通知,如果父容器关闭,那么子容器也一起关闭
FileEncodingApplicationListener | 获取环境中的系统环境参数,检测file.enconding和spring.mandatory-file-encoding设置的值是否一样,不一样则抛出异常
AnsiOutputApplicationListener | 如果终端支持ANSI,设置的彩色输出会让日志更具可读性
ConfigFileApplicationListener | 读取加载Spring Boot的配置文件如application.properties
DelegatingApplicationListener | 把Listener转发给配置的class处理,这样可以支持外围代码不去改写spring.factories中的org.springframework.context.ApplicationListener的相关配置,保持Spring Boot代码的稳定性
LiquibaseServiceLocatorApplicationListener | 如果相关的参数liquibase.servicelocator.ServiceLocator存在,则使用Spring Boot相关的版本进行代替
ClasspathLoggingApplicationListener | 程序启动时,将classpath打印到debug日志,启动失败时将classpath打印到info日志
LoggingApplicationListener | 根据配置初始化日志系统进行日志输出# Environment Post Processors org.springframework.boot.env.EnvironmentPostProcessor=\ org.springframework.boot.cloud.CloudFoundryVcapEnvironmentPostProcessor,\ org.springframework.boot.env.SpringApplicationJsonEnvironmentPostProcessor,\ org.springframework.boot.env.SystemEnvironmentPropertySourceEnvironmentPostProcessor
EnvironmentPostProcessor对应的值表示Spring Boot中支持的动态读取文件方式,默认两种方式。
方式 | 作用
--- | ---
CloudFoundryVcapEnvironmentPostProcessor | 对CloudFoundry提供支持
SpringApplicationJsonEnvironmentPostProcessor | 把环境中spring.application.json的json值转化为MapPropertySource,并将这个MapPropertySource添加到环境的属性源列表中 -
总结
@SpringBootApplication注解通过使用@EnableAutoConfiguration注解自动配置的原理:从classpath中搜寻所有所有的META-INF/spring.factories配置文件,并将其中org.springframework.boot.autoconfigure.EnableAutoConfiguration对应的配置项通过反射实例化为对应的标注了@Configuration的IoC容器配置类,然后汇总并加载到Spring框架的IoC容器。第二章 Spring Boot核心
Spring Boot的核心注解
- Spring Boot启动类与核心注解
Spring Boot的项目一般都会有注解*Application标注的入口类,入口类中会有一个main方法,main方法是一个标准的Java应用程序的入口方法,可以直接启动。@SpringBootApplication注解是SpringBoot核心注解,用此注解标注的入口类是应用的启动类,通常会在启动类的main方法中通过 SpringApplication.run(App.class, args) 来启动Spring Boot应用项目。@SpringBootApplication其实是一个组合注解,查看源码如下:@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @SpringBootConfiguration @EnableAutoConfiguration @ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class), @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) }) public @interface SpringBootApplication { @AliasFor(annotation = EnableAutoConfiguration.class, attribute = "exclude") Class<?>[] exclude() default {}; @AliasFor(annotation = EnableAutoConfiguration.class, attribute = "excludeName") String[] excludeName() default {}; @AliasFor(annotation = ComponentScan.class, attribute = "basePackages") String[] scanBasePackages() default {}; @AliasFor(annotation = ComponentScan.class, attribute = "basePackageClasses") Class<?>[] scanBasePackageClasses() default {}; }
- @SpringBootConfiguration:这是Spring Boot项目的配置注解,这也是一个组合注解:
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Configuration public @interface SpringBootConfiguration { -@EnableAutoConfiguration:启动自动配置,该注解会让SpringBoot根据当前项目所依赖的jar包自动配置项目的相关配置项。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
- @ComponentScan:扫描配置,Spring Boot默认会扫描@SpringBootApplication所在类的同级包以及它 的子包。所以建议将@SpringBootApplication修饰的入口类放置在项目包下(Group Id+Artifact Id),这 样做的好处是:可以保证Spring Boot项目自动扫描到项目所有的包。
Spring Boot的基本配置介绍
-
关闭某个自动配置
- 通过上节@SpringBootApplication下的@EnableAutoConfiguration得知,Spring Boot会根据项目中的jar 包依赖,自动做出配置,Spring Boot支持的自动配置如下(非常多):
-
例如:我们不想自动配置Redis,想自己手动配置呢?通过查看@SpringBootApplication的源码可以看出,关闭特定的自动配置应该使用@SpringBootApplication下的exclude参数,现以关闭Redis自动配置为例:
@SpringBootApplication(exclude={RedisAutoConfiguration.class})
- 定制启动banner
-
应用的全局配置文件
- 可以在Spring Boot项目的src/main/resources目录下或者在类路径下的/config目 录下创建一个全局的配置文件application.properties或者是后缀为.yml的application.yml的文件用于修 改Spring Boot项目的默认配置值,例如修改项目的默认端口,或者进入DispatcherServlet的请求地址规则。
- 通常,在实际开发中我们习惯使用application.properties文件作为应用的全局配置文件,一般我们放到src/main/resources目录下。例如,在src/main/resources目录下创建一个名称为application.properties的文件,配置内容如下:
server.port=9999
server.servlet-path=*.action
- Spring Boot的依赖模块
- Spring boot提供了很多简单项目开发的“开箱即用”的依赖模块,例如在项目中使用的pom.xml文件中的配置
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
- Spring Boot会自动关联Web开发相关的依赖,如Tomcat以及spring-webmve等,进而对Web开发进行支持,同时相关技术的配置也将实现自动配置,程序员即避开繁琐的配置文件了。
Spring Boot的自动配置原理
- Spring boot提供了很多简单项目开发的“开箱即用”的依赖模块,例如在项目中使用的pom.xml文件中的配置
-
源码分析
- 首先进入启动Spring Boot项目代码SpringApplication.run(App.class,args)的源码
public static ConfigurableApplicationContext run(Object[] sources,String[] args){ return new SpringApplication(source).run(args); }
-
@SpringBootApplication(exclude={RedisAutoConfiguration.class})
- Spring Boot会自动关联Web开发相关的依赖,如Tomcat以及spring-webmve等,进而对Web开发进行支持,同时相关技术的配置也将实现自动配置,程序员即避开繁琐的配置文件了。
- spring.factories文件分析
- spring factories用来指导Spring Boot找到指定的自动配置文件。
-
spring factories文件重点内容分析如下:
# PropertySource Loaders org.springframework.boot.env.PropertySourceLoader=\ org.springframework.boot.context.event.EventPublishingRunLister
- Spring Boot Web开发的自动配置
- 查询WebMvcAutoConfiguration的源码
@Configuration @ConditionalOnWebApplication @ConditionalOnClass({Servlet.class,DispatcherServlet.class, WebMvcConfigurerAdpter.class)} @ConditionalOnMissingBean(WebMvcConfigurationSupport.class) @AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE+10) @AutoConfigureAfter({DispatcherServletAutoConfiguration.class, ValidationAutoConfiguration.class}) public class WebMvcAutoConfiguration{
- 自动配置视图解析器ViewResolver
在WebMvcAutoConfiguration类下找到以下源码:@Bean @ConditionalOnMissingBean public InternalResourceViewResolver defaultViewResolver(){ InternalResourceViewResolver resolver=new InternalResourceViewResolver(); resolver.setPrefix(this.mvcProperties.getView().getPrefix()); resolver.setSuffix(this.mvcProperties.getView().getSuffix()); return resolver; }
第二章 Spring Boot核心
Spring Boot的核心注解
- 首先进入启动Spring Boot项目代码SpringApplication.run(App.class,args)的源码
- @SpringBootApplication Spring Boot的核心注解,用来标识应用的启动类(该类的main方***通过SpringApplication.run(App.class,args)来启动Spring Boot应用项目)
注解名 | 作用 |
---|---|
1.@SpringBootConfiguration | Spring Boot项目的配置注解; |
2.@EnableAutoConfiguration | 启动自动配置,该注解会让Spring Boot根据当前项目所依赖的jar包自动配置项目的相关配置项(如添加了spring-boot-starter-web,则会自动添加Tomcat和Spring MVC的依赖并自动配置,通过打开pom.xml的Dependency Hierarchy标签页查看自动添加的相关配置项) |
3.@ComponentScan | 扫描配置(自动扫描启动类所在同级包和子包下的类,所以通常建议将启动类放在项目根包下【Group Id+Artifact Id】,这样可以保证Spring Boot 扫描到项目所有的包)。 |
Spring Boot的基本配置
- 自动配置
- Spring Boot支持的配置项
- 在org.springframework.boot.autoconfigure包中有支持类
- 取消自动配置方法
@SpringBootApplication(exclude={RedisAutoConfiguration.class})
- Spring Boot支持的配置项
- 定制启动banner
- 生成自己的字符图形,如
◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇ ◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇ ◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇ ◇◇◇◇◇◇◇◇◇◇◇◇◇◆◆◆◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◆◆◇◇◇◇◇◇◇◇◇◇◇◇◇◇ ◇◇◇◇◇◇◇◆◆◆◆◇◇◆◆◆◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◆◆◆◆◇◇◇◇◇◇◇◇◇◇◇◇ ◇◇◇◇◇◇◇◆◆◆◆◇◇◆◆◆◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◆◆◆◆◇◇◇◇◇◇◇◇◇◇◇◇ ◇◇◇◇◇◇◇◆◆◆◆◇◇◆◆◆◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◇◇◇◇◇◇ ◇◇◇◇◇◇◇◆◆◆◆◇◇◆◆◆◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◇◇◇◇◇◇ ◇◇◇◇◇◇◇◆◆◆◆◇◇◆◆◆◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◆◆◆◇◇◆◆◆◇◇◇◇◇◇◆◆◆◇◇◇◇◇◇ ◇◇◇◇◇◇◇◆◆◆◆◆◆◆◆◆◆◆◆◆◆◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◆◆◆◇◇◆◆◆◇◇◇◇◇◇◆◆◆◇◇◇◇◇◇ ◇◇◇◇◇◇◇◆◆◆◆◆◆◆◆◆◆◆◆◆◆◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◆◆◆◇◇◆◆◆◇◇◇◆◆◆◆◆◇◇◇◇◇◇◇ ◇◇◇◇◇◇◇◆◆◆◇◇◇◆◆◆◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◆◆◆◆◆◆◆◆◆◆◇◇◇◇◇◇◇◇◇ ◇◇◇◇◇◇◇◆◆◆◇◇◇◆◆◆◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◆◆◆◆◆◆◆◆◆◆◇◇◇◇◇◇◇◇◇ ◇◇◇◇◇◇◆◆◆◇◇◇◇◆◆◆◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◆◆◆◆◇◇◆◆◆◆◇◇◇◇◇◇◇◇◇ ◇◇◇◇◇◇◆◆◆◇◇◇◇◆◆◆◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◆◆◆◆◆◆◆◆◆◆◇◇◇◇◇◇◇◇◇◇ ◇◇◇◇◇◇◆◆◇◇◇◇◇◆◆◆◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◆◆◆◇◇◆◆◆◆◆◇◇◇◇◇◇◇◇◇◇◇ ◇◇◇◇◇◆◆◇◇◇◇◇◇◆◆◆◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◆◆◇◇◇◆◆◆◆◆◇◇◇◇◇◇◇◇◇◇◇ ◇◇◇◇◇◇◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◆◆◆◆◆◆◆◆◆◆◇◇◇◇◇◇◇ ◇◇◇◇◇◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◆◆◆◇◆◆◆◆◆◆◆◆◆◇◇◇◇◇ ◇◇◇◇◇◇◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◆◆◆◇◇◇◇◇◆◆◆◆◆◆◆◇◇◇◇◇ ◇◇◇◇◇◇◇◇◇◇◇◇◇◆◆◆◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◇◇◇◇◇ ◇◇◇◇◇◇◇◇◇◇◇◇◇◆◆◆◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◇◇◇◇◇ ◇◇◇◇◇◇◇◇◇◇◇◇◇◆◆◆◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◆◆◆◇◇◇◇◇◇◆◆◆◇◇◇◇◇◇◇◇ ◇◇◇◇◇◇◇◇◇◇◇◇◇◆◆◆◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◆◆◆◇◇◇◇◇◇◆◆◆◇◇◇◇◇◇◇◇ ◇◇◇◇◇◇◇◇◇◇◇◇◇◆◆◆◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◆◆◆◇◇◇◇◇◇◆◆◆◇◇◇◇◇◇◇◇ ◇◇◇◇◇◇◇◇◇◇◇◇◇◆◆◆◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◆◆◆◇◇◇◇◇◇◆◆◆◇◇◇◇◇◇◇◇ ◇◇◇◇◇◇◇◇◇◇◇◇◇◆◆◆◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◆◆◆◆◆◆◆◆◆◆◆◆◇◇◇◇◇◇◇◇ ◇◇◇◇◇◇◇◇◇◇◇◇◇◆◆◆◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◆◆◆◆◆◆◆◆◆◆◆◆◇◇◇◇◇◇◇◇ ◇◇◇◇◇◇◇◇◇◇◇◇◇◆◆◆◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◆◆◆◇◇◇◇◇◇◆◆◆◇◇◇◇◇◇◇◇ ◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇
- 新建一个banner.txt文件,将字符图形拷到该文件中
- 将banner.txt拷到项目src/main/resource目录下
- 重新启动程序即可看到效果。
- 生成自己的字符图形,如
- 应用的全局配置文件
- 位置:src/main/resources目录下【常用】 或 类路径的/config目录下【也行】
- 文件名:application.properties【常用】 或 application.yml 【也行】
- 作用:修改项目默认端口,进入DispatcherServlet的请求地址规则等,如:
server.port=9999 server.servlet-path=*.action
- 更多全局配置说明 Appendix A. Common application properties
- Spring Boot的依赖模块
- 列表 Starters
Spring Boot的自动配置原理
- 列表 Starters
- 流程图
graph TD ctor[SpringBootAppcation构造方法]--sources-->init[initialize]; init-->getfactoris[getSpringFactoriesInstance]; getfactoris-->loadfactory[loadFactoryNames]; springprop(META-INF/spring.factories)--配置文件-->loadfactory;
- spring.factories文件分析
- PropertySource Loaders:设置Spring Boot配置文件支持的格式
- 配置名称:org.springframework.boot.env.PropertySourceLoader
- 可选参数:properties,xml,yml,yaml等格式。
- org.springframework.boot.env.PropertiesPropertySourceLoader,用于加载properties和xml格式配置文件
- org.springframework.boot.env.YamlPropertySourceLoader,用于加载yml和yaml格式配置文件
- Run Listeners:运行的***类
- 配置名称:org.springframework.boot.SpringApplicationRunListener
- 值:org.springframework.boot.context.event.EventPublishingRunListener,此RunListener是在SpringApplication对象的run方法执行不不同阶段时,发布相应的event给SpringApplication对象的Listeners中记录的事件***。
- Application Context Initializers : 表示Spring Boot中的应用程序的初始化类。默认四个,下面列举:
- 配置名称:org.springframework.context.ApplicationContextInitializer,表示Spring Boot中的应用程序的初始化类
- 值,包名:org.springframework.boot.context
- ConfigurationWarningsApplicationContextInitializer的作用是报告常见的配置错误。
- ContextIdApplicationContextInitializer,给ApplicaionContext设置一个ID
- DelegatingApplicationContextInitializer,将初始化的工作委托给context.initializer.classes环境变量指定的初始化器
- ServerPortInfoApplicationContextInitializer,监听EmbeddedServletContainerInitializedEvent类型的事件,然后将内嵌的Web服务器使用的端口设置到ApplicationContext中。
- Application Listeners
- 配置名称:org.springframework.context.ApplicationListener,表示Spring Boot中的应用程序***
- 值:共9个,包名前缀:org.springframework.boot
- ClearCachesApplicationListener,在Spring的context容器完成refresh()方法时调用,用来清除缓存信息。
- builder.ParentContextCloserApplicationListener,当窗口关闭时发出通知,如果父容器关闭,那么子窗口也一起关闭。
- context.FileEncodingApplicationListener,在Spring Boot环境准备完成以后进行,获取环境中的系统环境参数,检测当前系统环境的file.encoding和spring.mandatory-file-encoding设置的值是否一样,如果不一样则抛出异常。
- context.config.AnsiOutputApplicationListener,在Spring Boot环境准备完成以后运行,如果终端支持ANSI,设置的彩色输出会让日志更具可读性。
- context.config.ConfigFileApplicationListener,读取加载Spring Boot的配置文件如application.properties等,非常重要。
- context.config.DelegatingApplicationListener,把Listener转发给配置的class处理,这样可以支持外围代码不去改写spring.factories中的org.springframework.context.ApplicationListener的相关配置,保持Spring Boot代码的稳定性。
- liquibase.LiquibaseServiceLocatorApplicationListener,如果相关的参数liquibase.servicelocator.ServiceLocator存在,则使用Spring Boot相关的版本进行替代。
- logging.ClasspathLoggingApplicationListener,程序启动时,将classpath打印到debug日志,启动失败时将classpath打印到info日志
- logging.LoggingApplicationListener,根据配置初始化日志系统进行日志输出。
- Enviroment Post Processors
- 配置名称:org.springframework.boot.env.EnviromentPostProcessors,表示Spring Boot中支持的动态读取文件方式
- 值:默认两种方式,包名前缀:org.springframework.boot
- cloud.CloudFoundryVcapEnviromentPostProcessor,对CloudFoundry提供支持
- env.SpringApplicationJsonEnviromentPostProcessor,把环境中spring.application.json的json值转化为MapPropertySource,并将这个MapPropertySource添加到环境的属性源列表中。
- PropertySource Loaders:设置Spring Boot配置文件支持的格式
- 自动配置总结
@SpringBootApplication注解通过使用@EnableAutoConfiguration注解自动配置的原理:从classpath中搜寻所有所有的META-INF/spring.factories配置文件,并将其中org.springframework.boot.autoconfigure.EnableAutoConfiguration对应的配置项通过反射实例化为对应的标注了@Configuration的IoC容器配置类,然后汇总并加载到Spring框架的IoC容器。
自动配置分析:以Spring MVC为例
-
Web开发配置类:org.springframework.boot.autoconfigure.web.WebMVCAutoConfiguration,其自动实现了Spring MVC的配置。
- 代码在org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration.class。
-
WebMvcAutoConfiguration的源码
@Configuration @ConditionalOnWebApplication(type = Type.SERVLET) @ConditionalOnClass({ Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class }) @ConditionalOnMissingBean(WebMvcConfigurationSupport.class) @AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE + 10) @AutoConfigureAfter({ DispatcherServletAutoConfiguration.class, ValidationAutoConfiguration.class }) public class WebMvcAutoConfiguration{ //类注解中的@ConditionOnClass是一个条件注解,意思就是只有当前项目运行环境中有Servlet类,DispatcherServlet以及WebMvcConfigurerAdapter类,Spring Boot才会初始化WebMvcAutoConfiguration进行自动配置。 @Bean @ConditionalOnMissingBean public InternalResourceViewResolver defaultViewResolver() { //@Bean注解:定义了一个Bean对象,InternalResourceViewResolver,以前是通过<bean />标签来定义的。 //@ConditionalOnMissingBean注解:表示当前环境没有InternalResourceViewResolver这个Bean才会创建。 InternalResourceViewResolver resolver = new InternalResourceViewResolver(); resolver.setPrefix(this.mvcProperties.getView().getPrefix()); resolver.setSuffix(this.mvcProperties.getView().getSuffix()); return resolver; } }
View对象
public static class View { /** * Spring MVC view prefix. */ private String prefix; /** * Spring MVC view suffix. */ private String suffix; public String getPrefix() { return this.prefix; } public void setPrefix(String prefix) { this.prefix = prefix; } public String getSuffix() { return this.suffix; } public void setSuffix(String suffix) { this.suffix = suffix; } }
在application.properties中配置视图的前缀和后缀。
spring.mvc.view.prefix=前缀 spring.mvc.view.suffix=后缀
-
相当于,Spring MVC中的
<bean id="jspViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/jsp/" /> <property name="suffix" value=".jsp" /> </bean>