补习一下Spring的生命周期。
经过总结网上各个博主的解释,我总结的Bean生命周期简述为:
1、Bean实例化,对Spring容器所管理的Bean进行实例化
2、Bean的属性注入,将Bean所需要的引用和值注入
3、查看Bean是否实现了XXXAware接口(分别是BeanNameAware、BeanFactoryAware、ApplicationContextAware),如果实现了,那调用相关的实现方法(分别对应setBeanName、setBeanFactory、setApplicationContext,当然你bean里得有字段来接)
4、查看Bean是否实现BeanPostProcessor接口,如果实现了就调用postProcessorBeforeInitialization方法
5、查看Bean是否实现了InitializingBean接口,如果实现了就调用afterPropertiesSet方法(如果bean使用init-method声明了初始化方法,同样也会调用该方法)
6、如果第4步的BeanPostProcessor接口被实现了,这一步调用postProcessorAfterInitialization方法
7、此时Bean的初始化已经完毕,可以在应用程序中被使用,直到上下文被销毁
8、查看Bean是否实现了DisposableBean接口,如果实现了就调用destroy方法(如果bean使用destroy-method声明了销毁方法,同样也会调用该方法)
为了理解记忆,要注意下面的解释说明:
1、对于Spring的不同容器,进行实例化的方式不同,对于BeanFactory(最底层Bean容器,只提供Bean的实例化和取出)来说是懒加载的,只有当客户端需要该Bean或者实例化其他Bean需要注入该Bean时才实例化该Bean;而ApplicationContext(继承BeanFactory)是饿汉式的,在启动时就加载完所有Bean(当然也可以设置成懒加载的)
2、实例化后的对象封装在BeanWrapper对象中,然后Spring根据BeanDefinition中的信息通过BeanWrapper提供的接口完成注入
3、对于XXXAware接口中的方法的作用概括来说就是让Bean感受到了Spring容器,比如说如果user类中实现了BeanNameAware接口,那么如果用一个Id字段去接返回的BeanName,最终的user对象就可以通过Id获得该Bean在Spring容器中的Id,详情参考https://www.cnblogs.com/lgjava/p/11537472.html
4、对于BeanPostProcessor接口中的方法,可以用来自定义一些Bean的处理,概念上有点类似于Aop了
参考:https://www.cnblogs.com/javazhiyin/p/10905294.html