[有书共读16]Spring Boot第二章

@Jemi5un

第二章 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如图所示image
    • 单击网站左下方“Select&Copy”,将图案保存至新建的bannner.text文件中。
    • 再将该文件放入项目的src/main/resources目录下
    • 启动程序效果如图所示
      image
  • 应用的全局配置文件
    在*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项目代码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的核心注解

  • @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})
  • 定制启动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的自动配置原理

  • 流程图
    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添加到环境的属性源列表中。
  • 自动配置总结
    @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>
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务