Spring:利用ApplicationContextAware裝配Bean

使用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:對象

p.s. 還有一篇簡書博客找不到了。其實不少方法是從那裏學來的
相關文章
相關標籤/搜索