目录

一、 核心概念

1、控制反转(Spring IOC)

Bean 的生命周期

Spring 两种 IOC 容器:

BeanFactory

ApplicationContext

2、依赖注入(DI)

2、面向切面编程(Spring AOP)

3、命名服务——JNDI

4、事务服务——JTA

5、注解

二、 Spring Cloud

1、服务治理

2、客户端负载均衡:Spring Cloud Ribbon

3、服务容错保护:Spring Cloud Hystrix

4、声明式服务调用:Spring Cloud Feign

5、API网关服务:Spring Cloud Zuul

6、分布式配置中心:Spring Cloud Config

7、消息总线:Spring Cloud Bus

8、消息驱动的微服务:Spring Cloud Stream

9、分布式服务跟踪:Spring Cloud Sleuth

三、 Spring底层技术

1、设计模式:

2、循环依赖

3、@Autowired 和 @Resource 区别

4、自动装配原理

5、事件

四、 Spring Boot应用实践


一、 核心概念

1、控制反转(Spring IOC)

  • 概念:IOC容器负责装载对象;把对象的控制权交给了 spring,由 spring 容器进行管理
  • 目的:由容器创建、装载对象,降低人为依赖关系管理;
  • 原理:反射和工厂模式,反射原理使得我们通过对象的描述信息可生产出完整的对象,工厂模式使得IOC代码更加松耦合更合家里的生产Bean对象。

Bean 的生命周期

  • 实例化bean
  • 对于BeanFactory容器:当请求未初始化bean时,BeanFactory调用createBean()进行实例化。
  • 对于ApplicationContext容器:当容器启动后,获取对象BeanDefinition信息,实例化所有Bean
  • 设置对象属性(依赖注入)
  • 实例化后的对象封装在BeanWrapper中,容器根据BeanDefinition中的信息和BeanWrapper对象提供的设置属性的接口完成依赖。
  • BeanDefinition实际上包括一些Bean的信息,比如BeanName, Scope, 是否被**@Primary注解修饰,是否是@Lazy**,以及**@Description**等注解
  • 处理Aware接口:用户可以实现各种Aware接口进行自定义功能;在进行到此处,容器会调用Aware接口进行实现(比如BeanFactoryAware)
  • 如果实现了BeanNameAware接口,会调用实现setBeanName(String beanId)方法,参数为spring中bean的id值
  • 如果实现了BeanFactoryAware接口,会调用实现setBeanFactory()方法,传递spring工厂本身。
  • 如果实现了ApplicationContextAware接口,会调用setApplicationContext(ApplicationContext)方法,传入Spring上下文。
  • BeanPostProcessor:BeanPostProcessor可以根据次接口进行扩展功能,比如AOP
  • 如果想对Bean进行一些自定义的处理,那么可以让Bean实现了BeanPostProcessor接口,那将会调用postProcessBeforeInitialization(Object obj, String s)方法。由于这个方法是在Bean初始化结束时调用的,所以可以被应用于内存或缓存技术;
  • InitializingBean和init-method
  • 如果Bean在Spring配置文件中配置了 init-method 属性,则会自动调用其配置的初始化方法。
  • 如果这个Bean实现了BeanPostProcessor接口,将会调用postProcessAfterInitialization(Object obj, String s)方法;
  • 以上几个步骤完成后,Bean就已经被正确创建了,之后就可以使用这个Bean了。
  • DisposableBean:当Bean不再需要时,会经过清理阶段,如果Bean实现了DisposableBean这个接口,会调用其实现的destroy()方法;
  • destroy-method:最后,如果这个Bean的Spring配置中配置了destroy-method属性,会自动调用其配置的销毁方法。

Spring 两种 IOC 容器:

  • BeanFactory:只提供了最基本的实例化对象和拿对象的功能;
  • ApplicationContext:继承自BeanFactory,提供注解注入、国际化等功能;

BeanFactory

管理方式:

  • 在XML中进行显式配置。
  • 在Java中进行显式配置。
  • 注解方式。

注入方式:

  • 构造方法注入。
  • setter方法注入。
  • 注解方式注入。

ApplicationContext

  • BeanFactory:能够管理和装配Bean。
  • ResourcePatternResolver:能够加载资源文件。
  • MessageResource:能够实现国际化等功能。
  • ApplicationEventPublisher:能够注册监听器,实现监听机制。

2、依赖注入(DI)

组件之间依赖关系由容器在运行期决定,形象的说,即由容器动态的将某个依赖关系注入到组件之中。

2、面向切面编程(Spring AOP)

3、命名服务——JNDI

4、事务服务——JTA

?事务隔离级别、事务的传播机制

5、注解

@Required 注解
@Autowired 注解
@Qualifier 注解

二、 Spring Cloud

1、服务治理

2、客户端负载均衡:Spring Cloud Ribbon

3、服务容错保护:Spring Cloud Hystrix

4、声明式服务调用:Spring Cloud Feign

5、API网关服务:Spring Cloud Zuul

6、分布式配置中心:Spring Cloud Config

7、消息总线:Spring Cloud Bus

8、消息驱动的微服务:Spring Cloud Stream

9、分布式服务跟踪:Spring Cloud Sleuth

三、 Spring底层技术

1、设计模式:

  • 工厂设计模式: 比如通过 BeanFactory 和 ApplicationContext 来生产 Bean 对象
  • 代理设计模式: AOP 的实现方式就是通过代理来实现,Spring主要是使用 JDK 动态代理和 CGLIB 代理
  • 单例设计模式: Spring 中的 Bean 默认都是单例的
  • 模板方法模式: Spring 中 jdbcTemplate 等以 Template 结尾的对数据库操作的类,都会使用到模板方法设计模式,一些通用的功能
  • 包装器设计模式: 我们的项目需要连接多个数据库,而且不同的客户在每次访问中根据需要会去访问不同的数据库。这种模式让我们可以根据客户的需求能够动态切换不同的数据源
  • 观察者模式: Spring 事件驱动模型观察者模式的
  • 适配器模式:Spring AOP 的增强或通知(Advice)使用到了适配器模式

2、循环依赖

spring 使用三级缓存去解决循环依赖的,其「核心逻辑就是把实例化和初始化的步骤分开,然后放入缓存中」,供另一个对象调用

「第一级缓存」:用来保存实例化、初始化都完成的对象
「第二级缓存」:用来保存实例化完成,但是未初始化完成的对象
「第三级缓存」:用来保存一个对象工厂,提供一个匿名内部类,用于创建二级缓存中的对象

3、@Autowired 和 @Resource 区别

「@Resource 是 Java 自己的注解」,@Resource 有两个属性是比较重要的,分是 name 和 type;Spring 将 @Resource 注解的 name 属性解析为 bean 的名字,而 type 属性则解析为 bean 的类型。所以如果使用 name 属性,则使用 byName 的自动注入策略,而使用 type 属性时则使用 byType 自动注入策略。如果既不指定 name 也不指定 type 属性,这时将通过反射机制使用 byName 自动注入策略。
「@Autowired 是spring 的注解」,是 spring2.5 版本引入的,Autowired 只根据 type 进行注入,「不会去匹配 name」。如果涉及到 type 无法辨别注入对象时,那需要依赖 @Qualifier 或 @Primary 注解一起来修饰。

4、自动装配原理

1.容器在启动的时候会调用 EnableAutoConfigurationImportSelector.class 的 selectImports方法「获取一个全面的常用 BeanConfiguration 列表」
2.之后会读取 spring-boot-autoconfigure.jar 下面的spring.factories,「获取到所有的 Spring 相关的 Bean 的全限定名 ClassName」
3.之后继续「调用 filter 来一一筛选」,过滤掉一些我们不需要不符合条件的 Bean
4.最后把符合条件的 BeanConfiguration 注入默认的 EnableConfigurationPropertie 类里面的属性值,并且「注入到 IOC 环境当中」

5、事件

Spring 提供了以下5 种标准的事件:
(1)上下文更新事件(ContextRefreshedEvent):在调用
ConfigurableApplicationContext 接口中的refresh()方法时被触发。
(2)上下文开始事件(ContextStartedEvent):当容器调用
ConfigurableApplicationContext 的Start()方法开始/重新开始容器时触发该事件。
(3)上下文停止事件(ContextStoppedEvent):当容器调用
ConfigurableApplicationContext 的Stop()方法停止容器时触发该事件。
(4)上下文关闭事件(ContextClosedEvent):当ApplicationContext 被关闭
时触发该事件。容器被关闭时,其管理的所有单例Bean 都被销毁。
(5)请求处理事件(RequestHandledEvent):在Web 应用中,当一个http 请
求(request)结束触发该事件。
如果一个bean 实现了ApplicationListener 接口,当一个ApplicationEvent 被发
布以后,bean 会自动被通知

四、 Spring Boot应用实践