将Spring ioc和aop底层原理融合bean的生命周期一起理解会怎么样?

不多说直接上图开讲

该图由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 中定义),最终释放资源(如关闭数据库连接)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值