經過ApplicationContextAware獲取spirng容器裏面的bean

1、實現

一、ApplicatinContextHelper

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;

 
public class ApplicationContextHelper implements ApplicationContextAware {
  
	private static ApplicationContext applicationContext;     //Spring應用上下文環境
 
  /**
  * 實現ApplicationContextAware接口的回調方法,設置上下文環境  
  * @param applicationContext
  * @throws BeansException
  */
  public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
    ApplicationContextHelper.applicationContext = applicationContext;
  }
 
  /**
  * @return ApplicationContext
  */
  public static ApplicationContext getApplicationContext() {
    return applicationContext;
  }
 
  /**
  * 獲取對象  
  * @param name
  * @return Object 一個以所給名字註冊的bean的實例
  * @throws BeansException
  */
  public static Object getBean(String name) throws BeansException {
    return applicationContext.getBean(name);
  }
 
  /**
  * 獲取類型爲requiredType的對象
  * 若是bean不能被類型轉換,相應的異常將會被拋出(BeanNotOfRequiredTypeException)
  * @param name       bean註冊名
  * @param requiredType 返回對象類型
  * @return Object 返回requiredType類型對象
  * @throws BeansException
  */
  public static <T> T getBean(String name, Class<T> requiredType) throws BeansException {
    return applicationContext.getBean(name, requiredType);
  }
 
  /**
  * 若是BeanFactory包含一個與所給名稱匹配的bean定義,則返回true
  * @param name
  * @return boolean
  */
  public static boolean containsBean(String name) {
    return applicationContext.containsBean(name);
  }
 
  /**
  * 判斷以給定名字註冊的bean定義是一個singleton仍是一個prototype。
  * 若是與給定名字相應的bean定義沒有被找到,將會拋出一個異常(NoSuchBeanDefinitionException)  
  * @param name
  * @return boolean
  * @throws NoSuchBeanDefinitionException
  */
  public static boolean isSingleton(String name) throws NoSuchBeanDefinitionException {
    return applicationContext.isSingleton(name);
  }
 
  /**
  * @param name
  * @return Class 註冊對象的類型
  * @throws NoSuchBeanDefinitionException
  */
  public static Class<?> getType(String name) throws NoSuchBeanDefinitionException {
    return applicationContext.getType(name);
  }
 
  /**
  * 若是給定的bean名字在bean定義中有別名,則返回這些別名  
  * @param name
  * @return
  * @throws NoSuchBeanDefinitionException
  */
  public static String[] getAliases(String name) throws NoSuchBeanDefinitionException {
    return applicationContext.getAliases(name);
  }
}

二、spring 配置

<bean id="applicationContext" class="com.iflashbuy.base.common.ApplicationContextHelper"/>

 

2、原理

ApplicatinContextHelper繼承了spring的ApplicationContextAware接口,並實現了setApplicatinContext方法spring容器在啓動過程當中會去查找到繼承了applicationContextAware的全部接口,並將applicationContext經過調用setApplicationContext方法傳遞給ApplicationContextHelper。相關spring實現爲  Spring源碼中ApplicationContextAwareProcessor.postProcessBeforeInitialization()方法。java

有圖有真相web

 

3、注意事項

在一個java web項目中ApplicatationContextHelper這個bean能夠配置在spring上下文中,也能夠配置在springmvc上下文中,當配置在springmvc上下文中時候,ApplicationHelper只可以獲取到springmvc上下恩相關的bean,spring上下文同理。spring

相關文章
相關標籤/搜索