Spring 進階(1) Bean後處理器
阿新 • • 發佈:2018-12-10
- 水平還不夠,就接受著知識吧。
- Bean後處理器的作用就是在bean初始化的時候對bean進行進一步的處理,可以在初始化之前,也可以在初始化之後。
- 實現後處理器的類應該實現BeanPostProcess介面,然後重寫,postProcessBeforeInitalization方法和postAfterBeforeInitalization,第一個引數是bean的例項,第二個引數是bean的id,其實你看好多都是這麼實現的,讓某個工具類實現啥介面或者繼承什麼類,然後重寫什麼方法,註冊一下,就成了。
Object postProcessBeforeInitialization(Object var1, String var2) throws BeansException; Object postProcessAfterInitialization(Object var1, String var2) throws BeansException;
- 書上那個被處理的類繼承Inittializition並不是必要的,就是看看而已。bean後處理器的邏輯是判斷postAfterBeforeInitalization,postProcessBeforeInitalization方法傳進來的引數是什麼,然後進行操作。
- 話有點多啦,程式碼奉上
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>
整理一下各個方法的執行時間
-
注入依賴關係
-
postProcessBeforeInitalization方法
-
init-method
-
postProcessAfterInitalization方法
-
-
這是我看李剛編著的《輕量級javaEE企業應用實戰(第五版)-Struts2+Spring5+Hibernate5/JAP2》後總結出來的。
- 實現後處理器的類應該實現BeanPostProcess介面,然後重寫,postProcessBeforeInitalization方法和postAfterBeforeInitalization,第一個引數是bean的例項,第二個引數是bean的id,其實你看好多都是這麼實現的,讓某個工具類實現啥介面或者繼承什麼類,然後重寫什麼方法,註冊一下,就成了。