Spring(八)—— bean的生命周期
一、bean的生命周期图
二、bean的生命周期图解释
instantiate bean:对象实例化(new一个对象)
populate properties:封装属性(把xml中数据封装到对象中去)
如果bean实现BeanNameAware,执行setBeanName
如果bean实现BeanFactoryAware,执行setBeanFactory,获取Spring容器
如果存在类实现BeanPostProcessor(后处理bean),执行postProcessAfterInitialization
如果bean实现InitializingBean,执行afterPropertiesSet
调用<bean init-method="init">指定初始化方法init
如果存在类实现BeanPostProcessor(处理Bean),执行postProcessAfterInitialization执行业务处理
如果bean实现DisposableBean执行destory。
调用<bean destory-method="customerDestory">指定销毁方法customerDestory
三、案例
1. User.java

1 package com.gyf.model; 2 3 4 import org.springframework.beans.BeansException; 5 import org.springframework.beans.factory.BeanFactory; 6 import org.springframework.beans.factory.BeanFactoryAware; 7 import org.springframework.beans.factory.BeanNameAware; 8 import org.springframework.beans.factory.DisposableBean; 9 import org.springframework.beans.factory.InitializingBean; 10 11 public class User implements BeanNameAware,BeanFactoryAware,InitializingBean,DisposableBean{ 12 13 private String username; 14 private String password; 15 16 public String getUsername() { 17 return username; 18 } 19 20 public void setUsername(String username) { 21 System.out.println("2. 赋值属性username:" + username); 22 this.username = username; 23 } 24 25 public String getPassword() { 26 return password; 27 } 28 29 public void setPassword(String password) { 30 System.out.println("2. 赋值属性password:" + password); 31 this.password = password; 32 } 33 34 public User() { 35 System.out.println("1. 实例化。。。"); 36 } 37 38 @Override 39 public String toString() { 40 return "User{" + 41 "username='" + username + '\'' + 42 ", password='" + password + '\'' + 43 '}'; 44 } 45 46 @Override 47 public void setBeanName(String s) { 48 System.out.println("3. 设置bean的名字(为配置文件中bean的id)" + s); 49 } 50 51 @Override 52 public void setBeanFactory(BeanFactory beanFactory) throws BeansException { 53 //bean工厂就是容器,意思是把我们的user对象放进工厂(容器)中去 54 System.out.println("4. Bean工厂" + beanFactory); 55 } 56 57 @Override 58 public void afterPropertiesSet() throws Exception { 59 System.out.println("6. 属性赋值完成。"); 60 } 61 62 public void myInit(){ 63 System.out.println("7. 自定义的初始化方法。"); 64 } 65 66 @Override 67 public void destroy() throws Exception { 68 //资源释放 69 System.out.println("9. Bean对象被销毁(不用的时候从容器中移除)。"); 70 } 71 72 public void myDestory(){ 73 //资源释放 74 System.out.println("10. 自定义的销毁方法。"); 75 } 76 }
2. MyBeanPostProcessor.java

1 package com.gyf.model; 2 3 import org.springframework.beans.BeansException; 4 import org.springframework.beans.factory.config.BeanPostProcessor; 5 6 public class MyBeanPostProcessor implements BeanPostProcessor { 7 @Override 8 public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { 9 System.out.println("5. 预处理" + bean + beanName); 10 return bean; 11 } 12 13 @Override 14 public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { 15 System.out.println("8. 后处理" + bean + beanName); 16 return bean; 17 } 18 }
3. beans5.xml

1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation=" 5 http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> 6 7 <bean id="user" class="com.gyf.model.User" init-method="myInit" destroy-method="myDestory"> 8 <property name="username" value="admin"></property> 9 <property name="password" value="123456"></property> 10 </bean> 11 12 <!--配置bean处理器--> 13 <bean id="beanProcess" class="com.gyf.model.MyBeanPostProcessor"></bean> 14 </beans>
4. Lesson05.java

1 package com.gyf.test; 2 3 import com.gyf.model.User; 4 5 import org.junit.Test; 6 import org.springframework.context.ApplicationContext; 7 import org.springframework.context.support.ClassPathXmlApplicationContext; 8 9 import java.lang.reflect.InvocationTargetException; 10 11 public class Lesson05 { 12 13 @Test 14 public void test1() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException { 15 ApplicationContext context = new ClassPathXmlApplicationContext("beans5.xml"); 16 User user = (User) context.getBean("user"); 17 System.out.println(user); 18 19 //关闭容器 20 context.getClass().getMethod("close").invoke(context); 21 } 22 23 }
5. 结果输出如下图: