1.概念
Spring依赖注入的最大亮点是所有的Bean对Spring容器的存在是没有意识的。即换成别的容器也行。
但是如果需要使用Spring容器本身的功能资源,就需要让Bean能意识到Spring容器的存在。Spring Aware的目的是让Bean获得Spring容器的服务
2.使用
因为ApplicationContext接口继承了MessageSource接口、ApplicationEventPublisher接口和ResourceLoader接口,所以Bean继承ApplicationContextAware可以获得Spring容器的所有服务。
Spring提供的接口:
(1)BeanNameAware:获取容器中Bean的名称
(2)BeanFactoryAware:获取当前bean factory,这样可以调用容器的服务
(3)ApplicationContextAware:当前的applicationContext,这样可以调用容器的服务
(4)MessageSourceAware:获取MessageSource,可以获得文本信息
(5)ApplicationEventPublisherAware:事件发布器,可以发布事件
(6)ResourceLoader:获取资源加载器
3.示例
创建一个test.txt,内容随便给
package highlight_spring4.chi3.aware;
import java.io.IOException;
import org.apache.commons.io.IOUtils;
import org.springframework.beans.factory.BeanNameAware;
import org.springframework.context.ResourceLoaderAware;
import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;
import org.springframework.stereotype.Service;
@Service
public class AwareService implements BeanNameAware,ResourceLoaderAware {
private String beanName;
private ResourceLoader loader;
public void setResourceLoader(ResourceLoader resourceLoader) {
this.loader = resourceLoader;
}
public void setBeanName(String name) {
this.beanName = name;
}
public void outputResult(){
try {
System.out.println("Bean的名称:"+beanName);
Resource resource = loader.getResource("classpath:highlight_spring4/chi3/aware/test.txt");
System.out.println("ResourceLoader加载的文件内容为:"+IOUtils.toString(resource.getInputStream()));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
package highlight_spring4.chi3.aware;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
/**
* 配置类
*/
@Configuration
@ComponentScan("highlight_spring4.chi3.aware")
public class AwareConfig {
}
package highlight_spring4.chi3.aware;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
/**
* 运行类
*/
public class Main {
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AwareConfig.class);
AwareService awareService = context.getBean(AwareService.class);
awareService.outputResult();
context.close();
}
}