Spring源码分析之Bean的创建过程详解 (7)

InitDestroyAnnotationBeanPostProcessor

public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { // 取出在第四步解析@PostContrust @PreDestroy得到的元数据 LifecycleMetadata metadata = findLifecycleMetadata(bean.getClass()); // 调用init方法(@PostConstruct标识的) metadata.invokeInitMethods(bean, beanName); return bean; } public void invokeInitMethods(Object target, String beanName) throws Throwable { // 只取init的元数据(还有destroy的) Collection<LifecycleElement> checkedInitMethods = this.checkedInitMethods; if (!initMethodsToIterate.isEmpty()) { for (LifecycleElement element : initMethodsToIterate) { element.invoke(target); } } } public void invoke(Object target) throws Throwable { ReflectionUtils.makeAccessible(this.method); // 直接反射调用 this.method.invoke(target, (Object[]) null); }

ApplicationContextAwareProcessor的过程和invokeAwareMethods的过程类似,这里就不分析了

invokeInitMethods protected void invokeInitMethods(String beanName, Object bean, @Nullable RootBeanDefinition mbd){ // 如果实现了InitializingBean接口,调用afterPropertiesSet方法 boolean isInitializingBean = (bean instanceof InitializingBean); if (isInitializingBean && (mbd == null || !mbd.isExternallyManagedInitMethod("afterPropertiesSet"))) { ((InitializingBean) bean).afterPropertiesSet(); } if (mbd != null && bean.getClass() != NullBean.class) { // 调用自定义的初始化方法 String initMethodName = mbd.getInitMethodName(); if (StringUtils.hasLength(initMethodName) && !(isInitializingBean && "afterPropertiesSet".equals(initMethodName)) && !mbd.isExternallyManagedInitMethod(initMethodName)) { // 自定义init方法主要在@Bean注解进行声明,取出beanDefinition中的initMethod调用就好了 invokeCustomInitMethod(beanName, bean, mbd); } } } applyBeanPostProcessorsAfterInitialization public Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName) throws BeansException { Object result = existingBean; for (BeanPostProcessor processor : getBeanPostProcessors()) { // Spring内置后置处理器中,只有ApplicationListenerDetector有处理逻辑 // ApplicationListenerDetector会将实现了ApplicationListener接口的bean添加到事件监听器列表中 Object current = processor.postProcessAfterInitialization(result, beanName); if (current == null) { return result; } result = current; } return result; } public Object postProcessAfterInitialization(Object bean, String beanName){ if (bean instanceof ApplicationListener) { // 将bean添加到事件监听器列表中 this.applicationContext.addApplicationListener((ApplicationListener<?>) bean); } }

以上,bean初始化完毕!

伴随着bean初始化完毕,bean就算创建完成了,本文也到此结束啦,有问题的小伙伴欢迎在下方留言哟~

下文预告:Spring源码分析之循环依赖

Spring 源码系列

Spring源码分析之 IOC 容器预启动流程(已完结)

Spring源码分析之BeanFactory体系结构(已完结)

Spring源码分析之BeanFactoryPostProcessor调用过程(已完结)

Spring源码分析之Bean的创建过程(已完结)

Spring源码分析之什么是循环依赖及解决方案

Spring源码分析之AOP从解析到调用

Spring源码分析之事务管理(上),事物管理是spring作为容器的一个特点,总结一下他的基本实现与原理吧

Spring源码分析之事务管理(下) ,关于他的底层事物隔离与事物传播原理,重点分析一下

Spring Mvc 源码系列

SpringMvc体系结构

SpringMvc源码分析之Handler解析过程

SpringMvc源码分析之请求链过程

Mybatis 源码系列

暂定

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpgxxy.html