不多说直接上图开讲
该图由b站程序员小陈在成都提供 非常感谢 如果感兴趣大家可以移步看小陈的视频讲解和我的文档搭配理解
一、配置解析
首先,Bean 的生命周期始于配置解析阶段,由实现了 ApplicationContext 接口的容器(如AnnotationConfigApplicationContext)加载配置(XML、注解或 Java 类),其内部持有的 BeanFactory 接口实现类(通常是 DefaultListableBeanFactory)会将配置解析为 BeanDefinition 元数据,包含类名、作用域、延迟加载等属性;
二、实例化
接着,BeanFactory 根据 BeanDefinition 进行实例化(通过反射调用构造器或工厂方法,解决循环依赖时利用三级缓存提前暴露未完成初始化的对象),此时仅生成原始对象;
三、依赖注入
随后进入依赖注入阶段,由AutowiredAnnotationBeanPostProcessor 等组件处理 @Autowired、@Resource 注解或 XML 的 <property> 标签,通过反射或 Setter 方法将其他 Bean 注入到目标对象的字段或方法参数中;
四、初始化
完成依赖注入后,BeanFactory 调用 initializeBean() 方法执行初始化流程:
调用 Aware 接口(如 BeanNameAware 传递 Bean 名称、ApplicationContextAware 传递容器引用),使 Bean 感知容器基础设施;执行 BeanPostProcessor 的前置处理(postProcessBeforeInitialization),其中 InitDestroyAnnotationBeanPostProcessor 负责调用 @PostConstruct 注解方法;执行 InitializingBean 接口的 afterPropertiesSet() 方法,执行 Spring 原生初始化逻辑;调用自定义 init-method(XML 或 @Bean 中定义的无参方法);执行 BeanPostProcessor 的后置处(postProcessAfterInitialization),此时AnnotationAwareAspectJAutoProxyCreator 根据切面规则决定是否生成代理对象:
JDK 动态代理:针对接口代理,通过 Proxy.newProxyInstance() 生成代理类(继承 Proxy 类并实现目标接口,如UserService$$Proxy0),其方法调用委托给 InvocationHandler,在 invoke() 方法中插入增强逻辑(如事务、日志);
CGLIB 动态代理:针对无接口的类,通过 Enhancer 生成目标类的子类(如UserService$$EnhancerByCGLIB),重写父类方法并委托给 MethodInterceptor,在 intercept() 方法中实现增强;代理对象生成后会替换原始 Bean 存入容器,此后容器中的 Bean 已是增强后的代理实例;
五、使用
初始化完成的 Bean 被放入单例池(singletonObjects)供其他组件调用;
六、销毁
当容器关闭时(调用 close() 或注册 JVM 关闭钩子),触发销毁流程:调用 @PreDestroy 注解方法;执行 DisposableBean 接口的 destroy() 方法;调用自定义 destroy-method(XML 或 @Bean 中定义),最终释放资源(如关闭数据库连接)。