文章目录
前言
一、什么是BeanFactory?
IOC解决的是类与类的耦合问题,依赖DI(自动注入)来实现。这里用来生产Bean,最重要的就是BeanFactory。它是Spring的顶层核心接口,使用的是简单工厂模式。负责生产Bean。
简单工厂模式
定义一个工厂类,他可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类
二、BeanFactory和ApplicationContext的区别
BeanFactory比较早期的工厂,无法支持aop等插件;创建对象的时候,延迟加载,只有调用getBean方法才会实例化。
没有特殊要求都要使用ApplicationContext,因为BeanFactory能实现的,它都能实现。
三、简述SpringIOC的加载过程(穿插了Bean的生命周期)
类加载成一个bean定义,通过BeanFactory.getBean(), 生产/读取。Bean 定义
BeanDefinitionReader读取配置类;
BeanDefinitionScanner扫描xml、@bean;
BeanDefinitionRegistry注册成BeanDefinition,放到BeanDefinitionMap中;
BeanFactoryPostProcessor可以修改bean定义,BeanDefinitionRegistryPostProcessor可以注册bean定义;
Bean实例化
实例化(反射)
填充属性(@Autowired、@Value)
初始化(initMethid/destroy。有调用很多Aware,设置name、applicaitoncontent 等)
放到Map<beanName, bean实例>中,也就是一级缓存。(DefaultSingletonBeanRegistry)
附:aop是在初始化完成后,BeanPostProcessor中实现的。整个bean实例化过程中,有9次调用BeanPostProcessor的场景
总结
附录图