# 一文看懂Spring核心概念和源码解读## 本文目录## 一、Spring框架的模块组成

spring源码解读第二版(一文看懂Spring核心概念和源码解读)(1)

1. 核心组件

1. 核心容器(Core Container)

2. AOP(Aspect Oriented Programming)

3. 设备支持(Instrument)

4. 数据访问及集成(Data Access/Integratioin)

5. Web

6. 报文发送(Messaging)

7. Test等模块。

2. Spring的优点

1. 低侵入式

2. DI机制减少组件耦合性

3. AOP

4. 扩展性

## 二、Spring的核心原理

Spring框架最核心的原理:IOC 和 AOP。IOC让相互协作的组件保持松散的耦合,而AOP编程允许把遍布于应用各层的功能分离出来形成可重用的功能组件。

### 1. 控制反转 IOC

1. 容器控制创建对象,降低对象之间耦合性,利于功能复用

2. 创建对象不需要new,而是利用JAVA反射机制根据配置文件动态创建对象和管理对象

3. Spring中三种注入方式:

### 2. 面向切面 AOP1. AOP的理解

抽取并封装多个对象的公共行为和逻辑成一个可重用的模块`切面(Aspect)`

spring源码解读第二版(一文看懂Spring核心概念和源码解读)(2)

2. 静态代理(AspectJ)和动态代理(Spring AOP)3. Spring AOP动态代理的两种方式(JDK和CGLIB)

spring源码解读第二版(一文看懂Spring核心概念和源码解读)(3)

spring源码解读第二版(一文看懂Spring核心概念和源码解读)(4)

spring源码解读第二版(一文看懂Spring核心概念和源码解读)(5)

4. AOP的核心概念

spring源码解读第二版(一文看懂Spring核心概念和源码解读)(6)

1. `切面(Aspect)`:被抽取的公共模块,可能会横切多个对象。 在Spring AOP中,切面可以使用通用类(基于模式的风格) 或者在普通类中以 @AspectJ 注解来实现。

spring源码解读第二版(一文看懂Spring核心概念和源码解读)(7)

2. `连接点(Join point)`:指方法,在Spring AOP中,一个连接点 总是 代表一个方法的执行。

3.`通知(Advice)`:在切面的某个特定的连接点(Join point)上执行的动作。通知有各种类型,其中包括“around”、“before”和“after”等通知。许多AOP框架,包括Spring,都是以拦截器做通知模型, 并维护一个以连接点为中心的拦截器链。

spring源码解读第二版(一文看懂Spring核心概念和源码解读)(8)

spring源码解读第二版(一文看懂Spring核心概念和源码解读)(9)

4. `切入点(Pointcut)`:切入点是指 我们要对哪些Join point进行拦截的定义。通过切入点表达式,指定拦截的方法,比如指定拦截add*、search*。

spring源码解读第二版(一文看懂Spring核心概念和源码解读)(10)

5. `引入(Introduction)`:(也被称为内部类型声明(inter-type declaration))。声明额外的方法或者某个类型的字段。Spring允许引入新的接口(以及一个对应的实现)到任何被代理的对象。例如,你可以使用一个引入来使bean实现 IsModified 接口,以便简化缓存机制。

6. `目标对象(Target Object)`: 被一个或者多个切面(aspect)所通知(advise)的对象。也有人把它叫做 被通知(adviced) 对象。 既然Spring AOP是通过运行时代理实现的,这个对象永远是一个 被代理(proxied) 对象。

7. `织入(Weaving)`:指把增强应用到目标对象来创建新的代理对象的过程。Spring是在运行时完成织入。

8. 切入点(pointcut)和连接点(join point)匹配的概念是AOP的关键,这使得AOP不同于其它仅仅提供拦截功能的旧技术。 切入点使得定位通知(advice)可独立于OO层次。

spring源码解读第二版(一文看懂Spring核心概念和源码解读)(11)

5. AOP的应用场景

spring源码解读第二版(一文看懂Spring核心概念和源码解读)(12)

6. AOP的实战场景

spring源码解读第二版(一文看懂Spring核心概念和源码解读)(13)

spring源码解读第二版(一文看懂Spring核心概念和源码解读)(14)

spring源码解读第二版(一文看懂Spring核心概念和源码解读)(15)

spring源码解读第二版(一文看懂Spring核心概念和源码解读)(16)

spring源码解读第二版(一文看懂Spring核心概念和源码解读)(17)

spring源码解读第二版(一文看懂Spring核心概念和源码解读)(18)

spring源码解读第二版(一文看懂Spring核心概念和源码解读)(19)

spring源码解读第二版(一文看懂Spring核心概念和源码解读)(20)

7. 使用SpringAop的注意事项

spring源码解读第二版(一文看懂Spring核心概念和源码解读)(21)

参考[探秘Spring AOP](https://www.imooc.com/learn/869)课程截图

spring源码解读第二版(一文看懂Spring核心概念和源码解读)(22)

spring源码解读第二版(一文看懂Spring核心概念和源码解读)(23)

spring源码解读第二版(一文看懂Spring核心概念和源码解读)(24)

spring源码解读第二版(一文看懂Spring核心概念和源码解读)(25)

spring源码解读第二版(一文看懂Spring核心概念和源码解读)(26)

spring源码解读第二版(一文看懂Spring核心概念和源码解读)(27)

spring源码解读第二版(一文看懂Spring核心概念和源码解读)(28)

### 三、Spring的两大核心接口:BeanFactory和ApplicationContext

BeanFactory和ApplicationContext是Spring的两大核心接口,都可以当做Spring的容器。其中ApplicationContext是BeanFactory的子接口。

1. ApplicationContext 是 BeanFactory 的子接口,功能更全

2. 加载方式

相对于基本的BeanFactory,ApplicationContext 唯一的不足是占用内存空间。当应用程序配置Bean较多时,程序启动较慢。

3. 创建方式

4. 注册方式

BeanFactory和ApplicationContext都支持BeanPostProcessor、BeanFactoryPostProcessor的使用,但两者之间的区别是:BeanFactory需要手动注册,而ApplicationContext则是自动注册。

### 四、Spring容器中的Bean#### 1. Bean的作用域

1. `singleton(单例)`,在spring容器中仅存在一个Bean实例,Bean以单例方式存在,bean作用域范围的默认值。

2. `prototype(原型)`,每次从容器中调用Bean时,都返回一个新的实例,即每次调用getBean()时,相当于执行newXxxBean()。

3. `request`,每次HTTP请求都会创建一个新的Bean,该作用域仅适用于web的WebApplicationContext环境。

4. `session`,同一个HTTP Session共享一个Bean,不同Session使用不同的Bean。该作用域仅适用于web的WebApplicationContext环境。

5. `globalSession`,同一个全局 Session 共享一个 bean,用于 Portlet, 该作用域仅用于 WebApplication 环境。

#### 2. Bean注入的几种方式

1. 基于注解 @Autowired 的自动装配(最常用)

2. 基于构造方法注入

3. 基于Setter方法注入

#### 3. Bean的自动装配

在spring中,对象无需自己查找或创建与其关联的其他对象,由容器负责把需要相互协作的对象引用赋予各个对象,使用autowire来配置自动装载模式

1. 自动装配种类

2. @Autowired和@Resource之间的区别

#### 4. Bean的生命周期和加载流程(重点)

Spring Bean 的生命周期分为四个阶段和多个扩展点。扩展点又可以分为影响多个Bean和影响单个Bean。实例化和属性赋值对应构造方法和setter方法的注入,初始化和销毁是用户能自定义扩展的两个阶段。

spring源码解读第二版(一文看懂Spring核心概念和源码解读)(29)

spring源码解读第二版(一文看懂Spring核心概念和源码解读)(30)

1. 四个阶段(实例化 -> 属性赋值 -> 初始化 -> 销毁)

spring源码解读第二版(一文看懂Spring核心概念和源码解读)(31)

2. 多个扩展点

1. BeanPostProcessor

2. InstantiationAwareBeanPostProcessor

1. Aware

1. Aware Group1

1. BeanNameAware

2. BeanClassLoaderAware

3. BeanFactoryAware

1. Aware Group2

1. EnvironmentAware

2. EmbeddedValueResolverAware

3. ApplicationContextAware(ResourceLoaderAware\ApplicationEventPublisherAware\MessageSourceAware)

3. 生命周期

##### 4. 源码解读参考[一招带你搞定Spring源码,小白也能听懂的spring源码过程](https://www.ixigua.com/6898673954483864077)

1. Spring启动加载流程

2. 容器的作用

3. IOC容器

4. 创建对象方式

5. xml和注解中定义的是bean的定义信息,通过抽象定义接口解析到BeanDefinition

6. BeanDefinition通过new反射到实例化

1. 填充属性

2. 执行初始化方法`init-method`

7. 初始化到完整对象

8. Spring的扩展性设计

9. BeanDefinition到BeanFactory

10. PostProcessor增强器,进行扩展实现

11. BeanFactoryPostProcessor

12. bean的生命周期

13. Environment

14. 如果我想在spring生命周期的不同阶段做不同的处理工作?

1. 观察者模式:监听器、监听时间、多播器

15. spring中的do方法

## 五、单例Bean的线程安全和并发问题(重点)

单例Bean是Spring容器默认的方式,所有线程都共享一个单例实例Bean,确实会存在并发的问题。对于原型Bean,每次创建一个新对象,也就是线程之间并不存在Bean共享,自然是不会有线程安全的问题。

### 1、单例Bean的线程安全问题

1. 无状态对象(Stateless Bean)(`线程安全`)

2. 有状态对象(Stateful Bean)(`线程不安全`) :

### 2、线程安全问题的解决办法

1. 解决方案

2. 多线程相同变量访问冲突问题:ThreadLocal和线程同步机制

## 六、Spring的事务处理### 1、Spring事务的种类

1. 编程式事务,使用TransactionTemplate。

2. 声明式事务,建立在AOP之上的。其本质是通过AOP功能,对方法前后进行拦截,将事务处理的功能编织到拦截的方法中,也就是在目标方法开始之前加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。

3. 区别:声明式事务最细粒度只能作用到方法级别,无法做到像编程式事务那样可以作用到代码块级别

### 2、Spring事务的隔离级别(5种)

1. 事务的隔离级别

### 3、Spring事务的传播行为(7种)

1. Spring事务的传播行为说的是,当多个事务同时存在的时候,Spring如何处理这些事务的行为

## 七、Spring框架中用到的设计模式### 1. 工厂模式

1. Spring使用工厂模式可以通过 BeanFactory 或 ApplicationContext 创建 bean 对象。两者的区别,

2. ApplicationContext的三个实现类:

### 2. 单例模式

Spring 中 Bean 的默认作用域就是 singleton(单例)的。使用单例模式的好处

### 3. 代理模式

Spring的AOP功能用到了JDK的动态代理和CGLIB字节码生成技术。

### 4. 模板方法

用来解决代码重复的问题。比如. RestTemplate, JmsTemplate, JpaTemplate等。

### 5. 观察者模式

定义对象键一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知被制动更新,如Spring中listener的实现:ApplicationListener。

## 八、Spring框架的事件类型

1. 上下文更新事件(ContextRefreshedEvent)

2. 上下文开始事件(ContextStartedEvent)

3. 上下文停止事件(ContextStoppedEvent)

4. 上下文关闭事件(ContextClosedEvent)

5. 请求处理事件(RequestHandledEvent)

## 参考资料

- [一招带你搞定Spring源码,小白也能听懂的spring源码过程](https://www.ixigua.com/6898673954483864077)

- [Spring框架小白的蜕变](https://www.imooc.com/learn/1108)

- [探秘Spring AOP](https://www.imooc.com/learn/869)

- [2021最新Java面经整理 | 框架篇(一)Spring框架](https://blog.csdn.net/shipfei_csdn/article/details/109530018)

,