我们应该明白,Spring的依赖注入的最大亮点是你所有的Bean对Spring容器的存在是没有意识的,我们可以将Spring容器换成其他的容器,Spring容器中的Bean的耦合度因此也是极低的。
但是我们在实际的开发中,我们却经常要用到Spring容器本身的功能资源,所以Spring容器中的Bean此时就要意识到Spring容器的存在才能调用Spring所提供的资源。我们通过Spring提供的一系列接口Spring Aware来实现具体的功能。
首先介绍一下Spring所提供的Aware接口:
BeanNameAware 获得到容器中Bean的名称
BeanFactoryAware 获得当前bean Factory,从而调用容器的服务
ApplicationContextAware 当前的application context从而调用容器的服务
MessageSourceAware 得到message source从而得到文本信息
ApplicationEventPublisherAware 应用时间发布器,用于发布事件
ResourceLoaderAware 获取资源加载器,可以获得外部资源文件
Spring Aware的目的是为了让Bean获得Spring容器的服务。因为ApplicationContext接口集成了MessageSource接口、ApplicationEventPublisher接口和ResourceLoader接口,因此当Bean继承自ApplicationContextAware的时候就可以得到Spring容器的所有服务。
例如:
首先在com.fuyunwang.aware包下面创建一个test.txt,内容任意指定。
之后在当前包下创建Spring Aware:
@Service
public class AwareService implements BeanNameAware, ResourceLoaderAware {
private String beanName;
private ResourceLoader loader;
@Override
public void setResourceLoader(ResourceLoader resourceLoader) {
this.loader=resourceLoader;
}
@Override
public void setBeanName(String name) {
this.beanName=name;
}
public void outputResult() throws IOException{
System.out.println("Bean的名称是:"+beanName);
Resource resource=loader.getResource("classpath:com/fuyunwang/aware/test.txt");
System.out.println("ResourceLoader加载的文件内容是:");
String line=null;
BufferedReader reader=new BufferedReader(new InputStreamReader(resource.getInputStream()));
while((line=reader.readLine())!=null){
System.out.println(line);
}
reader.close();
}
}
在com.fuyunwang.config包下创建配置类:
@Configuration
@ComponentScan(basePackages="com.fuyunwang")
public class AwareConfig {
}
测试类中编写代码测试:
AnnotationConfigApplicationContext context=new AnnotationConfigApplicationContext(AwareConfig.class);
AwareService service=context.getBean(AwareService.class);
service.outputResult();
context.close();