[db:标题]

摘要:Spring Bean的生命周期是什么样的? 在Spring容器里一个Bean的从创建到销毁一般都是经历了以下几个阶段: 定义阶段(Bean元信息配置)=>实例化阶段(创建Bean对象)=>初始化
Spring Bean的生命周期是什么样的? 在Spring容器里一个Bean的从创建到销毁一般都是经历了以下几个阶段: 定义阶段(Bean元信息配置)=>实例化阶段(创建Bean对象)=>初始化阶段(执行初始化逻辑)=>使用阶段(Bean可用)=>销毁阶段(释放资源) 定义阶段(BeanDefinition解析) Spring通过配置(XML、注解、Java配置)解析Bean的元数据,生成BeanDefinition对象。 BeanDefinition存储了Bean的类名、作用域(scope)、依赖项(depends-on)、初始化方法、销毁方法等元数据。 所有BeanDefinition存储在容器的BeanDefinitionMap(一个HashMap)中,键为Bean名称,值为BeanDefinition对象。 解析器: XML配置:XmlBeanDefinitionReader解析<bean>标签。 注解配置:ClassPathBeanDefinitionScanner扫描@Component等注解。 Java配置:ConfigurationClassPostProcessor解析@Bean方法。 实例化阶段(创建Bean实例) 根据BeanDefinition通过反射或工厂方法创建Bean实例(对象),但此时属性未注入。 默认通过无参构造方法实例化(若未指定,Spring会强制要求无参构造)。 在AbstractAutowireCapableBeanFactory类中的createBeanInstance方法中实现。 属性值填充(依赖注入) 为Bean的属性设置值或注入依赖。 通过@Autowired、@Value、XML的<property>等方式注入属性。 若注入的依赖是其他Bean,会递归触发依赖Bean的生命周期。 循环依赖问题:在属性注入阶段处理循环依赖(通过三级缓存解决)。 在AbstractAutowireCapableBeanFactory的populateBean方法中处理。 Aware接口回调设置 若Bean实现了特定Aware接口,Spring会回调对应方法,注入容器相关对象。 BeanNameAware:注入Bean在容器中的名称(setBeanName(String beanName))。 BeanFactoryAware:注入当前Bean所在的BeanFactory(setBeanFactory(BeanFactory beanFactory))。 ApplicationContextAware:若容器是ApplicationContext,注入应用上下文(setApplicationContext(ApplicationContext applicationContext))。 在AbstractAutowireCapableBeanFactory的initializeBean方法中调用。 BeanPostProcessor前置处理 在Bean初始化前,允许自定义BeanPostProcessor对Bean实例进行处理。 主要是调用BeanPostProcessor的postProcessBeforeInitialization方法。 常见的实现类 ApplicationContextAwareProcessor:处理ApplicationContextAware接口。 InitDestroyAnnotationBeanPostProcessor:处理@PostConstruct注解。 由AbstractAutowireCapableBeanFactory的applyBeanPostProcessorsBeforeInitialization方法执行。 InitializingBean处理以及自定义init-method处理 执行Bean的初始化逻辑。 InitializingBean处理,在所有Bean属性设置完成后进行初始化操作。如果Bean实现了InitializingBean接口,InitializingBean的afterPropertiesSet方法会被调用。 自定义init-method处理,如果Bean在配置文件中定义了初始化方法那么该方法会被调用。 例如:通过XML配置init-method或Java配置@Bean(initMethod="xxx")。
阅读全文