ApplicationContextAware和BeanFactoryAware獲取bean實例

  • 這兩個接口在項目中的使用,主要是爲了動態獲取實例對象,兩種場景

  • 第一種:獲取的實例對象都實現了相同的接口或者繼承了相同的父類,這樣就可以實現代碼的整潔複用;

  • 第二種:比如方法的調用,類裏邊的方法相互調用,如果想使用自定義註解的話,是不會生效的,但是如果借用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()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章