Spring:利用ApplicationContextAware裝配Bean


使用xml、注解的形式裝配Bean,因其方便快捷,受到大家喜愛。一般形式如下:

1 @Autowired
2 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 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 的初始化。

如果是使用注解掃描形式加載bean,則需要在 SpringContextUtil 上方標注 @Component:

1 @Component
2 public class SpringContextUtil implements ApplicationContextAware {
3     // ... 內容不再贅述    
4 }

 

References:

p.s. 還有一篇簡書博客找不到了。其實很多方法是從那里學來的


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM