標籤:ref tar def 上下 lan static get name interface
使用xml、註解的形式裝配Bean,因其方便快捷,受到大家喜愛。一般形式如下:
1 @Autowired2 private BeanObjectInterface beanObject;
然而在某些特別情境下,既需要將對象作為Bean交於Spring管理,又需要在代碼中即時地擷取Bean,用註解形式進行裝配就不太能滿足需求。
尋找資料,Spring提供了 ApplicationContextAware 介面,便於即時地擷取Bean。
首先,建立一個 Util 類,繼承 ApplicationContextAware 介面:
1 public class SpringContextUtil implements ApplicationContextAware { 2 3 //Spring應用上下文環境 4 private static ApplicationContext applicationContext; 5 6 /** 7 * 實現ApplicationContextAware介面的回調方法,設定上下文環境 8 * @param applicationContext 9 * @throws BeansException10 */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 name22 * @return Object 一個以類型23 * @throws BeansException24 */25 26 public static Object getBean(Class requiredType) throws BeansException {27 return applicationContext.getBean(requiredType);28 }29 30 /**31 * 擷取對象32 * @param name33 * @return Object 一個以所給名字註冊的bean的執行個體34 * @throws BeansException35 */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 BeansException47 */48 public static Object getBean(String name, Class requireType) throws BeansException{49 return applicationContext.getBean(name, requireType);50 }51 52 /**53 * 如果BeanFactory包含一個與所給名稱匹配的bean定義,則返回true54 * @param name55 * @return boolean56 */57 public static boolean containsBean(String name){58 return applicationContext.containsBean(name);59 }60 61 /**62 * 判斷以給定名字註冊的bean定義是一個singleton還是一個prototype。63 * 如果與給定名字相應的bean定義沒有被找到,將會拋出一個異常(NoSuchBeanDefinitionException)64 * @param name65 * @return boolean66 * @throws NoSuchBeanDefinitionException67 */68 public static boolean isSingleton(String name) throws NoSuchBeanDefinitionException {69 return applicationContext.isSingleton(name);70 }71 72 /**73 * @param name74 * @return Class 註冊對象的類型75 * @throws NoSuchBeanDefinitionException76 */77 public static Class getType(String name) throws NoSuchBeanDefinitionException {78 return applicationContext.getType(name);79 }80 81 /**82 * 如果給定的bean名字在bean定義中有別名,則返回這些別名83 * @param name84 * @return85 * @throws NoSuchBeanDefinitionException86 */87 public static String[] getAliases(String name) throws NoSuchBeanDefinitionException {88 return applicationContext.getAliases(name);89 }90 91 }
然後在 appcontext.xml 檔案中添加相應的bean配置,使得Spring可以在項目啟動時載入 SpringContextUtil ,完成 applicationContext 的初始化。
如果是使用註解掃描形式載入bean,則需要在 SpringContextUtil 上方標註 @Component:
1 @Component2 public class SpringContextUtil implements ApplicationContextAware {3 // ... 內容不再贅述 4 }
References:
https://www.jianshu.com/p/4145f507f3e7http://blog.kazaff.me/2014/12/05/@Scope(prototype)%E7%9A%84%E6%AD%A3%E7%A1%AE%E7%94%A8%E6%B3%95/https://www.ktanx.com/blog/p/326p.s. 還有一篇簡書部落格找不到了。其實很多方法是從那裡學來的
Spring:利用ApplicationContextAware裝配Bean