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