目录
启动过程
生命周期
启动过程
在Spring启动的时候调用init()法,然后初始化ioc容器,扫描配置获取相关的包,进行对象实例化,将实例化的对象进行属性注入。存入容器中。
在Spring启动的时候,调用init方法获取配置文件的名称,获取要扫描的包的名称以及类的全名称。通过反射获取class文件的全名称放入list中
将获取到的对象封装成BeanDefinition.(类的简单名称,累的全名称) ,如果该类没有接口,那么BeanDefinition就是简单名称和全名称的组合,如果你有接口,还要 生成一个新的BeanDefinition,他的key为接口的全名称,值为实现类的全名称
然后把list转换成map
调用getBean循环map 如果有对象,那么这个方法就是获取方法,如果没有对象,这个方法就是一个创建方法
把实例化的对象放到三级缓存中,进行属性的注入,再放到容器当中(一级缓存)。
生命周期
生命周期是对一个Bean从创建到销毁的过程,但是如果我想在这个过程中对一些bean做改变,我可以实现
一些接口,然后在这些接口中去对bean做改变,spring中提供了系列的接口和注解介入了bean的生命周期。
首先一个bean的创建过程是这样的:
实例化 创建实例阶段主要是通过反射创建bean的实例对象
属性注入 如果被实例化的bean存在依赖其他bean对象的一些情况则需要对这些依赖的bean进行对象注入比如Autowired以及setter注入等这样一些配置形式
初始化
包含了以下几个步骤:
1)实现了BeanFactoryAware接口,会先调用setBeanFactory方法
2)实现了BeanNameAware接口,会先调用setBeanName方法
3)实现了BeanPostProcessor接口,会先调用postProcessBeforeInitialization方法
4)实现了InitializingBean接口,会调用afterPropertiesSet方法
5) init-method方法调用
6)然后在进行aop后置处理,通过实现BeanPostProcessor接口,在postProcessAfterInitialization方法中进
行动态代理
销毁
当spring应用上下文被关闭的时候那么这个上下文中所有的bean会被销毁
对加了@PreDestroy注解的方法进行调用
实现了DisposableBean接口的destroy方法
配置destroy-method方法被执行
- Spring 对bean 进行实例化。
- Spring 将值和bean的引用注入到bean对应的属性中。
- 如果bean实现了BeanNameAware接口,Spring将bean的ID传递给setBean-Name() 方法。
- 如果bean 实现了BeanFactoryAware接口,Spring将调用setBeanFactory() 方法,将BeanFactory容器实例传入。
- 如果bean实现了ApplicationContextAware接口,Spring将调用setApplicationContext() 方法,将bean所在的应用上下文的引用传入进来。
- 如果bean实现了BeanPostProcessor接口,Spring将调用它们的post-ProcessBeforeInitialization() 方法
- 如果bean实现了InitializingBean接口,Spring将调用它们的after-PropertiesSet()方法。类似的,如果bean使用init-method声明了初始化方法,该方法也会被调用。
- 如果bean实现了BeanPostProcessor接口,Spring将调用它们的post-ProcessAfterInitialization() 方法。
- 此时, bean 已经准备就绪,可以被应用程序使用了,它们将一直驻留在应用上下文中,直到该应用上下文被销毁。
- 如果bean实现了DisposableBean接口,Spring将调用它的destory()接口方法。同样,如果bean使用destroy-method声明了销毁方法,该方法也会被调用。
创建前准备回去配置中获取bean有关 的扩展实现比如init-method容器在初始化的时候回调用的一些方法,destroy method容器在销毁bean的时候回调用的一些方法以及beanFactoryPostProcessor 这一类的bean加载过程中的一些前置和后置的一些处理扩展实现,这些类或配置其实是spring提供给开发者用来去实现bean加载过程中的一些扩展,在很多的和spring集成的中间件也比较常见 ,比如像dubbo
创建实例阶段主要是通过反射区创建bean的实例对象,并且会扫描和解析bean声明的一些属性
依赖注入
如果被实例化的bean存在依赖其他bean对象的一些情况则需要对这些依赖的bean进行对象注入比如Autowired以及setter注入等这样一些配置形式,还会有一些扩展的调用,比如beanPostProcessors用来去实现bean初始化前后的一些回调,以及向beanfactoryaware等
容器缓存阶段
主要作用是吧bean保存到容器以及spring的缓存中,这个阶段可以被使用了,这个阶段的操作常见的像init-method,这个属性配置的方法,会在这个阶段会被调用。以及向BeanPostProcessors的后置处理器方法也会在这个阶段被触发
销毁实例阶段,当spring应用上下文被关闭的时候那么这个上下文中所有的bean会被销毁,实现了像DisposableBean接口或者配置了destory-method属性的一些方法会在这个阶段会被调用