Spring IOC
# IOC 控制反转
原来我们使用对象时是由使用者控制的,有了Spring后,可以将整个对象交给容器来帮我门进行管理
DI:依赖注入,将应对的属性注入到具体对象中@Autowired,@Resource,populateBean方法来完成属性注入 容器:存储对象,使用map结构存储对象,在Spring中的存储对象的时候一般有三级缓存,singletonFactory用来存放lambda表达式和对象名称的映射,整个bean的生命周期,从创建到使用销毁,各个环节都由容器来控制
# bean的生命周期:
1、Bean的实例化 通过反射的方式来生成,在源码中有一个叫createBeanInstance的方法来专门生成对象 2、Bean的属性注入 当beam对象创建完成后,对象的属性都是默认值,所以要开始给bean填充属性,通过populateBean方法来完成对属性填充,中间会涉及到循环依赖的问题,后面再展开说 3、BeanNameAware Spring将Bean Id 传递给setBeanName() 向bean对象设置容器属性,会调用invokeAwareMethods方法来将容器对象设置到具体bean对象中去 BeanFactoryAware ApplicationContextAware
例如容器属性: applicationContext BeanFactory Environment ResourceLoader
4、调用BeanPostProcessor中的前置处理方法来进行bean对象的扩展工作,ApplicationContextPostProcessor , EmbeddValueResolver等对象 5、调用invokelnitMethods方法来完成初始化方法调用,再此方法处理中,需要判断当前bean对象是否实现了nitializingBean接口,实现的话调用afterPropertiesSet方法来最后设置bean对象 6、调用BeanPostProcessor的后置处理方法,完成对bean对象的后置处理,aop就是在此处实现的,实现接口实现的实现名字叫AbstractAutoCreator 7、获取完整对象,通过getBean的方式去进行对象的获取和使用 8、当对象完成使用后,容器在关闭时会销毁对象,首先会判断是否实现了DispoableBean接口,然后去调用destroyMethod方法
循环依赖问题是怎么产生的,以及如何解决?Spring将调用setBeanFactory()方法,将BeanFactory容器实例传入