实例化 - 属性赋值 - aware - before - 初始化 - after - 使用 - 销毁 一共分为四步,主要逻辑在doCreat()方法里 1.实例化 Instantiation(构造方法)–>creatBeanInstance() 2.属性赋值 Populate(setter方法注入)–>populateBean() 3.初始化 Initialization -->InitializationBean() 4.销毁 Destruction -->在容器关闭时调用的,ConfigurableApplicationContext#close()
影响多个bean的接口: 1.InstantiationAwareBeanPostProcessor:作用于实例化的前后,对应的两个接口为: a. postProcessBeforeInstantiation:在doCreateBean之前调用,也就是在bean实例化之前调用的,英文源码注释解释道 该方法的返回值会替换原本的Bean作为代理,这也是Aop等功能实现的关键点 b. postProcessAfterInstantiation:在属性赋值方法内,但是在真正执行赋值操作之前。其返回值为boolean,返回false时可以阻断属性赋值阶段(continueWithPropertyPopulation = false;) 2.BeanPostProcessor:作用于初始化阶段的前后
只调用一次的接口,这一大类接口的特点是功能丰富,常用于用户自定义扩展: 1.Aware类型的接口:所有的Aware方法都是在初始化阶段之前调用的,作用就是让我们能够拿到Spring容器中的一些资源,比如:BeanNameAware、BeanClassLoaderAware、BeanFactoryAware、ApplicationContextAware等等 2.生命周期接口 https://www.jianshu.com/p/1dec08d290c1
启动计时监控类 - 设置headless的值 - 创建spring监听器 - 初始化应用参数 - 准备spring环境 - 创建、准备、刷新应用上下文 - 停止计时监控器类 - 发布应用上下文启动完成事件
1、进入SpringAplication类run方法 2、run方法新建SpringApplication对象 3、SpringApplication对象的run方法,首先创建并启动计时监控类 4、接着通过configureHeadlessProperty设置java.awt.headless的值 5、接着调用getRunListeners创建所有spring监听器 6、接着DefaultApplicationArguments初始化应用参数 7、接着prepareEnvironment根据运行监听器和参数准备spring环境 8、接着调用createApplicationContext方法创建应用上下文 9、通过prepareContext准备应用上下文 10、refreshContext方法刷新上下文 11、调用stop方法停止计时监控器类 12、调用started发布应用上下文启动完成事件 13、callRunners方法执行所有runner运行器 14、调用running发布应用上下文就绪事件 15、最后返回应用上下文 启动流程图: https://www.processon.com/view/link/59812124e4b0de2518b32b6e
new - rnnable(running、ready) - waiting - blocked - dead waiting:无限等待,需要被唤醒。wait() notify() blocked:等待阻塞wait()、同步阻塞(获取同步锁,在锁池中)、其他阻塞sleep()
running - shutdown - stop - tidying
