spring bean生命周期主要分为初始化创建、使用、销毁。下面详细介绍这个过程。
- 1实例化bean 通过加载xml文件。
- 2设置bean属性值
- 3调用
BeanNameAware setBeanName
- 4调用
BeanFactoryAware setBeanFactory
- 5调用
ApplicationContextAware setApplicationContext
- 6
BeanPostProcessor postProcessBeforeInitialization
预先初始化处理方法,通常可以对所有的bean进行自定义操作 - 7
InitializingBean afterPropertiesSet
- 8自定义初始化方法 在bean中创建方法,在xml文件通过
<bean name="student" class="com.hiro.beanLifecycle.entity.Student" init-method="init">
加入。 - 9
BeanPostProcessor postProcessAfterInitialization
后处理方法 - 10使用bean。。。。。
- 11容器关闭
DisposableBean destroy
方法 - 12或者自定义destroy 同理按照init配置
注意
在手动启动关闭容器使用AbstractApplicationContext
代替ApplicationContext
使用close()方法
示例bean
package com.hiro.beanLifecycle.entity;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.*;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
/**
* Project: springStart
*
* @author : hirolin
* @date : 2019/5/18 16:52
*/
public class Student implements BeanNameAware, BeanFactoryAware, ApplicationContextAware, InitializingBean, DisposableBean{
private String name;
public String getName() {
return name;
}
/**
* 8自定义初始化方法
*/
public void init(){
System.out.println("Student init ...... ");
}
/**
* 1. bean初始化调用构造方法
*/
public Student() {
System.out.println("Student construct ...... ");
}
/**
* 2.设置属性值
* @param name
*/
public void setName(String name) {
System.out.println("Student setName ...... " + name);
this.name = name;
}
/**
* 4.调用setBeanFactory接口
* @param beanFactory
* @throws BeansException
*/
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
System.out.println("Student setBeanFactory : " + beanFactory);
}
/**
* 3.调用setBeanName接口
* @param s
*/
public void setBeanName(String s) {
System.out.println("Student setBeanName : " + s);
}
/**
* 5. 调用setApplicationContext
* @param applicationContext
* @throws BeansException
*/
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
System.out.println("Student setApplicationContext : " + applicationContext);
}
/**
* 7.属性设置之后调用
* @throws Exception
*/
public void afterPropertiesSet() throws Exception {
System.out.println("Student afterPropertiesSet ...... ");
}
/**
* 11 使用接口销毁
* @throws Exception
*/
public void destroy() throws Exception {
System.out.println("Student destroy ...... ");
}
/**
* 12自定义销毁
*/
public void destroyByXml() {
System.out.println("Student destroyByXml ...... ");
}
}
beanLifecycle.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean name="student" class="com.hiro.beanLifecycle.entity.Student" init-method="init" destroy-method="destroyByXml">
<property name="name" value="小花"></property>
</bean>
<bean name="myProcessor" class="com.hiro.beanLifecycle.processor.MyBeanProcessor"></bean>
</beans>
MyBeanProcessor
package com.hiro.beanLifecycle.processor;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.lang.Nullable;
/**
* Project: springStart
*
* @author : hirolin
* @date : 2019/5/18 17:38
*/
public class MyBeanProcessor implements BeanPostProcessor{
/**
*6.预先初始化处理方法,通常可以对所有的bean进行自定义操作
* @param bean
* @param beanName
* @return
* @throws BeansException
*/
@Nullable
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("MyBeanProcessor postProcessBeforeInitialization ...... ");
return null;
}
/**
* 9.后处理方法
* @param bean
* @param beanName
* @return
* @throws BeansException
*/
@Nullable
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("MyBeanProcessor postProcessAfterInitialization ...... ");
return null;
}
}
初始化容器并测试
package com.hiro.beanLifecycle.test;
import com.hiro.beanLifecycle.entity.Student;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* Project: springStart
*
* @author : hirolin
* @date : 2019/5/18 16:52
*/
public class test {
public static void main(String [] args) {
AbstractApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:beanLifecycle.xml");
//10 使用bean
Student student = (Student) applicationContext.getBean("student");
System.out.println(student.toString());
applicationContext.close();
}
}
代码地址
输出对应上面代码调用步骤: