Spring5.0源码深度解析之SpringBean的生命周期终结

这篇文章,我们总结下SpringBean的生命周期

思考问题:SpringBean对象创建的时候,默认都会调用无参构造函数。

@Component
public class MemberServiceImpl implements InitializingBean,MemberService {
    public MemberServiceImpl() {
        System.out.println("1无参构造函数....说明对象初开始始化了");
    }

    public String login(String userName, String passWord) {
        //int i = 1 / 0;
        System.out.println(">>>>正在执行登陆业务逻辑>>>>> userName:" + userName + "passWord:" + passWord);
        return ">>>>登陆业务逻辑..<<<<";
    }

    public void afterPropertiesSet() throws Exception {
        System.out.println("2执行自定义bean的init方法");
    }
}

结果

1无参构造函数....说明对象初开始始化了 2执行自定义bean的init方法

那么这个MemberServiceImpl对象是交给spring到底是通过反射还是其它方式初始化的?

我们来验证下:

F8之后进入到这个方法,我们发现最终是通过反射来初始化对象

F8,走到这里,最终调用这个工具类进行反射初始化对象

return BeanUtils.instantiateClass(constructorToUse, new Object[0]); //反射初始化对象
} else {
    return this.instantiateWithMethodInjection(bd, beanName, owner);//CGLIB初始化对象
}

F8

f8,最终调用下面这个方法初始化对象

最后执行init方法

最后我们来总结下:

SpringBean的生命周期

1.进入到刷新refresh()方法 2.finishBeanFactoryInitialization()初始化所有单例对象 3.preInstantiateSingletons()初始化所有的单例对象:注意是非懒加载 4.getBean()-》doGetBean()先查询该对象是否有初始化过,没有的化就创建注册到IOC容器中 5.createBean()判断对象如果是单例的情况下,就调用该方法去创建对象 6.doCreateBean()创建IOC对象 7.createBeanInstance()使用Java的反射机制实例化我们的对象 8.populateBean()给对象的set属性赋值 9.initializeBean()执行初始化方法(也可以自己定义初始化的方法) 10.invokeAwareMethods()判断bean的类型是否是Aware相关依赖,如果存在的情况回调方法 11.applyBeanPostProcessorsBeforeInitialization()在初始化方法之前执行处理(增强) 12.invokeInitMethods()调用自定义的init方法,Java反射技术 13.applyBeanPostProcessorsAfterInitialization()在初始化方法之后执行处理(增强) 14.正常是用我们初始化好的这个Bean对象 15.销毁bean

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券