Java基础之《spring中bean生命周期》

1、bean实例化前
1)BeanNameAware接口
2)BeanFactoryAware接口

2、bean实例化完成(对象创建)
1)ApplicationContextAware接口
获取spring上下文,说明bean已经实例化完成(构造方法执行完成)
spring容器相当于一个大型的工厂,里面的产品就是实例化的bean
实例化的理解:我的理解是实例化应该是spring的容器BeanFactory(ApplicantContext)将Object bean转变为一个具体的Bean的过程

3、bean实例化后的资源的初始化和销毁
bean实例化是spring把bean的对象生成了,但是bean中如有资源需要初始化的话,可以使用以下方式
以下是在对象加载完,依赖注入(@Autowired、@Value)后执行
1)@PostConstruct注解:bean初始化方法
2)InitializingBean接口:bean初始化之后执行,调用afterPropertiesSet方法
3)xml中配置init-method:指定初始化方法
4)@PreDestroy注解:bean销毁之前执行
5)DisposableBean接口:bean销毁前回收资源,调用destroy方法
6)xml中配置destory-method:指定销毁方法
7)在初始化方法之后会执行SmartLifecycle接口的start方法
SmartLifecycle接口是spring容器在所有bean加载和初始化完毕后执行回调
8)BeanPostProcessor是一个公共功能的接口,它是spring提供的扩展接口,对spring上下文中所有的bean,spring初始化类时都会调用一遍postProcessBeforeInitialization和postProcessAfterInitialization方法
初始化之前调用postProcessBeforeInitialization
初始化之后调用postProcessAfterInitialization

4、建立测试类BeanLifeCycle.java

package com.study.domain.testBean;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

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;
import org.springframework.context.SmartLifecycle;
import org.springframework.stereotype.Component;

@Component
public class BeanLifeCycle implements BeanNameAware, BeanFactoryAware, ApplicationContextAware, InitializingBean,
		DisposableBean, SmartLifecycle, BeanPostProcessor {

	private boolean isRunning = false;

	@Override
	public void setBeanName(String name) {
		System.out.println("========== 执行BeanNameAware接口");
	}

	@Override
	public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
		System.out.println("========== 执行BeanFactoryAware接口");
	}

	@Override
	public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
		System.out.println("========== 执行ApplicationContextAware接口");
	}

	@PostConstruct
	public void initBean() {
		System.out.println("========== 执行@PostConstruct注解");
	}

	@Override
	public void afterPropertiesSet() throws Exception {
		System.out.println("========== 执行InitializingBean接口");
	}

	@PreDestroy
	public void destroyBean() {
		System.out.println("========== 执行@PreDestroy注解");
	}

	@Override
	public void destroy() throws Exception {
		System.out.println("========== 执行DisposableBean接口");
	}

	@Override
	public void start() {
		System.out.println("========== 执行SmartLifecycle接口start方法");
		isRunning = true;
	}

	@Override
	public void stop() {
		System.out.println("========== 执行SmartLifecycle接口stop方法");
		isRunning = false;
	}

	/**
	 * 返回true时start方法会被自动执行,返回false则不会
	 */
	@Override
	public boolean isAutoStartup() {
		System.out.println("========== 执行SmartLifecycle接口isAutoStartup方法");
		return true;
	}

	/**
	 * 1. 只有该方法返回false时,start方法才会被执行。<br/>
	 * 2. 只有该方法返回true时,stop(Runnable callback)或stop()方法才会被执行。
	 */
	@Override
	public boolean isRunning() {
		System.out.println("========== 执行SmartLifecycle接口isRunning方法");
		return isRunning;
	}

	/**
	 * 如果工程中有多个实现接口SmartLifecycle的类,则这些类的start的执行顺序按getPhase方法返回值从小到大执行。<br/>
	 * 例如:1比2先执行,-1比0先执行。 stop方法的执行顺序则相反,getPhase返回值较大类的stop方法先被调用,小的后被调用。
	 */
	@Override
	public int getPhase() {
		return 0;
	}

	@Override
	public void stop(Runnable callback) {
		System.out.println("========== 执行SmartLifecycle接口stop(Runnable callback)方法");
		callback.run();
		isRunning = false;
	}

	/**
	 * 实例化Bean之前
	 */
	@Override
	public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
		if ("threadPool".equals(beanName)) {
			System.out.println("========== 执行postProcessBeforeInitialization方法" + beanName);
		}
		return bean;
	}

	/**
	 * 实例化Bean之后
	 */
	@Override
	public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
		if ("threadPool".equals(beanName)) {
			System.out.println("========== 执行postProcessAfterInitialization方法" + beanName);
		}
		return bean;
	}

}

5、启动容器
显示的日志信息

========== 执行BeanNameAware接口
========== 执行BeanFactoryAware接口
========== 执行ApplicationContextAware接口
========== 执行@PostConstruct注解
========== 执行InitializingBean接口
========== 执行postProcessBeforeInitialization方法threadPool
========== 执行postProcessAfterInitialization方法threadPool
========== 执行SmartLifecycle接口isRunning方法
========== 执行SmartLifecycle接口isAutoStartup方法
========== 执行SmartLifecycle接口start方法
//这里正常使用bean
========== 执行SmartLifecycle接口isRunning方法
========== 执行SmartLifecycle接口stop(Runnable callback)方法
========== 执行@PreDestroy注解
========== 执行DisposableBean接口
1)初始化threadPool对象之前
========== 执行postProcessBeforeInitialization方法threadPool
2)初始化threadPool对象
3)初始化threadPool对象之后
========== 执行postProcessAfterInitialization方法threadPool

postProcessBeforeInitialization这里只取了一个bean的名字threadPool
问题:此时,它的变量有没有初始化?它依赖的对象有没有注入?
经测试,在执行postProcessBeforeInitialization时,实例的变量已经注入了。是先有实例变量,再调用类的构造方法

6、对象创建的生命周期
整个对象创建的生命周期和执行顺序
类变量 -> 类块 -> 实例变量 -> 实例块 -> 实例构造器
整个构造器执行成功之后,才算对象创建完成
执行实例块的时候,实例变量申明了,但是没有初始化

参考资料:
https://blog.csdn.net/qq_43716366/article/details/107307808
https://blog.csdn.net/caihaijiang/article/details/35552859
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值