1.谈谈你对SpringIOC的理解,原理与实现
总:控制反转,容器
控制反转:原来的对象由使用者控制,现在有了Spring后,可以把整个对象交由Spring管理
DI:把对应的属性值注入到具体的对象当中,可通过@Autoiware和populater完成属性的注入
容器:存放具体对象,使用map结构,在Spring中一般存在三级缓存中,singletonObject存放完整对象。在整个bean的生命周期从c创建到销毁的过程全部是由容器管理。
容器的创建过程:
1.通过BeanFacory,DefaultListableBeanFactory向Bean工厂中设置一下参数(beanPost Processer,aware接口的子类)等属性
2.加载解析Bean对象,准备要创建的bean对象的定义对Beandefinition(xml或注解)
3.beanFactoryPostProcess的处理,此处是扩展点
4.beanPostProcess注册,方便后续bean对象完成具体的扩展功能
5.通过反射将BeanDefinition对象实例化成具体的对象
6.bean对象的初始化过程(填充属性,调用aware子类方法,对用beanPostProcess前置方法,调用initial-method,调用beanPostProcess后置方法)
7.生成完成的Bean对象,通过getBean方法可以直接获取
8.销毁
没有看过源码
具体的细节我不太记得了,但spring中的bean都是通过反射的方式进行创建的,通知包含了很多的扩展点,比如最常用的对BeanFactaory的扩展,对Bean的扩展(对占位符的扩展),除此之外IOC最核心的就是填充Bean的具体属性和生命周期
2.谈一下IOC的底层实现
你对它的理解和你了解的实现过程
反射、工厂、设计模式
关键的方法:creatBeanFactory,getBean,doGetBean,createBean,doCreateBean,create Bean Instance,populateBean,initalizingBean
1.先通过creatBeanFactory创建一个bean工程(DefaultlisableBeanFactory)
2.循环创建对象,因为容器中的bean都是单例的,所以优先通过getbean和doGetbean在容器中进行查找,找不到的话
3.通过creatBean和doCreateBean以反射的方式创建对象,一般通过无参的构造方法
4.对对象属性的填充populateBean
5.进行其他的初始化操作(initalizingBean)
网友评论