一些阅读的总结

阅读源码的时候利用好断点和堆栈来 debug

思考一些常用功能(如 xml 或 注解 自动装配、根据名字或类型如何获取 bean)是如何实现的

Spring 使用了大量的设计模式,如模板模式

Spring 使用组合大于继承,一个类可能包含很多其他类或接口

注意一些关键的类就可以大致了解 Spring 的功能

由于途中会经常的使用 BeanDefinition,调试的时候在 RootBeanDefinition 的构造器打上断点

待解决的问题

IoC是什么?

我们通常理解的IoC就是存储bean的容器,实际上IoC的本意是反转控制(把bean的管理交给Spring实现),存储bean的容器实际上是Spring框架里面的一个成员变量map<beanName, bean>

DI 依赖注入,是bean管理中的一个重要的环节,当初始化的注入属性环节需要使用,涉及到循环依赖问题的解决

优点:代码解耦(不用自己new),单例模式(如果需要),不用关注创建的细节(属性注入)

实现:从 xml 文件或者通过@xxx注解方式将bean注入到IOC容器内(一个HashMap,<beanName, bean>)

AOP如何实现的?

面向切面编程,对方法的拓展

优点:

实现:代理模式实现,JDK原生的动态代理或者Cglib的动态代理

属性注入以及Spring如何解决循环依赖的?

Spring有两种方式进行属性注入,setter和构造器

  • setter方式出现的循环依赖:三级缓存
  • 构造器方式出现的循环依赖:@Lazy 标记在类上,表示类会延迟初始化

bean的生命周期?

事务?

springboot的启动流程?

涉及的设计模式

源码整体架构

image-20231208202836925

  1. spring-aop:切面编程
  2. spring-aspects:实现AspectJ框架的集成,生成增强后的Class文件
  3. spring-beans:定义了大量和Bean有关的接口,类及注解,BeanDefinition、BeanFactory、@Autowired/Qualifier/Value
  4. spring-context:Spring的上下文,ApplicationContext接口
  5. spring-context-indexer:加快启动速度
  6. spring-context-support:Spring上下文的一些扩展模块,例如实现邮件服务、视图解析、缓存
  7. spring-core:Spring的核心功能,控制反转(IOC)、依赖注入(DI)、asm以及cglib的实现
  8. spring-expression:提供Spring表达式语言的支持,SPEL
  9. spring-framework-bom:解决Spring中的模块与其他框架整合时产生jar包版本的冲突
  10. spring-instrument:实现的是类级别或者ClassLoader级别的代理功能
  11. spring-jcl:统一管理日志的框架
  12. spring-jdbc:模板设计模式将数据库的操作和具体业务分离
  13. spring-jms:对Java消息服务的支持
  14. spring-messaging:实现基于消息来构建服务的功能
  15. spring-orm:支持与第三方ORM框架进行整合,例如:MyBatis,Hibernate,Spring JPA等
  16. spring-oxm:完成xml和object对象的相互转换
  17. spring-test:Spring对Junit测试框架的简单封装
  18. spring-tx:声明式事务或者编程式事务支持,例如:Hibernate,MyBatis,JPA等
  19. spring-web:用来支持Web系统的功能,例如:文件上传,与JSF的集成,过滤器Filter的支持等
  20. spring-webflux:响应式编程来实现web功能的框架
  21. spring-webmvc:包括了和SpringMVC框架相关的所有类或者接口
  22. spring-websocket:Spring对websocket的简单封装

常用注解

bean声明

类上:@Component、@Controller、@Service、@Reposity、@Configuration

方法上:@bean

注入方式

@Autowired、@Resource

初始化调用

@PostConstructor(初始化阶段,在构造函数执行之后执行)

核心接口和类

Resource

资源Resource类型

  • File
  • URL
  • ClassPath

BeanDefinition

bean的定义信息

ResourceLoader

加载Resource成BeanDefinition

BeanFactory

HierarchicalBeanFactory:只是定义了父子关系,作用不大

AutowireCapableBeanFactory:自动装配

ListableBeanFactory:实现是DefaultListableBeanFactory,档案馆,保存了BeanDefinition,底层是map(beanName -> BeanDefinition)

项目启动过程

1
2
3
4
5
6
7
8
public AnnotationConfigApplicationContext(Class<?>... componentClasses) {
// 创建 reader,加载 Spring 内置的一些后置处理器的 BeanDefinition,还有创建 scanner
this();
// 注册用户自己添加的配置类的 BeanDefinition
register(componentClasses);
// 刷新 BeanFactory
refresh();
}

refresh() 12大步

1
2
3
4
// 重点1
invokeBeanFactoryPostProcessors(beanFactory);
// 重点2
finishBeanFactoryInitialization(beanFactory);

bean创建流程和生命周期

bean的生命周期包括创建、使用、销毁

我们具体关注创建流程,通过xml文件或者注解的方式拿到bean的定义信息,通过bean的定义信息完成bean的创建流程

bean创建流程如下

  1. 获取bean的定义信息BeanDefinition(xml方式或者注解方式)
  2. 实例化bean
  3. 初始化bean
    1. 属性赋值
    2. BeanPostProcessor前置处理
    3. 执行初始化方法
    4. BeanPostProcessor后置处理

image-20231215210630926

image-20231215210655571