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名称和资源加载服务。