Spring的生命周期
Spring的生命周期.
- 容器启动,实例化所有实现了BeanFactoyPostProcessor接口的类。他会在任何普通Bean实例化之前加载.
- 实例化剩下的Bean,对这些Bean进行依赖注入。
- 如果Bean有实现BeanNameAware的接口那么对这些Bean进行调用
- 如果Bean有实现BeanFactoryAware接口的那么对这些Bean进行调用
- 如果Bean有实现ApplicationContextAware接口的那么对这些Bean进行调用
- 如果配置有实现BeanPostProcessor的Bean,那么调用它的postProcessBeforeInitialization方法
- 如果Bean有实现InitializingBean接口那么对这些Bean进行调用
- 如果Bean配置有init属性,那么调用它属性中设置的方法
- 如果配置有实现BeanPostProcessor的Bean,那么调用它的postProcessAfterInitialization方法
- Bean正常是使用
- 调用DisposableBean接口的destory方法
- 调用Bean定义的destory方法
如果从大体上区分值分只为四个阶段
- BeanFactoyPostProcessor实例化
- Bean实例化,然后通过某些BeanFactoyPostProcessor来进行依赖注入
- BeanPostProcessor的调用.Spring内置的BeanPostProcessor负责调用Bean实现的接口: BeanNameAware, BeanFactoryAware, ApplicationContextAware等等,等这些内置的BeanPostProcessor调用完后才会调用自己配置的BeanPostProcessor
- Bean销毁阶段
以上是自己总结的,没研究过源码,恐有误…作参考用
以下附上验证的代码:
package mislay;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
public class BeanFactoryPostProcessorTest implements BeanFactoryPostProcessor {
@Override
public void postProcessBeanFactory(
ConfigurableListableBeanFactory beanFactory) throws BeansException {
System.out.println("--------> begin BeanFactoryPostProcessorTest");
String[] names = beanFactory.getBeanDefinitionNames();
for (String name : names) {
System.out.println("definition bean name:" + name);
}
System.out.println("<--------- end BeanFactoryPostProcessorTest");
}
}
package mislay;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
public class BeanPostProcessorTest implements BeanPostProcessor {
@Override
public Object postProcessAfterInitialization(Object bean, String beanName)
throws BeansException {
System.out.println("call BeanPostProcessor interface postProcessAfterInitialization method; :" + beanName);
return bean;
}
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName)
throws BeansException {
System.out.println("call BeanPostProcessor interface postProcessBeforeInitialization method ::" + beanName);
if(bean instanceof BeanTest) {
System.out.println("bean instanceof BeanTest");
}
return bean;
}
}
package mislay;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.beans.factory.BeanNameAware;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
public class BeanTest implements InitializingBean, DisposableBean,BeanNameAware,BeanFactoryAware,ApplicationContextAware {
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("call InitializingBean interface");
}
@Override
public void destroy() throws Exception {
// TODO Auto-generated method stub
System.out.println("call DisposableBean interface");
}
public void _init() {
System.out.println("call bean init method");
}
public void _destory() {
System.out.println("call bean destory method");
}
public void setSomething(Object something) {
System.out.println("DI call setSomething method");
}
public BeanTest() {
System.out.println("BeanTest create");
}
@Override
public void setBeanName(String name) {
// TODO Auto-generated method stub
System.out.println("call BeanNameAware interface name is:" + name);
}
@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
// TODO Auto-generated method stub
System.out.println("call BeanFactoryAware interface");
}
@Override
public void setApplicationContext(ApplicationContext applicationContext)
throws BeansException {
// TODO Auto-generated method stub
System.out.println("call ApplicationContextAware interface");
}
}
package mislay;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
((AbstractApplicationContext) context).registerShutdownHook();
}
}
//下面是输出的内容
//这一段可以看出首先实例化化的BeanFactoryPostProcessor
--------> begin BeanFactoryPostProcessorTest
definition bean name:mislay.BeanFactoryPostProcessorTest
definition bean name:mislay.BeanPostProcessorTest
definition bean name:beanTest
<--------- end BeanFactoryPostProcessorTest
//这一段是Bean的创建以及依赖注入
BeanTest create
DI call setSomething method
//这一段就是内置的BeanPostProcessor调用
call BeanNameAware interface name is:beanTest
call BeanFactoryAware interface
call ApplicationContextAware interface
//这里开始调用自己BeanPostProcessor
call BeanPostProcessor interface postProcessBeforeInitialization method ::beanTest
bean instanceof BeanTest
//穿插着对InitializingBean接口和定义的init方法的调用
call InitializingBean interface
call bean init method
call BeanPostProcessor interface postProcessAfterInitialization method; :beanTest
//上面就结束了对配置的BeanPostProcessor的调用
//最后销毁
call DisposableBean interface
call bean destory method
Spring的生命周期的更多相关文章
- spring bean 生命周期和 ? 作用域? spirng bean 相互依赖? jvm oom ? jvm 监控工具? ThreadLocal 原理
1. spring bean 生命周期 1. 实例化一个bean ,即new 2. 初始化bean 的属性 3. 如果实现接口 BeanNameAware ,调用 setBeanName 4. Bea ...
- Spring点滴四:Spring Bean生命周期
Spring Bean 生命周期示意图: 了解Spring的生命周期非常重要,我们可以利用Spring机制来定制Bean的实例化过程. -------------------------------- ...
- spring之生命周期
1.容器中对的生命周期 spring可以管理 singleton作用域的bean的生命周期,spring可以精确地知道该bean何时被创建,何时被初始化完成,容器合适准备销毁该bean实例. spri ...
- Spring Bean 生命周期之destroy——终极信仰
上一篇文章 Spring Bean 生命周期之我从哪里来 说明了我是谁? 和 我从哪里来? 的两大哲学问题,今天我们要讨论一下终极哲学我要到哪里去? 初始化 Spring Bean 有三种方式: @P ...
- 常见问题:Web/Servlet生命周期与Spring Bean生命周期
Servlet生命周期 init()初始化阶段 Servlet容器加载Servlet(web.xml中有load-on-startup=1;Servlet容器启动后用户首次向Servlet发请求;Se ...
- spring的后置处理器——BeanPostProcessor以及spring的生命周期
后置处理器的调用时机 BeanPostProcessor是spring提供的接口,它有两个方法——postProcessBeforeInitialization.postProcessAfterIni ...
- 大厂高频面试题Spring Bean生命周期最详解
Spring作为当前Java最流行.最强大的轻量级框架.Spring Bean的生命周期也是面试高频题,了解Spring Bean周期也能更好地帮助我们解决日常开发中的问题.程序员应该都知道Sprin ...
- Spring Bean生命周期,好像人的一生。。
大家好,我是老三,上节我们手撸了一个简单的IOC容器五分钟,手撸一个Spring容器!,这节我们来看一看Spring中Bean的生命周期,我发现,和人的一生真的很像. 简单说说IoC和Bean IoC ...
- 睡前聊一聊"spring bean 生命周期"
spring bean 生命周期=实属初销+2个常见接口+3个Aware型接口+2个生命周期接口 实属初销:spring bean生命周期只有四个阶段,即实例化->属性赋值->初始化-&g ...
随机推荐
- vuex-getter
store 的计算属性. getter 的返回值会根据它的依赖被缓存起来,且只有当它的依赖值发生了改变才会被重新计算 const store = new Vuex.Store({ state: { t ...
- mongoose的关联查询 :populate
mongoose关联查询从3.2版本开始支持 基本用法如下: var studentSchema = new Schema({ name:String, age:String, school:{ ty ...
- Opencv undefined reference to `cv::imread() Ubuntu编译
Ubuntu下编译一个C++文件,C++源程序中使用了opencv,opencv的安装没有问题,但是在编译的过程中出现如下错误: undefined reference to `cv::imread( ...
- JS类小功能
工作中,总是要处理一些前端的小功能.都是网上搜的JS脚本 <script> //防止页面后退 history.pushState(null, null, document.URL); wi ...
- Echarts tooltip 坐标值修改
tooltip: { trigger: 'axis', position:function(p){ //其中p为当前鼠标的位置 console.log(p); ] + , p[] - ]; } },
- java.io.IOException: Could not delete path 'D:\mycode\reactnative\SecondTest\android\app\build\generated\source\r \release\android\support\v7
问题解决 直观上看是没有删除某个文件,产生的IOException异常,实际上是因为上次编译导致的缓存没有清空导致的. 进入到android目录下运行下面代码清除上次打包时的缓存: ./gradlew ...
- win10 家庭版修改hosts的权限
https://jingyan.baidu.com/article/624e7459b194f134e8ba5a8e.html
- License控制解决方案
当我们写完一个软件以后一般都会牵扯到软件控制,那么控制版本的原理是什么呢?其实就是在程序中添加了一段经过自己编写算法(这个算法可以是简单的公式运算,也可以是复杂的结合硬件的绑定方式),将形成的序列号注 ...
- 常见模块(三) pickle模块和json模块
(一)json和pickle的区别 1.json是不同编程语言实现数据交换的工具,他是用来把python中的数据对象转换成字符串或者写入文件中的,再由其他语言通过json加载进来. 2.pickle是 ...
- String引用数据类型
一.String类的第一种方式 (原文地址:https://blog.csdn.net/wangdajiao/article/details/52087302)1.直接赋值 例:String str ...