容器管理的 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);
}
}