Spring bean 生命周期
bean生命周期流程图
bean实例生命周期的执行过程如下
- 对bean实例化创建bean;
- 通过反射调用set方法进行属性的依赖注入;
- 如果bean实现了BeanNameAware接口,spring将bean的id传给setBeanName()方法,来设置bean的name;
- 如果bean实现了BeanFactoryAware接口,spring将调用setBeanFactory()方法,将BeanFactory实例传进来,设置beanFactory;
- 如果bean实现了ApplicationContextAware接口,将调用setApplicationContext()方法将应用上下文的引用传入到bean中;
- 如果bean实现了BeanPostProcessor接口,它的前置处理方法postProcessBeforeInitialization 将被调用;
- 如果bean实现了InitializingBean接口,将调用它的afterPropertiesSet接口方法;
- 执行自定义的init方法;
- 如果bean实现了BeanPostProcessor接口,它的后置处理方法postProcessAfterInitialization 将被调用;
- 到此,bean已经完成准备,可以使用了;
- 最后就是销毁:若bean实现了DisposableBean接口,spring将调用它的distroy()接口方法。同样的,如果bean使用了destroy-method属性声明了销毁方法,则该方法被调用
其实大部分的时候上面说的这些接口,我们都不会去实现
不考虑这些接口时,的生命周期
1、单例管理
当scope=”singleton”,即默认情况下,会在启动容器时
(即实例化容器时)时实例化。但我们可以指定Bean节点的lazy-init=”true”来 延迟初始化bean,这时候,只有在第一次获取bean时才会初始化bean,即第一次请求该bean时才初始化。
2、非单例管理
当scope=”prototype”时,容器也会延迟初始化 bean,Spring 读取 xml 文件的时候,并不会立刻创建对象,而是在每次请求bean时
才初始化(如调用getBean方法时,相当于new xxxBean())。在第一次请求每一个 prototype 的 bean 时,Spring 容器都会调用其构造器创建这个对象,然后调用 init-method 属性值中所指定的方法。 对象销毁的时候,Spring容器不会帮我们调用任何方法,因为是非单例,这个类型的对象有很多个,Spring容器一旦把这个对象交给你之后,就不再管理这个对象了。
bean的作用域
参考 https://blog.csdn.net/fuzhongmin05/article/details/73389779