SpringBoot2.x系列教程(四十一)SpringBoot中通過SpringContextUtils工具類獲取Bean

  • 2020 年 2 月 23 日
  • 筆記

本文給大家介紹兩種通過SpringContextUtils工具類來獲取Bean的方法,SpringContextUtils工具類只是大家按照通常命名的規則的一個普通工具類,當然你也可以用其他名字。

方式一:實現ApplicationContextAware

具體程式碼如下:

package com.ctrip.common.util;    import org.springframework.context.ApplicationContext;  import org.springframework.context.ApplicationContextAware;    @Component  public class SpringContextUtils  implements ApplicationContextAware{  	private static ApplicationContext applicationContext;  	/**  	 * 實現ApplicationContextAware介面的context注入函數, 將其存入靜態變數.  	 */  	public void setApplicationContext(ApplicationContext applicationContext) {  		if (SpringContextUtils.applicationContext == null) {  			SpringContextUtils.applicationContext = applicationContext;  		}  	}    	/**  	 * 取得存儲在靜態變數中的ApplicationContext.  	 */  	public static ApplicationContext getApplicationContext() {  		checkApplicationContext();  		return applicationContext;  	}    	/**  	 * 清除applicationContext靜態變數.  	 */  	public static void cleanApplicationContext() {  		applicationContext = null;  	}    	private static void checkApplicationContext() {  		if (applicationContext == null) {  			throw new IllegalStateException("applicaitonContext未注入,請在applicationContext.xml中定義SpringContextHolder");  		}  	}    	/**  	 * 從靜態變數ApplicationContext中取得Bean, 自動轉型為所賦值對象的類型.  	 */  	@SuppressWarnings("unchecked")  	public static <T> T getBean(String name) {  		checkApplicationContext();  		return (T) applicationContext.getBean(name);  	}    	/**  	 * 從靜態變數ApplicationContext中取得Bean, 自動轉型為所賦值對象的類型.  	 */  	@SuppressWarnings("unchecked")  	public static <T> T getBean(Class<T> clazz) {  		checkApplicationContext();  		return (T) applicationContext.getBeansOfType(clazz);  	}  }

這種方式是通過實現ApplicationContextAware介面,來獲得ApplicationContext,然後在通過ApplicationContext的方法來獲取對應的Bean,比如根據Bean name來獲取對應的Bean。

方式二:SpringBoot啟動類設置ApplicationContext

先看SpringContextUtils的工具類實現:

import org.springframework.context.ApplicationContext;    public class SpringContextUtils {    	private static ApplicationContext applicationContext;    	public static ApplicationContext getApplicationContext() {  		return applicationContext;  	}    	public static void setApplicationContext(ApplicationContext context) {  		applicationContext = context;  	}    	public static Object getBean(String name) {  		return applicationContext.getBean(name);  	}    	public static Object getBean(Class<?> requiredType) {  		return applicationContext.getBean(requiredType);  	}  }

由於該類並沒有實現ApplicationContextAware介面,因此得在某一個地方先設置好ApplicationContext的值,在其他地方調用是進行獲取。

設置ApplicationContextAware的位置看位於Spring Boot的啟動main方法中:

public static void main(String[] args) {  		SpringApplication app = new SpringApplication(WalletApiApplication.class);  		ConfigurableApplicationContext ctx = app.run(args);  		SpringContextUtils.setApplicationContext(ctx);  	}

在Spring Boot的啟動時調用的run方法會返回一個ConfigurableApplicationContext,將其設置到SpringContextUtils的屬性中,後續也可以直接進行調用和使用。