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...
I am InitBean's setName method...
I am InitBean's serInfo method...
I am InitBean's init method...
InitBean{name='操蛋儿', info='my name is ET'}
I am InitBean's destroy method...

 

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...
I am InitBean's setName method...
I am InitBean's serInfo method...
I am MyBeanPostProcessor's before method...bean: InitBean{name='操蛋儿', info='my name is ET'} beanName: initBean
I am InitBean's init method...
I am MyBeanPostProcessor's after method...bean: InitBean{name='操蛋儿', info='my name is ET'} beanName: initBean
InitBean{name='操蛋儿', info='my name is ET'}
I am InitBean's destroy method...

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...
I am InitBean's setName method...
I am InitBean's serInfo method...
I am MyBeanPostProcessor's before method...bean: InitBean{name='操蛋儿', info='my name is ET'} beanName: initBean
I am InitBean's Constructor...
I am InitBean's setName method...
I am InitBean's serInfo method...
I am InitBean's init method...
I am MyBeanPostProcessor's after method...bean: InitBean{name='狗剩儿', info='I am the revised infomation...'} beanName: initBean
InitBean{name='狗剩儿', info='I am the revised infomation...'}
I am InitBean's destroy method...

posted @ 2017-03-02 16:57  Chinda  阅读(1611)  评论(0编辑  收藏  举报