1. 什麼是Spring Aware
Spring的依賴注入的最大的亮點就是所有的Bean對容器的存在是沒有意識的,即你可以將你的容器換成別的容器,這時Bean直接的耦合度最低。
需要用到Spring容器本身的功能資源的時候,Bean必須意識到Spring容器的存在,才能調用Spring所提供的資源,這就是Spring Aware。若使用了Spring Aware,Bean將會和Spring框架耦合。
Spring提供的Aware接口
接口 | 說明 |
---|---|
BeanNameAware | 獲得容器中Bean的名稱 |
BeanFactoryAware | 獲得當前bean factory,這樣可以調用容器的服務 |
ApplicationContextAware* | 當前的application context,這樣可以調用容器的服務 |
MessageSourceAware | 獲得message source,這樣可以獲取文本信息 |
ApplicationEventPublisherAware | 應用事件發佈器,可以發佈事件。 |
ResourceLoaderAware | 獲得資源加載器,可以獲得外部資源文件 |
因爲ApplicationContext接口繼承了MessageSource, ApplicationEventPublisher, ResourceLoader,所以Bean繼承了ApplicationContext就可以獲得Spring容器的所有服務。
2. 代碼示例
通過Spring Bean 演示Aware,在resource目錄下面新建一個文件test.txt,內容隨意。這裏通過Aware讀取文件內容。
實現BeanNameAware、ResourceLoaderAware接口,獲得Bean名稱和資源加載服務
/**
* 實現BeanNameAware、ResourceLoaderAware接口,獲得Bean名稱和資源加載服務
* @author zhaojiaxing
* @version 1.0
* @Date 2020/02/14 16:06
*/
@Service
public class AwareTest implements BeanNameAware, ResourceLoaderAware {
private String beanName;
private ResourceLoader loader;
@Override
public void setBeanName(String s) {
this.beanName = s;
}
@Override
public void setResourceLoader(ResourceLoader resourceLoader) {
this.loader = resourceLoader;
}
public void outputResult(){
System.out.println("Bean的名稱爲:"+beanName);
Resource resource = loader.getResource("classpath:test.txt");
try {
System.out.println("加載的文件內容爲:"+ IOUtils.toString(resource.getInputStream(),"UTF-8"));
} catch (IOException e) {
e.printStackTrace();
}
}
}
配置類
/**
* @author zhaojiaxing
* @version 1.0
* @Date 2020/02/14 16:16
*/
@Configuration
@ComponentScan("com.zjx.spring.aware")
public class AwareConfig {
}
運行
public class Main {
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AwareConfig.class);
AwareTest awareTest = context.getBean(AwareTest.class);
awareTest.outputResult();
context.close();
}
}
運行結果
Bean的名稱爲:awareTest
加載的文件內容爲:好好學習,天天向上
由此可見通過BeanNameAware和ResourceLoaderAware接口獲得了Spring Bean名稱和資源加載服務。