• 【Spring Boot&&Spring Cloud系列】Spring Boot初识


    项目代码地址:https://github.com/AndyFlower/Spring-Boot-Learn/tree/master/Spring-boot-helloworld

    一、Spring Boot优点

    1. 为Spring开发提供更加简单的使用和快速开发的技巧
    2. 具有开箱即用的默认配置功能,能根据项目依赖自动配置
    3. 具有功能更加强大的服务体系,包括嵌入式服务、安全、性能指标、健康检查等
    4. 绝对没有代码生成,可以不再需要XML配置,即可让应用更加轻巧和灵活
    5. 对于第三方技术的使用,提供了非常完美的整合

    二、项目创建方式

    1. 使用Maven新建项目
    2. 使用Spring Initializr新建项目(参见之前的文章)

    三、基本依赖配置

     1 <parent>
     2         <groupId>org.springframework.boot</groupId>
     3         <artifactId>spring-boot-starter-parent</artifactId>
     4         <version>1.5.6.RELEASE</version>
     5         <relativePath/> <!-- lookup parent from repository -->
     6     </parent>
     7 <dependency>
     8             <groupId>org.springframework.boot</groupId>
     9             <artifactId>spring-boot-starter-web</artifactId>
    10         </dependency>

    四、简单的实例

     1 package com.slp;
     2 
     3 import org.mybatis.spring.annotation.MapperScan;
     4 import org.springframework.boot.SpringApplication;
     5 import org.springframework.boot.autoconfigure.SpringBootApplication;
     6 
     7 @SpringBootApplication
     8 @MapperScan("com.slp.mapper")
     9 public class DemoApplication {
    10 
    11     public static void main(String[] args) {
    12         SpringApplication.run(DemoApplication.class, args);
    13     }
    14 }

    注解@SpringBootApplication标注这是一个Spring Boot应用

    main方法使他成为一个主程序,将在应用启动时首先被执行

    五、Spring Boot配置

    在工程resource文件夹中创建一个application.properties或application.yum文件,该文件会被自动发布到classpath中,并且被Spring Boot自动读取。

    不同文件的配置方式有差异,但是是实现的同样的参数项:

    application.yml:

    1 server:
    2       port: 80
    3       tomcat:
    4              uri-encoding: UTF-8

    application.properties:

    1 server.port = 80
    2 server.tomcat.uri-encoding = UTF-8

     六、SpringApplication执行流程

    1、如果我们使用的是SpringApplication的静态run方法,那么这个方法里面首先需要创建一个SpringApplication对象实例,然后调用这个创建好的SpringApplication的实例run方法。在SpringApplication实例化初始化的时候,它会提前做几件事情

    • 根据classpath里面是否存在某个特征类(org.springframework.context.ConfigurableWebApplicationContext)来决定是否应该创建一个为Web应用使用的ApplicationContext类型,还是应该创建一个标准Standalone应用使用的ApplicationContext类型
    • 使用SpringFactoriesLoader在应用的classpath中查找并加载所有可用的ApplicationContextInitializer.
    • 使用SpringFactoriesLoader在应用的classpath中查找并加载所有可用的ApplicationListener
    • 推断并设置main方法的定义类

    2、SpringApplication实例初始化完成并且完成设置后,就开始执行run方法的逻辑了,方法执行伊始,首先遍历执行所有通过SpringFactoriesLoader可以查找到并加载的SpringApplicationRunListener,调用他们的started()方法,告诉SpringApplicationRunListener,SpringBoot应用要开始执行了

    3、创建并配置当前SpringBoot应用将要使用的Environment(包括配置要使用的PropertySource以及profile)

    4、遍历调用所有SpringApplicationRunListener的environmentPrepared()的方法

    5、告诉SpringApplication的showBanner属性被设置为true,则打印banner

    6、根据用户是否明确设置了applicationContextClass类型以及初始化阶段的推断结果,决定该为当前SpringBoot应用创建什么类型的ApplicationContext并创建完成,然后根据条件决定是否添加ShutdownHook,决定是否使用自定义的BeanNameGenerator,决定是否使用自定义的ResourceLoader,当然最重要的是将之前准备好的Environment设置给创建好的ApplicationContext使用

    7、ApplicationContext创建好之后,SpringApplication会再次借助SpringFactoriesLoader,查找并加载classpath中所有可用的ApplicationContextInitializer然后遍历这些ApplicationContextInitializer的initialize方法来对已经创建好的ApplicationContext进行进一步的处理

    8、遍历调用的SpringApplicationRunListener的contextPrepared()方法,通知他们“SpringBoot”应用使用的ApplicationContext准备好了

    9、将之前通过@EnableAutoConfiguration获取的所有配置已经其他形式的IoC容器配饰加载到已经准备完毕的ApplicationContext

    10、遍历调用所有的SpringApplicationRunListener的contextLoaded()方法,告知所有SpringApplicationRunListener,ApplicationContext装填完毕

    11、调用ApplicationContext中是否注册有CommandLineRunner如果有则遍历他们

    12、正常情况下,遍历执行SpringApplicationRunListener的finished()方法,并告知“搞定”。

    七、自动配置

    如前面所说@EnableAutoConfiguration可以借助SpringFactoriesLoader的特性将标注了@Configuration的Javaonfig类加载汇总到最终的ApplicationContext,这只是简化的说明,实际上,基于@EnableAutoConfiguration的自动配置功能拥有更加强大的调控能力。

    1、基于条件的自动配置

    在Spring框架中,我们可以使用@Conditional这个Annotation配合@Configuration或者@Bean扥来干预一个配置或者bean定义是否能够生效,其最终实现的效果或者语义类似于

    if(符合@Conditional规定的条件){

    加载当前配置(enable current Configuration)或者注册当前bean定义;

    }

    比如

    1 @Conditional({Test.class,User.class})

    最主要的是@Conditional可以作为一个Meta Annotation用了标注其他Annotation实现类,从而构建各色的符合Annotation,比如SpringBoot的autoconfigure模块就是基于这一优良传统实现了一批这样的Annotation(@ConditionalOnClass  @ConditionalOnBean @ConditionalOnMissingClass @ConditionalOnMissingBean  @ConditionalOnProperty)

    2、调整自动配置的顺序

    我们可以使用AutoConfigureBefore和AutoConfigureAfter让当前配置或者组件在某个组件之前或者之后进行

  • 相关阅读:
    python核心编程课后题第二版36页第二章
    Python每个N个字符插入一个符号
    python核心编程课后题第二版97页第五章
    意外的 404 错误
    WCF简单使用(分别部署在控制台和IIS上)
    最近看的项目cakephp
    我正在翻译的CakePHP manual
    C# 高质量编程
    Android 环境搭建
    MVC 读配置文件 多语言
  • 原文地址:https://www.cnblogs.com/dream-to-pku/p/7387949.html
Copyright © 2020-2023  润新知