springbootlearning

chapter 1 Spring

Spring IoC

IoC (Inversion Of Control)

DI (Dependency Injection) 软件实体被动接受其依赖的其他组件被IoC容器注入

DL(Dependency Lookup) 当前软件实体主动去某个服务注册地查找其依赖的那些服务

使用Spring框架的JAVA应用通常都有一行”context.getBean()”

1
context.getBean()

阶段一:注册和收集

通过XML或者java或者XML Schema的形式,定义一些bean,然后将其收集并注册进入IoC容器中。$color{red}{就像pom.xml文件一样}$

阶段二:分析和组装

一阶段完成后IoC容器中存在着许多相互独立的bean。通过分析这些bean之间的依赖关系,再组装他们,将一个bean所依赖的bean全部注入这个bean中。

JavaConfig

任何一个标注了@Configuration的java配置类定义都是一个JavaConfig配置类

任何一个标注了@Bean的方法,其返回值作为一个bean定义注册到Spring的IoC容器。

以函数的调用形式来指示bean之间的依赖关系。

1
2
3
4
5
6
7
8
9
10
11

public class {
@Bean
public Service1 service1(){
return new Service1Imp1(service2());
}
@Bean
public Service2 service2(){
return new Service2Imp1(;
}
}

chapter 2 SpringBoot的工作机制

1.基本结构

1
2
3
4
5
6
@SpringApplication
public class DemoApplication{
public static void main(String args[]){
SpringApplication.run(DemoApplication.class, args);
}
}

[email protected]

@SpringBootApplication等价于:

  • @Target
  • @Retention
  • @Documented
  • @Inherited
  • @Configuration
  • @EnableAutoConfiguration
  • @ComponentScan

@Configuration

定义一个配置类的IoC容器

@EnableAutoConfiguration

借助@Import的支持,收集和注册特定场景相关的bean定义

等价于@Import(EnableAutoConfigurationImportSelector.class)

借助EnableAutoConfigurationImportSelector.class,帮助SpringBoot应用将所有符合条件的@Configuration配置加载到当前的IoC容器之中,再借助工具类SpringFactoriesLoader的支持,@EnableAutoConfiguration“智能”地自动配置功效。

SpringFactoriesLoader根据类名查找对应的一组@Configuration

3.SpringApplication

其执行流程如下:

  1. 创建一个SpringApplication的对象实例,调用其run方法。

    • 根据classpath中的特征类来创建一个对应应用(如web)的ApplicationContext类

    • 使用SpringFactoriesLoader在classpath中查找并加载所有可用的ApplicationContextInitializer和ApplicationListener

  2. 初始化完成后,对所有SpringApplicationRunListener调用其started()方法。

  3. 创建并配置环境

  4. 对所有SpringApplicationRunListener调用environmentPrepared()。

  5. 创建某一类的ApplicationContext,并将之前的环境给其使用

  6. 调用所有的AppicationContextInitializer的initialize(applicationContext)方法来对已经创建好的ApplicationContext进一步处理

  7. 调用所有的SpringApplicationRunListener的contextPrepared()方法

  8. 将之前通过@EnableAutoConfiguration获得的所有配置信息和IoC容器加入ApplicationContext中

  9. 调用所有的SpringApplicationRunListener的contextLoaded()方法

  10. 调用ApplicationContext的refresh()方法

  11. 查找ApplicationContext中是否注册有CommandLineRunner,如果有就遍历执行他们

  12. 完成!调用SpringApplicationRunListener的finished方法

    chapter 3 spring-boot-starter