-
這兩個接口在項目中的使用,主要是爲了動態獲取實例對象,兩種場景
-
第一種:獲取的實例對象都實現了相同的接口或者繼承了相同的父類,這樣就可以實現代碼的整潔複用;
-
第二種:比如方法的調用,類裏邊的方法相互調用,如果想使用自定義註解的話,是不會生效的,但是如果借用ApplicationContextAware和BeanFactoryAware接口的方法實現,則可以讓自定義註解生效,因爲重新動態獲取了一次實例;
-
使用說明:必須保證SpringContextUtil該類被Spring容器管理,不然不會生效,會報空指針異常;使用註解掃描或者定義bean標籤注入;
<bean id="springContextUtil" class="com.yuan.SpringContextUtil"/>
-
SpringContextUtil.getBean(“aController”,AController.class)
-
SpringContextUtil類
public class SpringContextUtil implements ApplicationContextAware {
// Spring應用上下文環境
private static ApplicationContext applicationContext;
/**
* 實現ApplicationContextAware接口的回調方法,設置上下文環境
*/
public void setApplicationContext(ApplicationContext applicationContext)
throws BeansException {
SpringContextUtil.applicationContext = applicationContext;
}
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
/**
* 獲取對象 這裏重寫了bean方法,起主要作用
*
* @param beanId
* @return Object 一個以所給名字註冊的bean的實例
* @throws BeansException
*/
public static <T> T getBean(String beanId) throws BeansException {
return (T)applicationContext.getBean(beanId);
}
/**
* 獲取對象 這裏重寫了bean方法,起主要作用
*
* @param beanId
* @return Object 一個以所給名字註冊的bean的實例
* @throws BeansException
*/
public static <T> T getBean(String beanId,Class<T> beanClass) throws BeansException {
return (T)applicationContext.getBean(beanId,beanClass);
}
}
public class SpringContextUtil implements BeanFactoryAware {
private static BeanFactory beanFactory;
/**
* 實現BeanFactory接口的回調方法,設置上下文環境
*/
@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
this.beanFactory=beanFactory;
}
/**
* 獲取對象 這裏重寫了bean方法,起主要作用
*
* @param beanId
* @return Object 一個以所給名字註冊的bean的實例
* @throws BeansException
*/
public static <T> T getBean(String beanId) throws BeansException {
return (T)beanFactory.getBean(beanId);
}
/**
* 獲取對象 這裏重寫了bean方法,起主要作用
*
* @param beanId
* @return Object 一個以所給名字註冊的bean的實例
* @throws BeansException
*/
public static <T> T getBean(String beanId,Class<T> beanClass) throws BeansException {
return (T)beanFactory.getBean(beanId,beanClass);
}
}
以下方式也可以:
@Resource
private ApplicationContext applicationContext;
applicationContext.getBean()