【JAVA】Spring IOC

2019-05-19  本文已影响0人  Y了个J
概述
IOC的作用
屏幕快照 2019-03-27 下午1.09.40.png
总体逻辑

IOC容器启动时,把所有配置过的Bean都全部各自生成一个BeanDefinition,并存储到BeanDefinitionRegistry的实现类DefaultListableBeanFactory的beanDefinitionMap中;用户在通过BeanFactory接口的实现类去getBean的时候,会从beanDefinitionMap中获取到这个bean的BeanDefinition,然后通过反射生成一个Bean,默认单例的话,还会把这个实例化的bean存储在singletonObjects中,下次再getBean的时候就直接从singletonObjects中返回

Spring getBean流程的细节

1.缓存查询:查询singletonObjects中是否有缓存
2.实例化DependsOn的类:查询类A是否是dependsOn的类,有的话,需要先实例化dependsOn的类
3.创建一个空的实体类:读取BeanDefinition信息,获取空的构造函数,通过反射创建一个所有filed为null的实体类(这样在堆中就有一个引用了)然后把这个Bean保存到singletonFactories中(以参数的形式 把bean存到factory里面)
4.然后遍历该类A的依赖属性,一一赋值,如果属性值依赖的是某一个具体的类B的时候,就必须先实例化B类
5.最后把创建好的Bean缓存在singletonObjects中,再返回给调用者

Spring 生命周期管理

1.实例化Bean执行顺序:调用构造函数、属性值的set方法、init方法(如果配置了的话)、destory方法
2.类通过实现特定的接口,来实现在某个过程中进行干预
3.Spring 也支持配置容器级别的 干预类,注入到IOC当中后,所有的类在创建过程中,都会收到干预

普通Java Bean的生命周期

比如main方法里面,new User()这个操作,就会从class文件里面加载一个User对象到JVM里。
JavaBean的生命周期:类加载、连接、验证、准备、初始化

另外Java 加载Bean的触发条件:
1.new的方式直接创建
2.当前类的静态属性或者静态方法被调用
3.该类作为父类被加载等等

面试时组织下语言:
程序启动时,spring会扫包和解析xml文件对需要spring管理的bean进行创建对应的beanDefinition,然后通过BeanDefinitionRegistry注册beanDefinition到beanDefinitionMap中,通过BeanFactory的getBean来获取bean,getBean方法先去singletonObjects来获取已经缓存的单例bean,如果singletonObjects中没有对应的bean,就去beanDefinitionMap中获取beanDefinition,beanDefinition中有bean的类信息,通过反射来创建对应的bean,然后进行属性赋值,如果这个bean是单例的就把bean缓存到singletonObjects中去,这样我们就得到了我们需要的bean,主要就是BeanDefinitionRegistry注册beanDefinition, BeanFactory获取bean。

上一篇下一篇

猜你喜欢

热点阅读