1. 程式人生 > 其它 >Spring中如何在非Spring管理的Bean中獲取到Spring管理的Bean並操作

Spring中如何在非Spring管理的Bean中獲取到Spring管理的Bean並操作

最近在開發過程中遇到了一個問題,就是和安卓端需要藉助socket進行通訊,但是此時的socket並不是spring websocket,且此時socket需要線上程中執行,無法被Spring管理,於是找到了另外一種用法

@Component
public class SpringApplicationContextUtil implements ApplicationContextAware{
	private static ApplicationContext applicationContext;
	public ApplicationContext getApplicationContext() {
		return SpringApplicationContextUtil.applicationContext;
	}
	@Override
	public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
		SpringApplicationContextUtil.applicationContext = applicationContext;
	}
	/**
	 * 通過工廠類獲取對應的服務
	 * @param actionName 服務類名
	 * @return 服務類
	 */
	public static Object getBean(String name){
		Object object=null;
		try{
			object = SpringApplicationContextUtil.applicationContext.getBean(name);
		}catch(Exception e){
			e.printStackTrace();
		}
		return object;
	}
	/**
	 * 通過工廠類獲取對應的服務
	 * @param clazz 對應的class
	 * @return 服務類
	 */
	public static <T> T getBean(Class<T> clazz){
		T object=null;
		try{
			object = SpringApplicationContextUtil.applicationContext.getBean(clazz);
		}catch(Exception e){
		}
		return object;
	}
	/**
	 * 獲取指定class型別的服務類
	 * @param name 名稱
	 * @param requiredType class物件
	 * @return 服務類
	 */
	public static <T> T getBean(String name,Class<T> requiredType){
		T object=null;
		try{
			object=SpringApplicationContextUtil.applicationContext.getBean(name,requiredType);
		}catch(NoSuchBeanDefinitionException e){
		}catch(Exception e){
		}
		return object;
	}
	/**
	 * 是否存在執行名稱的服務類
	 * @param name 名稱
	 * @return true 存在  flase 不存在
	 */
	public static boolean containsBean(String name){
		return SpringApplicationContextUtil.applicationContext.containsBean(name);
	}
	
	/**
	 * 獲取註冊class型別
	 * @param name
	 * @return
	 */
	public static String[] getAliases(String name){
		String[] s=null;
		try{
			s=SpringApplicationContextUtil.applicationContext.getAliases(name);
		}catch(NoSuchBeanDefinitionException e){
			
		}catch(Exception e){
		}
		return s;
	}
}

原理即是通過ApplicationContextAware介面,並將實現類交給Spring管理,在類中定義一個applicationContext屬性接收介面方法中的容器。即可以在該實現類中通過定義靜態方法獲取到我們需要的容器內我們自定義的Service或者dao等
使用方式如下

        WdDeviceService wdDeviceService = SpringApplicationContextUtil.getBean(WdDeviceService.class);