创建对象的方式

  1. new
  2. 反射

image.png

  1. 工厂模式

    IOC容器

    思考:

  2. ioc容器存储bean,用什么数据结构存储?

因为获取容器中的bean,所以存储的肯定是k-v,用map来存储

  1. ioc容器的bean用怎样的方式创建出来的?
  2. 怎么确定bean的类型

xml文件或者注解定义了bean的信息

bean的粗粒度过程
加载-解析-创建实例-使用-销毁

未命名文件 (1).png
http://www.fynote.com/d/5510
image.png
image.png

AbstractApplicationContext.java 中的方法

  1. /**<br /> * 前戏,做容器刷新前的准备工作<br /> * 1、设置容器的启动时间<br /> * 2、设置活跃状态为true<br /> * 3、设置关闭状态为false<br /> * 4、获取Environment对象,并加载当前系统的属性值到Environment对象中<br /> * 5、准备监听器和事件的集合对象,默认为空的集合<br /> */<br /> prepareRefresh();
  2. // 创建容器对象:DefaultListableBeanFactory<br /> // 加载xml配置文件的属性值到当前工厂中,最重要的就是BeanDefinition<br /> ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
  3. // beanFactory的准备工作,对各种属性进行填充<br /> prepareBeanFactory(beanFactory);
  4. try {<br /> // 子类覆盖方法做额外的处理,此处我们自己一般不做任何扩展工作,但是可以查看web中的代码,是有具体实现的<br /> postProcessBeanFactory(beanFactory);
  5. // 调用各种beanFactory处理器<br /> invokeBeanFactoryPostProcessors(beanFactory);
  6. // 注册bean处理器,这里只是注册功能,真正调用的是getBean方法<br /> registerBeanPostProcessors(beanFactory);
  7. // 为上下文初始化message源,即不同语言的消息体,国际化处理,在springmvc的时候通过国际化的代码重点讲<br /> initMessageSource();
  8. // 初始化事件监听多路广播器<br /> initApplicationEventMulticaster();
  9. // 留给子类来初始化其他的bean<br /> onRefresh();
  10. // 在所有注册的bean中查找listener bean,注册到消息广播器中<br /> registerListeners();
  11. // Instantiate all remaining (non-lazy-init) singletons.<br /> // 初始化剩下的单实例(非懒加载的)<br /> finishBeanFactoryInitialization(beanFactory);
  12. // 完成刷新过程,通知生命周期处理器lifecycleProcessor刷新过程,同时发出ContextRefreshEvent通知别人<br /> finishRefresh();<br /> }

AbstractAutowireCapableBeanFactory 的 doCreateBean()方法 // 实际创建bean的调用
protected Object doCreateBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args){
// 没有就创建实例
if (instanceWrapper == null) {
// 根据执行bean使用对应的策略创建新的实例,如,工厂方法,构造函数主动注入、简单初始化
_instanceWrapper = createBeanInstance(beanName, mbd, args);
}

// 对bean的属性进行填充,将各个属性值注入,其中,可能存在依赖于其他bean的属性,则会递归初始化依赖的bean
populateBean(beanName, mbd, instanceWrapper);
// 执行初始化逻辑
_exposedObject = initializeBean(beanName, exposedObject, mbd);
}


循环依赖问题

A对象依赖B,B依赖A
image.png
image.png
image.png
image.png

主要方法

// 初始化剩下的单实例(非懒加载的)
_finishBeanFactoryInitialization(beanFactory);
// 实例化剩下的单例对象
_beanFactory.preInstantiateSingletons();
image.pngimage.png

image.png
image.png

image.png
image.png

用到的设计模式

image.png