spring源码
一些阅读的总结
阅读源码的时候利用好断点和堆栈来 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的启动流程?
涉及的设计模式
源码整体架构
- spring-aop:切面编程
- spring-aspects:实现AspectJ框架的集成,生成增强后的Class文件
- spring-beans:定义了大量和Bean有关的接口,类及注解,BeanDefinition、BeanFactory、@Autowired/Qualifier/Value
- spring-context:Spring的上下文,ApplicationContext接口
- spring-context-indexer:加快启动速度
- spring-context-support:Spring上下文的一些扩展模块,例如实现邮件服务、视图解析、缓存
- spring-core:Spring的核心功能,控制反转(IOC)、依赖注入(DI)、asm以及cglib的实现
- spring-expression:提供Spring表达式语言的支持,SPEL
- spring-framework-bom:解决Spring中的模块与其他框架整合时产生jar包版本的冲突
- spring-instrument:实现的是类级别或者ClassLoader级别的代理功能
- spring-jcl:统一管理日志的框架
- spring-jdbc:模板设计模式将数据库的操作和具体业务分离
- spring-jms:对Java消息服务的支持
- spring-messaging:实现基于消息来构建服务的功能
- spring-orm:支持与第三方ORM框架进行整合,例如:MyBatis,Hibernate,Spring JPA等
- spring-oxm:完成xml和object对象的相互转换
- spring-test:Spring对Junit测试框架的简单封装
- spring-tx:声明式事务或者编程式事务支持,例如:Hibernate,MyBatis,JPA等
- spring-web:用来支持Web系统的功能,例如:文件上传,与JSF的集成,过滤器Filter的支持等
- spring-webflux:响应式编程来实现web功能的框架
- spring-webmvc:包括了和SpringMVC框架相关的所有类或者接口
- 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 | public AnnotationConfigApplicationContext(Class<?>... componentClasses) { |
refresh() 12大步
1 | // 重点1 |
bean创建流程和生命周期
bean的生命周期包括创建、使用、销毁
我们具体关注创建流程,通过xml文件或者注解的方式拿到bean的定义信息,通过bean的定义信息完成bean的创建流程
bean创建流程如下
- 获取bean的定义信息BeanDefinition(xml方式或者注解方式)
- 实例化bean
- 初始化bean
- 属性赋值
- BeanPostProcessor前置处理
- 执行初始化方法
- BeanPostProcessor后置处理