ApplicationContextAware接口的作用

笛里谁知壮士心,沙头空照征人骨。这篇文章主要讲述ApplicationContextAware接口的作用相关的知识,希望能为你提供帮助。
在Web应用中,Spring容器通常采用声明式方式配置产生:开发者只要在web.xml中配置一个Listener,该Listener将会负责初始化Spring容器,MVC框架可以直接调用Spring容器中的Bean,无需访问Spring容器本身。在这种情况下,容器中的Bean处于容器管理下,无需主动访问容器,只需接受容器的依赖注入即可。
但在某些特殊的情况下,Bean需要实现某个功能,但该功能必须借助于Spring容器才能实现,此时就必须让该Bean先获取Spring容器,然后借助于Spring容器实现该功能。为了让Bean获取它所在的Spring容器,可以让该Bean实现ApplicationContextAware接口。
下面示例为实现ApplicationContextAware的工具类,可以通过其它类引用它以操作spring容器及其中的Bean实例。
 
[java]  view plain  copy  

  1. public  class  SpringContextHolder  implements  ApplicationContextAware  {   
  2.         private  static  ApplicationContext  applicationContext  =  null;    
  3.    
  4.         /** 
  5.           *  获取静态变量中的ApplicationContext. 
  6.           */   
  7.         public  static  ApplicationContext  getApplicationContext()  {   
  8.                 assertContextInjected();    
  9.                 return  applicationContext;    
  10.         }   
  11.    
  12.         /** 
  13.           *  从静态变量applicationContext中得到Bean,  自动转型为所赋值对象的类型. 
  14.           */   
  15.         @SuppressWarnings("unchecked")   
  16.         public  static  < T>   T  getBean(String  name)  {   
  17.                 assertContextInjected();    
  18.                 return  (T)  applicationContext.getBean(name);    
  19.         }   
  20.    
  21.         /** 
  22.           *  从静态变量applicationContext中得到Bean,  自动转型为所赋值对象的类型. 
  23.           */   
  24.         public  static  < T>   T  getBean(Class< T>   requiredType)  {   
  25.                 assertContextInjected();    
  26.                 return  applicationContext.getBean(requiredType);    
  27.         }   
  28.    
  29.         /** 
  30.           *  清除SpringContextHolder中的ApplicationContext为Null. 
  31.           */   
  32.         public  static  void  clearHolder()  {   
  33.                 applicationContext  =  null;    
  34.         }   
  35.    
  36.         /** 
  37.           *  实现ApplicationContextAware接口,  注入Context到静态变量中. 
  38.           */   
  39.         @Override   
  40.         public  void  setApplicationContext(ApplicationContext  applicationContext)  {   
  41.                 SpringContextHolder.applicationContext  =  applicationContext;    
  42.         }   
  43.    
  44.         /** 
  45.           *  检查ApplicationContext不为空. 
  46.           */   
  47.         private  static  void  assertContextInjected()  {   
  48.                 Validate.validState(applicationContext  !=  null,   
  49.                                 "applicaitonContext属性未注入,  请在applicationContext.xml中定义SpringContextHolder.");    
  50.         }   
  51.    
  52. }   
 
Spring容器会检测容器中的所有Bean,如果发现某个Bean实现了ApplicationContextAware接口,Spring容器会在创建该Bean之后,自动调用该Bean的setApplicationContextAware()方法,调用该方法时,会将容器本身作为参数传给该方法——该方法中的实现部分将Spring传入的参数(容器本身)赋给该类对象的applicationContext实例变量,因此接下来可以通过该applicationContext实例变量来访问容器本身。
 
例如:
【ApplicationContextAware接口的作用】在CacheUtil中通过spring容器创建CacheManager实例
[java]  view plain  copy  
  1. public  class  CacheUtils  {   
  2.         private  static  CacheManager  cacheManager  =  ((CacheManager)  SpringContextHolder.getBean("cacheManager"));    
  3. }   

    推荐阅读