文章内容收录到个人网站,方便阅读 :hardyfish.top/
Spring 的实现原理可以从它的核心机制和运行流程两方面来说。
1. 核心思想
Spring 的核心是 IoC(控制反转) 和 AOP(面向切面编程) ,它通过容器管理对象的生命周期和依赖关系,并在运行时对类进行动态增强。
- IoC :对象的创建与依赖由 Spring 容器管理,而不是手动
new。 - AOP:在不改变业务代码的情况下,通过代理技术实现事务、日志、安全等功能的横切关注点。
2. 启动流程(以 Spring 容器为例)
(1)创建容器对象
- 调用
new ClassPathXmlApplicationContext()或AnnotationConfigApplicationContext() - 容器初始化时,会读取配置(XML 或注解)并注册 Bean 定义。
(2)BeanDefinition 注册
- 解析配置文件/注解类,把 Bean 元信息(类名、作用域、依赖等)存到
BeanDefinition对象中,放入 BeanDefinitionMap。
(3)Bean 实例化
- 调用 反射 创建 Bean 对象(
Constructor.newInstance())。 - 如果有依赖,会先实例化依赖的 Bean(构造器注入 / setter 注入)。
(4)依赖注入
- 通过反射调用
setXxx()或直接设置字段值完成注入。 - 如果使用
@Autowired,Spring 会执行 依赖查找(byType/byName) 并注入。
(5)初始化回调
- 执行
BeanPostProcessor(如@PostConstruct、InitializingBean.afterPropertiesSet())。
(6)AOP 代理
- 如果 Bean 匹配到切面(
@Transactional、@Aspect等),会使用 JDK 动态代理 (接口)或 CGLIB 代理(类继承)创建代理对象,放进容器。
(7)Bean 就绪
- 容器返回 Bean 的引用给调用方。
3. 核心模块实现细节
(1)IoC 容器实现
- Spring 的 IoC 容器接口是
BeanFactory,常用实现是DefaultListableBeanFactory。 - 容器内部维护一个
ConcurrentHashMap<String, Object>(单例池)缓存单例 Bean。
(2)AOP 实现
- 切面解析 :解析
@Aspect或 XML 切面配置。 - 代理创建 :使用
ProxyFactory结合JdkDynamicProxy/CglibAopProxy创建代理类。 - 方法拦截 :调用链由
MethodInterceptor组成(事务、日志等)。
(3)事件机制
- 基于观察者模式实现,
ApplicationEventPublisher用来发布事件,ApplicationListener订阅事件。
(4)事务管理
- 基于 AOP 的代理,在方法执行前开启事务(
Connection.setAutoCommit(false)),执行后提交或回滚。
4. 特点
- 高度解耦:对象依赖不直接写死,而是通过容器注入。
- 灵活扩展 :支持 Bean 后处理器(
BeanPostProcessor)、事件监听器等扩展点。 - 模块化:IoC、AOP、事务、数据访问等模块相互独立又可组合。