工作中需要對一個原本加載屬性文件的工具類修改成對數據庫的操作當然,ado層已經寫好,但是需要從Spring中獲取bean,然而,工具類並沒有交給Spring來管理,所以需要通過方法獲取所需要的bean。於是整理了Spring獲取bean的幾種方法。
一. 在初始化時保存ApplicationContext對象
ApplicationContext ac = new FileSystemXmlApplicationContext("classpath:beans.xml"); ac.getBean("beanId");
說明:這種方式適用於采用Spring框架的獨立應用程序,需要程序通過配置文件手工初始化Spring的情況。不難理解對於通過web.xml配置啟動的Spring來說也一定是里面實現了此方法。
二. 通過Spring提供的工具類獲取ApplicationContext對象
ApplicationContext ac1 = WebApplicationContextUtils.getRequiredWebApplicationContext(ServletContext sc); ApplicationContext ac2 = WebApplicationContextUtils.getWebApplicationContext(ServletContext sc); ac1.getBean("beanId"); ac2.getBean("beanId");
說明:這種方法適合於B/S模式,需要提供ServletContext,局限性比較大,至於以上兩個方法區別是前者出錯會拋出異常,而后者會返回null。
三. 繼承自抽象類ApplicationObjectSupport
說明:抽象類ApplicationObjectSupport提供getApplicationContext()方法,可以方便的獲取ApplicationContext。
Spring初始化時,會通過該抽象類的setApplicationContext(ApplicationContext context)方法將ApplicationContext 對象注入。
四. 繼承自抽象類WebApplicationObjectSupport
說明:類似上面方法,調用getWebApplicationContext()獲取WebApplicationContext
五:實現接口ApplicationContextAware
說明:實現該接口的setApplicationContext(ApplicationContext context)方法,並保存ApplicationContext 對象。Spring初始化時,會通過該方法將ApplicationContext對象注入。
相比下來對於需要獲取已經啟動的bean。我們需要獲取bean方法,這時我們可以通過實現接口ApplicationContextAware來獲取。
實際應用:
一. SpringContextHolder類
package com.gren.supervise.commons; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; /** * 以靜態變量保存Spring ApplicationContext, 可在任何代碼任何地方任何時候中取出ApplicaitonContext. * */ public class SpringContextHolder implements ApplicationContextAware { private static ApplicationContext applicationContext; /** * 實現ApplicationContextAware接口的context注入函數, 將其存入靜態變量. */ public void setApplicationContext(ApplicationContext applicationContext) { SpringContextHolder.applicationContext = applicationContext; // NOSONAR } /** * 取得存儲在靜態變量中的ApplicationContext. */ public static ApplicationContext getApplicationContext() { checkApplicationContext(); return applicationContext; } /** * 從靜態變量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); } /** * 清除applicationContext靜態變量. */ public static void cleanApplicationContext() { applicationContext = null; } private static void checkApplicationContext() { if (applicationContext == null) { throw new IllegalStateException("applicaitonContext未注入,請在applicationContext.xml中定義SpringContextHolder"); } } }
二. PropertyUtil
package com.gren.supervise.util; import java.io.IOException; import java.util.ArrayList; import java.util.Enumeration; import java.util.List; import java.util.Properties; import com.gren.supervise.commons.SpringContextHolder; import com.gren.supervise.dao.MapCnfDao; import com.gren.supervise.pojo.MapCnf; /** * 媒資系統配置文件參數獲取工具 * */ public final class PropertyUtil { private static Properties props; private static MapCnfDao cnfDao; private PropertyUtil() { } static { cnfDao = (MapCnfDao) SpringContextHolder.getBean("cnfDao"); props = new Properties(); try { props.load(PropertyUtil.class .getResourceAsStream("/config.properties")); } catch (IOException e) { e.printStackTrace(); } } public static Properties getSysProperties() { Properties properties = new Properties(); List<MapCnf> cnfs = cnfDao.list(); for (int i = 0; i < cnfs.size(); i++) { properties.put(cnfs.get(i).getKey(), cnfs.get(i).getValue()); } return properties; } /** * 獲取指定的系統屬性 * * @param key * 指定的屬性名稱 * @return 指定的系統屬性值 */ public static String getProperty(String key) { ConditionFilter conditionFilter = new ConditionFilter("key", key, ConditionFilter.EQ); List<ConditionFilter> conditionFilters = new ArrayList<ConditionFilter>(); conditionFilters.add(conditionFilter); List<MapCnf> cnfs = cnfDao.queryByCondition(conditionFilters); if(null==cnfs){ return null; } return cnfs.get(0).getValue(); } /** * 獲取指定的系統屬性 * * @param key * 指定的屬性名稱 * @param defaultVal * 默認值 * @return 指定的系統屬性值 */ public static String getProperty(String key, String defaultVal) { return getProperty(key); } /* * 修改屬性 */ public static void put(String key, String value) { MapCnf entity = new MapCnf(); entity.setKey(key); entity.setValue(value); ConditionFilter conditionFilter = new ConditionFilter("key", key, ConditionFilter.EQ); List<ConditionFilter> conditionFilters = new ArrayList<ConditionFilter>(); conditionFilters.add(conditionFilter); List<MapCnf> cnfs = cnfDao.queryByCondition(conditionFilters); if(null!=cnfs&&cnfs.get(0).getId()>0){ entity.setId(cnfs.get(0).getId()); cnfDao.saveOrupdate(entity); } } public static void toCnfMap() { Enumeration enumeration = props.propertyNames(); while (enumeration.hasMoreElements()) { String key = (String) enumeration.nextElement(); PropertyUtil.put(key, (String) props.get(key)); } } }