Spring系列(四)Spring Aware

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名稱和資源加載服務。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章