public class Car {
public Car(){
System.out.println("Car constructor...");
}
public void init(){
System.out.println("Car..init..");
}
public void destroy(){
System.out.println("Car..destroy..");
}
}
package com.wzj.config;
import com.wzj.bean.Car;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;
/**
* bean的生命周期
* bean的创建 --> 初始化 -->销毁的过程
* 容器管理bean的生命周期
* 我们可以自定义初始化和销毁方法,容器在bean进行到当前生命周期的时候来调用我们自定义的初始化和销毁功能
*
*
* 构建(对象创建)
* 单实例: 在容器创建的时候创建
* 多实例: 在每次获取的时候创建
*
* BeanPostProcessor.postProcessBeforeInitialization:在初始化之前工作
*初始化 : 对象创建完成,并赋值好,完成初始化
* BeanPostProcessor.postProcessAfterInitialization:在处理化工作之后
*
* 销毁:
* 单实例:容器关闭的时候
* 多实例: 容器不会管理这个bean,容器不会调用销毁方法
*
* 1)指定初始化和销毁方法
* 2)通过让bean实现 InitializingBean(定义初始化逻辑)和DisposableBean(销毁)接口
* 3)可以使用JSp250
* @PostConstruct : 在bean创建完成并且属性赋值完成,来执行初始化方法
* @PostDistroy: 在容器销毁bean之前通知我们进行清理工作
* 4)BeanPostProcessor(interface):bean的后置处理器
* 在bean初始化前后进行一些处理工作
* postProcessBeforeInitialization:在初始化之前工作
* postProcessAfterInitialization :在初始化工作之后
*/
@ComponentScan("com.wzj.bean")
@Configuration
public class MyConfigOfLifeCycle {
// @Scope("prototype")
@Bean(initMethod = "init" ,destroyMethod = "destroy")
public Car car(){
return new Car();
}
/**
* 遍历容器中所有的BeanPostProcessor,挨个执行BeforeInitialization
* 一旦但会null,就跳出for循环,不会执行后面的BeanPostProcessor.postProcessBeforeInitialization
*
*
* populateBean(beanName, mbd, instanceWrapper); 进行属性赋值
* applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
*invokeInitMethods(beanName, wrappedBean, mbd);执行初始化方法
* applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
*
* spring底层对BeanPostFactory的使用:
* bean赋值,注入其他组件,@Autowired,生命周期注解功能,@Async
*/
}
bean的生命周期
- 在容器中构建Bean
- 给属性进行赋值
- 执行后置处理器的BeanPostBeforeInitialization
- 执行初始化方法 可以听过bean里面的initMethod来指定初始化方法,也可以通过实现接口InitializingBean,重写初始化方法
- 执行后置处理器的BeanPostAfterInitializing方法
- 使用
- 单实例对象,ioc容器关闭就销毁,多实例对象,ioc容器关闭,并不会销毁