Spring Aware介面

sc_ik發表於2019-01-19

容器管理的 Bean 一般不需要了解容器的狀態和直接使用容器, 但是在某些情況下, 是需要在 Bean 中直接對IOC容器進行操作的, 可以通過特定的 Aware 介面來完成. aware 介面有以下這些:

介面名 描述
ApplicationContextAware 實現了這個介面的類都可以獲取到一個 ApplicationContext 物件. 可以獲取容器中的所有 Bean
ApplicationEventPublisherAware 在 bean 中可以得到應用上下文的事件釋出器, 從而可以在Bean中釋出應用上下文的事件.
BeanClassLoaderAware 獲取 bean 的類載入器
BeanFactoryAware 獲取 bean 的工廠
BeanNameAware 獲取 bean 在容器中的名字
BootstrapContextAware 獲取 BootstrapContext
LoadTimeWeaverAware 載入Spring Bean時織入第三方模組, 如AspectJ
MessageSourceAware 主要用於獲取國際化相關介面
NotificationPublisherAware 用於獲取通知釋出者
ResourceLoaderAware 初始化時注入ResourceLoader
ServletConfigAware web開發過程中獲取ServletConfig
ServletContextAware web開發過程中獲取ServletContext資訊

ApplicationContextAware 介面

這個介面比較常用, ApplicationContextAware 介面中只有一個方法, 用來獲取容器中的所有 Bean.

void setApplicationContext(ApplicationContext applicationContext) throws BeansException;
@Component
public class Test implements ApplicationContextAware {

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        
    }
}

這裡提供一個常用的工具類

@Component
public class SpringUtil implements ApplicationContextAware {

    private static ApplicationContext applicationContext;

    @Override
    public void setApplicationContext(
        ApplicationContext applicationContext) throws BeansException {
        SpringUtil.applicationContext = applicationContext;
    }

    public static ApplicationContext getApplicationContext() {
        return applicationContext;
    }

    /**
     * 根據Bean名稱獲取例項
     * 
     * @param name
     * 
     *            Bean註冊名稱
     * @return bean例項
     */
    @SuppressWarnings("unchecked")
    public static <T> T getBean(
        String name) throws BeansException {
        return (T) applicationContext.getBean(name);
    }

}

相關文章