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...


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM