使用xml、註解的形式裝配Bean,因其方便快捷,受到你們喜好。通常形式以下:app
1 @Autowired 2 private BeanObjectInterface beanObject;
然而在某些特別場景下,既須要將對象做爲Bean交於Spring管理,又須要在代碼中即時地獲取Bean,用註解形式進行裝配就不太能知足需求。ui
查找資料,Spring提供了 ApplicationContextAware 接口,便於實時地獲取Bean。spa
首先,建立一個 Util 類,繼承 ApplicationContextAware 接口:prototype
1 public class SpringContextUtil implements ApplicationContextAware { 2 3 //Spring應用上下文環境 4 private static ApplicationContext applicationContext; 5 6 /** 7 * 實現ApplicationContextAware接口的回調方法,設置上下文環境 8 * @param applicationContext 9 * @throws BeansException 10 */ 11 public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { 12 SpringContextUtil.applicationContext = applicationContext; 13 } 14 15 public static ApplicationContext getApplicationContext(){ 16 return applicationContext; 17 } 18 19 /** 20 * 獲取對象 21 * @param name 22 * @return Object 一個以類型 23 * @throws BeansException 24 */ 25 26 public static Object getBean(Class requiredType) throws BeansException { 27 return applicationContext.getBean(requiredType); 28 } 29 30 /** 31 * 獲取對象 32 * @param name 33 * @return Object 一個以所給名字註冊的bean的實例 34 * @throws BeansException 35 */ 36 public static Object getBean(String name) throws BeansException { 37 return applicationContext.getBean(name); 38 } 39 40 /** 41 * 獲取類型爲requiredType的對象 42 * 若是bean不能被類型轉換,相應的異常將會被拋出(BeanNotOfRequiredTypeException) 43 * @param name bean註冊名 44 * @param requiredType 返回對象類型 45 * @return Object 返回requiredType類型對象 46 * @throws BeansException 47 */ 48 public static Object getBean(String name, Class requireType) throws BeansException{ 49 return applicationContext.getBean(name, requireType); 50 } 51 52 /** 53 * 若是BeanFactory包含一個與所給名稱匹配的bean定義,則返回true 54 * @param name 55 * @return boolean 56 */ 57 public static boolean containsBean(String name){ 58 return applicationContext.containsBean(name); 59 } 60 61 /** 62 * 判斷以給定名字註冊的bean定義是一個singleton仍是一個prototype。 63 * 若是與給定名字相應的bean定義沒有被找到,將會拋出一個異常(NoSuchBeanDefinitionException) 64 * @param name 65 * @return boolean 66 * @throws NoSuchBeanDefinitionException 67 */ 68 public static boolean isSingleton(String name) throws NoSuchBeanDefinitionException { 69 return applicationContext.isSingleton(name); 70 } 71 72 /** 73 * @param name 74 * @return Class 註冊對象的類型 75 * @throws NoSuchBeanDefinitionException 76 */ 77 public static Class getType(String name) throws NoSuchBeanDefinitionException { 78 return applicationContext.getType(name); 79 } 80 81 /** 82 * 若是給定的bean名字在bean定義中有別名,則返回這些別名 83 * @param name 84 * @return 85 * @throws NoSuchBeanDefinitionException 86 */ 87 public static String[] getAliases(String name) throws NoSuchBeanDefinitionException { 88 return applicationContext.getAliases(name); 89 } 90 91 }
而後在 appcontext.xml 文件中添加相應的bean配置,使得Spring能夠在項目啓動時加載 SpringContextUtil ,完成 applicationContext 的初始化。code
若是是使用註解掃描形式加載bean,則須要在 SpringContextUtil 上方標註 @Component:xml
1 @Component 2 public class SpringContextUtil implements ApplicationContextAware { 3 // ... 內容再也不贅述 4 }
References:對象