yuyee

          IOC初始化和互相引用解決

          觀察IOC中容器初始化某個Bean順序,現先一個JAVABean類,看看控制臺輸出:package com.google.aop.exception.ioc;

          import org.springframework.beans.BeansException;
          import org.springframework.beans.factory.BeanFactory;
          import org.springframework.beans.factory.BeanFactoryAware;
          import org.springframework.beans.factory.DisposableBean;
          import org.springframework.beans.factory.InitializingBean;
          import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
          import org.springframework.beans.factory.config.BeanPostProcessor;
          import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;

          public class JAVABean implements InitializingBean, DisposableBean,
                  BeanFactoryAware, BeanPostProcessor, BeanFactoryPostProcessor {
              
          // private MyBean myBean;
              
          //
              
          // public MyBean getMyBean() {
              
          // return myBean;
              
          // }
              
          //
              
          // public void setMyBean(MyBean myBean) {
              
          // System.out.println("JAVABean 中初始化 屬性myBean");
              
          // this.myBean = myBean;
              
          // }

              
          public JAVABean() {
                  System.out.println(
          "JAVABean 初始化成功");
              }

              
          public void init() {
                  System.out.println(
          "JAVABean init");
              }

              @Override
              
          public void afterPropertiesSet() throws Exception {
                  System.out.println(
          "JAVABean afterPropertiesSet");

              }

              @Override
              
          public void destroy() throws Exception {
                  System.out.println(
          "JAVABean destroy");

              }

              @Override
              
          public void setBeanFactory(BeanFactory arg0) throws BeansException {
                  System.out.println(
          "JAVABean setBeanFactory");

              }

              @Override
              
          public Object postProcessAfterInitialization(Object arg0, String arg1)
                      
          throws BeansException {
                  System.out.println(
          "JAVABean postProcessAfterInitialization");
                  
          return null;
              }

              @Override
              
          public Object postProcessBeforeInitialization(Object arg0, String arg1)
                      
          throws BeansException {
                  System.out.println(
          "JAVABean postProcessBeforeInitialization");
                  
          return null;
              }

              @Override
              
          public void postProcessBeanFactory(ConfigurableListableBeanFactory arg0)
                      
          throws BeansException {
                  System.out.println(
          "JAVABean postProcessBeanFactory");

              }

          }
          配置文件iocContext.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" xmlns:p="http://www.springframework.org/schema/p"
              xmlns:tx
          ="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context"
              xsi:schemaLocation
          ="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
              http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/aop 
              http://www.springframework.org/schema/aop/spring-aop-3.0.xsd 
              http://www.springframework.org/schema/context 
              http://www.springframework.org/schema/context/spring-context-3.0.xsd">
              <bean id="javabean" class="com.google.aop.exception.ioc.JAVABean"
                  init
          -method="init">
                  
          <!-- <property name="myBean" ref="MyBean"></property> -->
              
          </bean>
              
          <!--
                  
          <bean id="MyBean" class="com.google.aop.exception.ioc.MyBean"
                  init
          -method="init"> <property name="javabean"
                  ref
          ="javabean"></property> </bean>
              
          -->
          </beans>
          控制臺輸出:
          JAVABean 初始化成功
          JAVABean setBeanFactory
          JAVABean afterPropertiesSet
          JAVABean init
          JAVABean postProcessBeanFactory
          可見是先實例化類->初始化屬性->設置創建這個類的beanFactory引用->調用afterPropertiesSet->調用init初始化方法->調用postProcessBeanFactory

          現在讓JAVABean和MyBean互相引用,看IOC是怎么解決這個問題
          package com.google.aop.exception.ioc;

          import org.springframework.beans.BeansException;
          import org.springframework.beans.factory.BeanFactory;
          import org.springframework.beans.factory.BeanFactoryAware;
          import org.springframework.beans.factory.DisposableBean;
          import org.springframework.beans.factory.InitializingBean;
          import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
          import org.springframework.beans.factory.config.BeanPostProcessor;
          import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;

          public class JAVABean implements InitializingBean, DisposableBean,
                  BeanFactoryAware, BeanPostProcessor, BeanFactoryPostProcessor {
              
          private MyBean myBean;

              
          public MyBean getMyBean() {
                  
          return myBean;
              }

              
          public void setMyBean(MyBean myBean) {
                  System.out.println(
          "JAVABean 中初始化 屬性myBean");
                  
          this.myBean = myBean;
              }

              
          public JAVABean() {
                  System.out.println(
          "JAVABean 初始化成功");
              }

              
          public void init() {
                  System.out.println(
          "JAVABean init");
              }

              @Override
              
          public void afterPropertiesSet() throws Exception {
                  System.out.println(
          "JAVABean afterPropertiesSet");

              }

              @Override
              
          public void destroy() throws Exception {
                  System.out.println(
          "JAVABean destroy");

              }

              @Override
              
          public void setBeanFactory(BeanFactory arg0) throws BeansException {
                  System.out.println(
          "JAVABean setBeanFactory");

              }

              @Override
              
          public Object postProcessAfterInitialization(Object arg0, String arg1)
                      
          throws BeansException {
                  System.out.println(
          "JAVABean postProcessAfterInitialization");
                  
          return null;
              }

              @Override
              
          public Object postProcessBeforeInitialization(Object arg0, String arg1)
                      
          throws BeansException {
                  System.out.println(
          "JAVABean postProcessBeforeInitialization");
                  
          return null;
              }

              @Override
              
          public void postProcessBeanFactory(ConfigurableListableBeanFactory arg0)
                      
          throws BeansException {
                  System.out.println(
          "JAVABean postProcessBeanFactory");

              }

          }
          MyBean:
          package com.google.aop.exception.ioc;

          import org.springframework.beans.BeansException;
          import org.springframework.beans.factory.BeanFactory;
          import org.springframework.beans.factory.BeanFactoryAware;
          import org.springframework.beans.factory.DisposableBean;
          import org.springframework.beans.factory.InitializingBean;
          import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
          import org.springframework.beans.factory.config.BeanPostProcessor;
          import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;

          public class MyBean implements InitializingBean, DisposableBean,
                  BeanFactoryAware, BeanPostProcessor, BeanFactoryPostProcessor {
              
          private JAVABean javabean;

              
          public MyBean() {
                  System.out.println(
          "MyBean 初始化成功");
              }

              
          public String get() {
                  
          return "Mybean";
              }

              
          public void init(){
                  System.out.println(
          "MyBean init");
              }
              
          public JAVABean getJavabean() {
                  
          return javabean;
              }

              
          public void setJavabean(JAVABean javabean) {
                  
          this.javabean = javabean;
                  System.out.println(
          "MyBean 屬性設置成功");
              }

              @Override
              
          public void afterPropertiesSet() throws Exception {
                  System.out.println(
          "MyBean  afterPropertiesSet");

              }

              @Override
              
          public void destroy() throws Exception {
                  System.out.println(
          "MyBean  destroy");

              }

              @Override
              
          public void setBeanFactory(BeanFactory arg0) throws BeansException {
                  System.out.println(
          "MyBean  setBeanFactory");
              }

              @Override
              
          public Object postProcessAfterInitialization(Object arg0, String arg1)
                      
          throws BeansException {
                  System.out.println(
          "MyBean  postProcessAfterInitialization");
                  
          return null;
              }

              @Override
              
          public Object postProcessBeforeInitialization(Object arg0, String arg1)
                      
          throws BeansException {
                  System.out.println(
          "MyBean  postProcessBeforeInitialization");
                  
          return null;
              }

              @Override
              
          public void postProcessBeanFactory(ConfigurableListableBeanFactory arg0)
                      
          throws BeansException {
                  System.out.println(
          "MyBean  postProcessBeanFactory");

              }

          }
          iocContext.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" xmlns:p="http://www.springframework.org/schema/p"
              xmlns:tx
          ="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context"
              xsi:schemaLocation
          ="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
              http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/aop 
              http://www.springframework.org/schema/aop/spring-aop-3.0.xsd 
              http://www.springframework.org/schema/context 
              http://www.springframework.org/schema/context/spring-context-3.0.xsd">
              <bean id="javabean" class="com.google.aop.exception.ioc.JAVABean"
                  init
          -method="init">
                  
          <property name="myBean" ref="MyBean"></property>
              
          </bean>

              
          <bean id="MyBean" class="com.google.aop.exception.ioc.MyBean"
                  init
          -method="init">
                  
          <property name="javabean" ref="javabean"></property>
              
          </bean>

          </beans>
          控制臺輸出:
          JAVABean 初始化成功
          MyBean 初始化成功
          MyBean 屬性設置成功
          MyBean  setBeanFactory
          MyBean  afterPropertiesSet
          MyBean init
          JAVABean 中初始化 屬性myBean
          JAVABean setBeanFactory
          JAVABean afterPropertiesSet
          JAVABean init
          JAVABean postProcessBeanFactory
          MyBean  postProcessBeanFactory
          由結果可知,當IOC容器初始化JAVABean后進行屬性初始化,發現MyBean這類屬性還沒初始化,則先初始化Mybean類直到調用他的init方法,之后再回到JAVABean類初始化,將Mybean引用賦給JavaBean

          posted on 2010-11-10 16:27 羔羊 閱讀(417) 評論(0)  編輯  收藏 所屬分類: IOC

          主站蜘蛛池模板: 本溪市| 蒲江县| 游戏| 全州县| 镶黄旗| 门头沟区| 囊谦县| 广元市| 敖汉旗| 北海市| 赫章县| 杭锦旗| 乌兰察布市| 阿城市| 通许县| 鄢陵县| 秭归县| 岳阳县| 绍兴县| 西乌珠穆沁旗| 台江县| 鄢陵县| 苏尼特左旗| 土默特左旗| 柳州市| 莱阳市| 佛教| 拉孜县| 逊克县| 东丽区| 新昌县| 阿瓦提县| 夏邑县| 青海省| 闽清县| 丹巴县| 崇信县| 凉城县| 兴城市| 四平市| 长子县|