Spring高级运用之浅析Spring Aware

来源:互联网 发布:python培训班wuhan 编辑:程序博客网 时间:2024/05/17 21:44

我们应该明白,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:

@Servicepublic 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();
0 0
原创粉丝点击