这篇文章,我们总结下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方法
最后我们来总结下:
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