spring之Aware接口

spring之Aware接口

一.    介绍Aware相关接口的功能

        Aware,顾名思义,意识到的.这个接口也就是为了让Bean意识到自己的存在.首先,我承认我第一次去看这个有关资料并没有看懂这个接口是什么意思,后来测试后才明白.依赖注入是spring的一个重要的特性,但是在spring将bean注入到IoC容器时,bean对于自己与spring的关系一无所知,即如王云飞所说:bean对于spring容器的存在是没有意识的,即可以把容器换成别的容器也可以,这时候Bean之间的耦合度很低.
        如果Bean实现了Aware相关的接口,那么Bean就可以感知到spring容器,此时它就可以用到spring容器的功能资源.但是此时,Bean就与IoC容器耦合了.
        可以先去看集成了Aware的接口
spring之Aware接口
此处挑选部分进行介绍.
        BeanFactoryAware:                        获取当前BeanFactory,可以调用容器服务.
        BeanNameAware:                           获取容器中Bean的名称.
        ApplicationContextAware:               获取容器的上下文.可以调用容器服务.
        ApplicationEventPublisherAware:   应用事件发布器.主要用于发布服务.
        BeanClassLoadAware:                    获取相关类加载器.
        ResourceLoadAware:                      获取资源加载器.可以获取外部资源文件.
        MessageSourceAware:                    获取message source,可以获取文本信息.
        ServletContextAware:                      获取servlet上下问.此功能要在web服务中使用.
ApplicationContextAware接口集成了MessageSourceAware接口,ResourceLoadAware接口及 ApplicationEventPublisherAware接口,所以Bean只要实现ApplicationContextAware接口就可以获取spring容器的所有服务.但是原则上用到什么接口就是用什么接口.

二.    以BeanNameAware和ResourceLoadAware两个接口做演示

被测试文件:
spring之Aware接口
被测试类:
package com.yczuoxin.demo.config;

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.Component;

import java.io.IOException;

@Component
public class DemoBean implements BeanNameAware,ResourceLoaderAware {

    private String beanName;
    private ResourceLoader resourceLoader;

    @Override
    public void setBeanName(String name) {
        this.beanName = name;
    }

    @Override
    public void setResourceLoader(ResourceLoader resourceLoader) {
        this.resourceLoader = resourceLoader;
    }

    public void print(){
        System.out.println("DemoBean 类在spring容器中的Name: " + beanName);
        Resource resource = resourceLoader.getResource("classpath:test.txt");
        try {
            System.out.println("ResourceLoader 加载的文件信息为: " + IOUtils.toString(resource.getInputStream()));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

配置类:

package com.yczuoxin.demo.config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@ComponentScan("com.yczuoxin.demo.config")
public class AwareConfig {
}

测试类:

package com.yczuoxin.demo.config;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class AwareTest {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AwareConfig.class);
        DemoBean demoBean = context.getBean(DemoBean.class);
        demoBean.print();
        context.close();
    }
}
DemoBean 类在spring容器中的Name: demoBean
ResourceLoader 加载的文件信息为: 1234567

测试结果成功.

;