java Spring boot使用spring反射

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)的方式來加載類、調用類方法,以及使用類屬性。這樣的話,對於編碼和維護帶來至關大的便利。在程序進行改動的時候,也只會改動相應的功能就好了,調用的方法是不用改的。更不會一改就改全身。工具

相關文章
相關標籤/搜索