1. 程式人生 > >Spring 進階(1) Bean後處理器

Spring 進階(1) Bean後處理器

  1. 水平還不夠,就接受著知識吧。
  2. Bean後處理器的作用就是在bean初始化的時候對bean進行進一步的處理,可以在初始化之前,也可以在初始化之後。
    1. 實現後處理器的類應該實現BeanPostProcess介面,然後重寫,postProcessBeforeInitalization方法和postAfterBeforeInitalization,第一個引數是bean的例項,第二個引數是bean的id,其實你看好多都是這麼實現的,讓某個工具類實現啥介面或者繼承什麼類,然後重寫什麼方法,註冊一下,就成了。
          Object postProcessBeforeInitialization(Object var1, String var2) throws BeansException;
      
          Object postProcessAfterInitialization(Object var1, String var2) throws BeansException;

       

    2. 書上那個被處理的類繼承Inittializition並不是必要的,就是看看而已。bean後處理器的邏輯是判斷postAfterBeforeInitalization,postProcessBeforeInitalization方法傳進來的引數是什麼,然後進行操作。
    3. 話有點多啦,程式碼奉上
      package InstanceClass;
      
      
      import org.springframework.beans.factory.InitializingBean;
      
      public class TestPostProcess implements InitializingBean {
      
          private  String showStr;
      
          public String getShowStr() {
              return showStr;
          }
      
          public void setShowStr(String showStr) {
              this.showStr = showStr;
          }
      
      
      //    這個方法可以看到bean被後處理器處理後的效果
          @Override
          public void afterPropertiesSet() throws  Exception{
              System.out.println(getShowStr());
              System.out.println("afterPropertiesSet function...");
          }
      
      }
      
      package postProcessor;
      
      import InstanceClass.TestPostProcess;
      import org.springframework.beans.factory.config.BeanPostProcessor;
      
      import java.lang.reflect.Field;
      
      public class PostProcessor implements BeanPostProcessor {
      
      //在初始化之前對bean例項進行處理
          @Override
          public Object postProcessBeforeInitialization(Object bean, String beanName){
              return  bean;
          }
      
      //在初始化之後對bean例項進行處理
          @Override
          public Object postProcessAfterInitialization(Object bean, String beanName) {
              System.out.println(beanName);
              if(bean instanceof TestPostProcess){
                  try{
      //                可以看到反射是不二之選
                      Class class1 = bean.getClass();
                      Field field = class1.getDeclaredField("showStr");
                      field.setAccessible(true);
                      field.set(bean, "javaee");
                  }catch (Exception e ){
                      e.printStackTrace();
                  }
              }
              return bean;
          }
      
      }
      
      package testPackage;
      
      import InstanceClass.TestPostProcess;
      import org.springframework.context.ApplicationContext;
      import org.springframework.context.support.ClassPathXmlApplicationContext;
      //測試類,可以看到被後處理器處理完之後ShowStr已被成功修改
      public class SpringTest {
          public static void main(String []args){
              ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");
              TestPostProcess testPostProcess = applicationContext.getBean("instanceClass", TestPostProcess.class);
              System.out.println(testPostProcess.getShowStr());
          }
      }
      
      <?xml version="1.0" encoding="GBK"?>
      <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xmlns="http://www.springframework.org/schema/beans" xmlns:util="http://www.springframework.org/schema/util"
             xsi:schemaLocation="http://www.springframework.org/schema/beans
      	http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">
      
          <!--這是一個普通bean-->
          <bean id="instanceClass" class="InstanceClass.TestPostProcess">
              <property name="showStr" value="java"/>
          </bean>
      
          <!--配置一個後處理器bean,它無需指定id,它會對所有bean進行處理-->
          <bean class="postProcessor.PostProcessor"/>
      
      </beans>

      整理一下各個方法的執行時間 

      1. 注入依賴關係

      2. postProcessBeforeInitalization方法

      3. init-method

      4. postProcessAfterInitalization方法

    4. 這是我看李剛編著的《輕量級javaEE企業應用實戰(第五版)-Struts2+Spring5+Hibernate5/JAP2》後總結出來的。