ApplicationContext
對象是
Spring
開源框架的上下文對象實例,在項目運行時自動裝載
Handler
內的所有信息到內存。
傳統的獲取方式有很多種,不過隨着
Spring
版本的不斷迭代,官方也慢慢的不建議使用部分方式。
下面我簡單介紹一種
Spring
官方推薦使用的方式!
基於SpringBoot平台完成ApplicationContext
對象的獲取,並通過實例手動獲取Spring
管理的bean
.
構建項目
本章項目不需要太多的內容,添加Web依賴就可以了。
ApplicationContextAware
這個接口對象就是我們今天的主角,其實以實現
ApplicationContextAware
接口的方式獲取
ApplicationContext
對象實例並不是SpringBoot特有的功能,
早在Spring3.0x版本之后就存在了這個接口,在傳統的
Spring
項目內同樣是可以獲取到
ApplicationContext
實例的,下面我們看看該如何編碼才能達到我們的效果呢?
實現ApplicationContextAware接口
創建一個實體類並實現
ApplicationContextAware
接口,重寫接口內的setApplicationContext
方法來完成獲取ApplicationContext
實例的方法,代碼如下所示:
package com.xunmei.api; import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.stereotype.Component; /** * 獲取Spring上下文對象 * */ @Component public class ApplicationContextProvider implements ApplicationContextAware { /** * 上下文對象實例 */ private ApplicationContext applicationContext; @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { this.applicationContext = applicationContext; } /** * 獲取applicationContext * @return */ public ApplicationContext getApplicationContext() { return applicationContext; } /** * 通過name獲取 Bean. * @param name * @return */ public Object getBean(String name){ return getApplicationContext().getBean(name); } /** * 通過class獲取Bean. * @param clazz * @param <T> * @return */ public <T> T getBean(Class<T> clazz){ return getApplicationContext().getBean(clazz); } /** * 通過name,以及Clazz返回指定的Bean * @param name * @param clazz * @param <T> * @return */ public <T> T getBean(String name,Class<T> clazz){ return getApplicationContext().getBean(name, clazz); } }
我們拿到ApplicationContext
對象實例后就可以手動獲取Bean
的注入實例對象,
在ApplicationContextProvider
類內我簡單的實現了幾個方法來獲取指定的Bean
實例,當然你可以添加更多的方法來完成更多的業務邏輯。
如果你是想在非Spring
管理的實體內使用ApplicationContext
還不想采用注入ApplicationContextProvider
來完成實例化,
這時我們可以修改ApplicationContext
實例對象為靜態實例,方法改為靜態方法,這樣在外部同樣是可以獲取到指定Bean
的實例。如下所示:
@Component public class ApplicationContextProvider implements ApplicationContextAware { /** * 上下文對象實例 */ private static ApplicationContext applicationContext; @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { this.applicationContext = applicationContext; } /** * 獲取applicationContext * @return */ public static ApplicationContext getApplicationContext() { return applicationContext; } /** * 通過name獲取 Bean. * @param name * @return */ public static Object getBean(String name){ return getApplicationContext().getBean(name); } /** * 通過class獲取Bean. * @param clazz * @param <T> * @return */ public static <T> T getBean(Class<T> clazz){ return getApplicationContext().getBean(clazz); } /** * 通過name,以及Clazz返回指定的Bean * @param name * @param clazz * @param <T> * @return */ public static <T> T getBean(String name,Class<T> clazz){ return getApplicationContext().getBean(name, clazz); } }
這里要注意
ApplicationContextProvider
類上的@Component
注解是不可以去掉的,去掉后Spring
就不會自動調用setApplicationContext
方法來為我們設置上下文實例。
總結
本章內容較少,主要講解了
參考:https://www.jianshu.com/p/3cd2d4e73eb7
SpringBoot
平台下采用
ApplicationContextAware
的方式完成
ApplicationContext
實例的獲取,並通過
ApplicationContext
實例完成對
Spring
管理的
Bean
實例手動獲取