spring 反射java
當你配置各類各樣的bean時,是以配置文件的形式配置的,你須要用到哪些bean就配哪些,spring容器就會根據你的需求去動態加載,你的程序就能健壯地運行。spring
1.能夠經過類名去實例化這個類app
applicationContext.getBean(name)
2.經過類型獲取類
applicationContext.getBeansOfType(clazz);
首先要拿到spring容器,類裏實現ApplicationContextAware接口能獲取applicationContext
能夠把獲取bean的方法寫到一個工具類裏實現ApplicationContextAware,把applicationContext定義成常量方便調用
1 private static ApplicationContext applicationContext = null; 2 3 @Override 4 public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { 5 if (SpringUtil.applicationContext == null) { 6 SpringUtil.applicationContext = applicationContext; 7 } 8 } 9 10 public static ApplicationContext getApplicationContext() { 11 return applicationContext; 12 } 13 14 public static <T> Map<String, T> getBeanOfType(Class<T> clazz) { 15 return getApplicationContext().getBeansOfType(clazz); 16 } 17 18 public static Object getBean(String name) { 19 return getApplicationContext().getBean(name); 20 } 21 22 public static <T> T getBean(Class<T> clazz) { 23 return getApplicationContext().getBean(clazz); 24 } 25 26 public static <T> T getBean(String name, Class<T> clazz) { 27 return getApplicationContext().getBean(name, clazz); 28 }
在spring boot框架中省略了xml<bean>的配置,經過@Bean注入到配置類中,讓spring找到寫的這個工具類
在多態的實現中,有時須要不少判斷去執行不一樣的實現,這個時候就能夠經過實現類類名或者接口去找到要執行的接口
舉個例子
1 Map<String, IAddReceipt> map = SpringUtil.getBeanOfType(IAddReceipt.class); 2 for (IAddReceipt addReceipt : map.values()) { 3 addReceipt.save(addReceiptVO); 4 }
我要實現一個功能,他分了好幾個模塊的save動做,我定義了一個 IAddReceipt的接口,裏面是一個save方法,這幾個模塊的save我分別建了一個IAddReceipt的實現類,每一個實現類裏都有本身的操做,這樣我獲取到這個接口的實現類放到map裏,而後去遍歷map調用save方法。框架
這樣在主方法中,就完成了對每一個模塊的操做。ide
反射機制是框架技術的原理和核心部分。經過反射機制咱們能夠動態的經過改變配置文件(javabean)的方式來加載類、調用類方法,以及使用類屬性。這樣的話,對於編碼和維護帶來至關大的便利。在程序進行改動的時候,也只會改動相應的功能就好了,調用的方法是不用改的。更不會一改就改全身。工具