Spring学习-- IOC 容器中 bean 的生命周期
Spring IOC 容器可以管理 bean 的生命周期 , Spring 允许在 bean 声明周期的特定点执行定制的任务。
Spring IOC 容器对 bean 的生命周期进行管理的过程:
- 通过构造器或者工厂方法创建 bean 实例。
- 为 bean 的属性赋值和对其他 bean 的引用。
- 调用 bean 的初始化方法。
- bean 初始成功,可以使用。
- 容器关闭时 , 调用 bean 的销毁方法。
在 bean 的声明里设置 init-method 和 destroy-method 属性 , 为 bean 指定初始化和销毁方法。
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="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> 5 6 <bean id="initBean" class="com.itdjx.spring.beans.init.InitBean" init-method="init" destroy-method="destroy"> 7 <property name="name" value="操蛋儿"/> 8 <property name="info" value="my name is ET"/> 9 </bean> 10 11 </beans>
1 package com.itdjx.spring.beans.init; 2 3 /** 4 * @author Wáng Chéng Dá 5 * @create 2017-03-02 16:07 6 */ 7 public class InitBean { 8 9 private String name; 10 11 private String info; 12 13 public InitBean() { 14 System.out.println("I am InitBean's Constructor..."); 15 } 16 17 public void init() { 18 System.out.println("I am InitBean's init method..."); 19 } 20 21 public void destroy() { 22 System.out.println("I am InitBean's destroy method..."); 23 } 24 25 public String getName() { 26 return name; 27 } 28 29 public void setName(String name) { 30 System.out.println("I am InitBean's setName method..."); 31 this.name = name; 32 } 33 34 public String getInfo() { 35 return info; 36 } 37 38 public void setInfo(String info) { 39 System.out.println("I am InitBean's serInfo method..."); 40 this.info = info; 41 } 42 43 @Override 44 public String toString() { 45 return "InitBean{" + 46 "name='" + name + '\'' + 47 ", info='" + info + '\'' + 48 '}'; 49 } 50 }
1 package com.itdjx.spring.beans.init; 2 3 import org.springframework.context.support.ClassPathXmlApplicationContext; 4 5 /** 6 * @author Wáng Chéng Dá 7 * @create 2017-03-02 16:16 8 */ 9 public class Main { 10 11 public static void main(String[] args) { 12 13 ClassPathXmlApplicationContext cxt = new ClassPathXmlApplicationContext("beans-init.xml"); 14 InitBean initBean = (InitBean) cxt.getBean("initBean"); 15 System.out.println(initBean); 16 cxt.close(); 17 18 } 19 }
控制台输出:
I am InitBean's Constructor... |
bean 后置处理器:
- bean 后置处理器允许在调用初始方法前后对 bean 进行额外的处理。
- bean 后置处理器对 IOC 容器里的所有 bean 实例逐一处理 , 而非单一实例。
- bean 后置处理器需要实现 BeanPostProcessor Interface , 在初始化方法被调用前后 , Spring 将把每个 bean 实例分别传送给上述接口的两个方法。
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="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> 5 6 <bean id="initBean" class="com.itdjx.spring.beans.init.InitBean" init-method="init" destroy-method="destroy"> 7 <property name="name" value="操蛋儿"/> 8 <property name="info" value="my name is ET"/> 9 </bean> 10 11 <bean class="com.itdjx.spring.beans.init.MyBeanPostProcessor"/> 12 13 </beans>
1 package com.itdjx.spring.beans.init; 2 3 import org.springframework.beans.BeansException; 4 import org.springframework.beans.factory.config.BeanPostProcessor; 5 6 /** 7 * 我的 bean 后置处理器 8 * 9 * @author Wáng Chéng Dá 10 * @create 2017-03-02 16:25 11 */ 12 public class MyBeanPostProcessor implements BeanPostProcessor { 13 14 @Override 15 public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { 16 System.out.println("I am MyBeanPostProcessor's before method...bean: " + bean + " beanName: " + beanName); 17 return bean; 18 } 19 20 @Override 21 public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { 22 System.out.println("I am MyBeanPostProcessor's after method...bean: " + bean + " beanName: " + beanName); 23 return bean; 24 } 25 }
控制台输出:
I am InitBean's Constructor... |
bean:实例本身。
beanName:IOC 容器配置的 bean 的名字
返回值:是实际上返给用户的那个 bean 实例 , 注意:可以在上述两个方法中修改 bean 的属性 , 甚至返回一个新的 bean 实例。
添加 bean 后置处理器的 bean 的生命周期:
- 通过构造器或工厂方法创建 bean 实例。
- 为 bean 的属性赋值和对其他 bean 的引用。
- 将 bean 实例传递给 bean 后置处理器的 postProcessBeforeInitialization 方法。
- 调用 bean 的初始化方法。
- 将 bean 实例传递非 bean 后置处理器的 postProcessAfterInitialization 方法。
- bean 初始化成功 , 可以使用。
- 容器关闭时 , 调用 bean 的销毁方法。
1 package com.itdjx.spring.beans.init; 2 3 import org.springframework.beans.BeansException; 4 import org.springframework.beans.factory.config.BeanPostProcessor; 5 6 /** 7 * 我的 bean 后置处理器 8 * 9 * @author Wáng Chéng Dá 10 * @create 2017-03-02 16:25 11 */ 12 public class MyBeanPostProcessor implements BeanPostProcessor { 13 14 @Override 15 public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { 16 System.out.println("I am MyBeanPostProcessor's before method...bean: " + bean + " beanName: " + beanName); 17 InitBean initBean = new InitBean(); 18 initBean.setName("狗剩儿"); 19 initBean.setInfo("I am the revised infomation..."); 20 return initBean; 21 } 22 23 @Override 24 public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { 25 System.out.println("I am MyBeanPostProcessor's after method...bean: " + bean + " beanName: " + beanName); 26 return bean; 27 } 28 }
控制台输出:
I am InitBean's Constructor... |