spring bean的产生过程

此文章为个人学习过程记录,不足之处。路过的大佬多多指正!!!
话不多说,上图。
spring bean的产生过程
spring bean的产生过程
1、我们先是在一个类上添加注解@Service或者@Component
2、当spring启动的时候 通过@componentScan进行扫描包下的所有类(注解)
3、这个时候spring不会直接去创建bean的对象,而是实现beandefinition的子类(实现类),这个是子类就是用来记录需要去创建的类的信息(constructorArgumentValue(构造方法的参数)、isAbstract、description、factoryMethod、beanName、beanClass、beanScope、propertyValue、autoModel、parentName、isLazy、isDependOn(控制bean加载顺序
)、isPrimary、FactoryBeanName),然后在将这个类放进一个beanDefinitMap中,因为spring可能会扫描到多个类,spring可能会进行多次解析,解析完成后,这个map中就会出现多个beandefinition子类对象,然后spring会调用一个preInstantiateSingletons() new object去遍历map中的beandefinition子类对象信息(此时这些子类对象包含了原先的类信息),验证(根据上方英文类的信息,比如isLazy,BeanScope是不是单例)成功之后会将对象放进spring的一个单例池(这个单例池也是一个map)中。这是说的是单例对象,如果是原型对象,是在getBean的时候去初始化对象。
如何对spring源码进行扩展
在spring解析完成放进map之后,调用preInstantiateSingletons() new object之前,去实现了一个BeanFactoryPostProcessor接口,就调用spring扩展的一些方法,把map传进方法,遍历map,改变了类中对应的beandefinition子类对象的一些属性,再将改变之后的对象重新放进map。就完成了对spring的扩展
//初始化spring容器
AnnotationConfigApplicationText ac = new AnnotationConfigApplicationContext(本类名.class)
Ac.getBeanDefinitionNames()//获取map中的key,可以说是map中存放的类的名字作为了key

spring bean的产生过程
spring bean的产生过程