bean实例化过程的大概流程
假设 有个x类 通过javac编译成一个class文件 然后 通过classloader加载到jvm虚拟机中
运行 main 方法的时候 会初始 spring环境和上下文 在上下文中 解析 主类
发现 这个类需要扫描 某些包下的所有类 比如说 扫描到x 扫描到之后 spring 不是立马把它new出来
它 扫描到之后 通过循环 用 BeanDefintion 的实现类 将bean的信息 注入并保存到全局变量map(beanDefinitionMap)中,
key为:“x” value为实现对象
这个 map 为spring的全局变量 保存 bean 信息 并通过map去new
如何 new?
会将这个map中的key-value拿出来 new出对象 放到 spring单例池 等待取用
假设 我们程序员 提供了一个类 实现了BeanFactoryPostProcessor接口 在new对象之前 就会去执行实现这个接口的类 将整个bean工厂(包含beanDefinitionMap)传入 可以修改map中的类型
即 将x变成y 通过 getBeanDefintion(“x”)取出该BeanDefintion对象
注:spring的命名规则 比如说 Xbbb类 实例化出的对象 为xbbb
BeanDefintion概念
在 spring 扫描到这些需要注入的类的时候 通过循环 通过 BeanDefintion(是个接口) 的实现类的对象 将名字 作用域 注入模型 懒加载等等 最主要的是 会保存类的类型 即 .setBeanClass(X.class) 把这些属性通过set方法保存到 BeanDefintion 对象中 存到map当中 key为:“x” value为实现对象
这个 map 为spring的全局变量 保存 bean 信息 并通过map去new