所谓的生命周期其实是状态变化
jvm对象状态变化
简略带过jvm对象的生成到销毁状态, 只做简单了解
- 分配内存地址(可见状态)
- 顺序给static变量赋值
- 触发构造函数(完成初始化)
- gc root不可达(带回收)
这几个步骤只有2,3这两个步骤可由Java代码控制
static示例
static {
System.out.println("------ userComponent static block");
}
构造函数示例
public UserComponent() {
System.out.println("------------- bean instant -----------");
}
spring beanFactory 管理bean生命周期
beanFactory提供了两个接口,用于感知bean的状态
InitializingBean 接口
只有一个方法
afterPropertiesSet()
Invoked by the containing {@code BeanFactory} after it has set all bean properties
and satisfied {@link BeanFactoryAware}, {@code ApplicationContextAware} etc.
This method allows the bean instance to perform validation of its overall
configuration and final initialization when all bean properties have been set.
该方法,由BeanFactory在当前的bean都完成属性设置和完成BeanFactoryAware,ApplicationContextAware设置后主动触发。 一般用于检查属性配置或者最终初始化个性配置。
DisposableBean 接口
只有一个方法
destory()
在beanFactory 销毁bean时主动触发
ApplicationContext 管理bean生命周期
Lifecycle 接口
提供start(),stop(),isRunning三个方法。分别感知component的可用,销毁,检查可用功能. bean一般不会直接实现这个接口
SmartLifecycle 接口
该接口继承Lifecycle接口.
- isAutoStartup() 用于在ApplicationContext进行refresh时是否start
2.stop(callback) 添加了回调的停止方法. 实现方法需要callback.run(),不然会阻塞30秒
ApplicationContext在refresh方法的里会触发finishRefresh()方法,该在ApplicationContext实例化单例后执行。 finishRefresh()方法触发LifecycleProcessor,实现了Lifecyel接口的bean就是委派给LifecycleProcessor进行管理.
主要代码
@Component
public class UserComponent implements SmartLifecycle , InitializingBean, DisposableBean {
static {
System.out.println("------ userComponent static block");
}
public UserComponent() {
System.out.println("------------- bean instant -----------");
}
private String name;
@Autowired
private UserProfileComponent userProfileComponent;
@Override
public boolean isAutoStartup() {
return true;
}
@Override
public void stop(Runnable callback) {
System.out.println("------------ stop callback");
isRunning = false;
callback.run();
}
@Override
public void start() {
System.out.println("------------ start");
isRunning = true;
}
@Override
public void stop() {
System.out.println("------------ stop");
}
@Override
public boolean isRunning() {
return isRunning;
}
@Override
public int getPhase() {
return 0;
}
private static boolean isRunning = false;
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("--------------- afterPropertiesSet uerProfileComponent:" + userProfileComponent);
}
@Override
public void destroy() throws Exception {
System.out.println("---------------- destroy----");
}
}
AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext();
annotationConfigApplicationContext.scan("com.xie.java.beans");
annotationConfigApplicationContext.refresh();
// 扫描放这又会不一样
// annotationConfigApplicationContext.scan("com.xie.java.beans");
annotationConfigApplicationContext.getBeanFactory().destroyBean(annotationConfigApplicationContext.getBean(UserComponent.class));
annotationConfigApplicationContext.stop();
运行结果
12月 15, 2020 12:10:57 下午 org.springframework.context.annotation.AnnotationConfigApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@dc24521: startup date [Tue Dec 15 12:10:57 CST 2020]; root of context hierarchy
------ userComponent static block
------------- bean instant -----------
--------------- afterPropertiesSet uerProfileComponent:com.xie.java.beans.UserProfileComponent@4d910fd6
12月 15, 2020 12:10:57 下午 org.springframework.context.support.DefaultLifecycleProcessor start
信息: Starting beans in phase 0
12月 15, 2020 12:10:57 下午 org.springframework.context.support.DefaultLifecycleProcessor stop
信息: Stopping beans in phase 0
------------ start
---------------- destroy----
------------ stop callback