1. 程式人生 > >Spring 之 Spring Aware

Spring 之 Spring Aware

Spring Aware

Spring 的依賴注入的最大亮點就是你所有的 Bean  對 Spring 容器的存在都是無意識的.即你可以將你的容器替換成別的容器.

但是在實際的專案中,你不可避免要用到 Spring 容器本身的功能資源,這是你的 Bean 必需要意識到 Spring 容器的存在,才能呼叫 Spring  所提供的資源,這就是所謂的 Spring Aware.其實 Spring Aware 本來就是 Spring 設計用來框架內部使用的,若使用了 Spring Aware, 你的 bean 將會 和 Spring 框架耦合.

Spring Aware 的目的是為了讓 Bean 獲得 Spring 容器的服務.因為 ApplicationContext  介面集成了 MessageSource 介面、ApplicationEventPublisher  介面和 ResourceLoader  介面,所以 bean 繼承 ApplicationContextAware  可以獲得 spring 容器的所有服務,但原則上我們還是用到什麼介面就實現什麼介面.

示例:

package com.pangu.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;
    
    @Override
    public void setResourceLoader(ResourceLoader resourceLoader) {
        this.loader = resourceLoader;
    }

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

    public void outputResult(){
        System.out.println("Bean 的名稱為:"+ beanName);
        Resource resource = loader.getResource("classpath:com/pangu/el/test.txt");
        try {
            System.out.println("ResourceLoader 載入的檔案內容為:"+
                    IOUtils.toString(resource.getInputStream()));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
}
package com.pangu.aware;

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

@Configuration
@ComponentScan("com.pangu.aware")
public class AwareConfig {

}
package com.pangu.aware;

import org.junit.Test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class TestMain {
    
    @Test
    public void run(){
        AnnotationConfigApplicationContext context = new 
                AnnotationConfigApplicationContext(AwareConfig.class);
        
        AwareService awareService = context.getBean(AwareService.class);
        awareService.outputResult();
        
        context.close();
    }
    
}

執行結果:

八月 23, 2018 9:23:43 上午 org.springframework.context.annotation.AnnotationConfigApplicationContext prepareRefresh
資訊: Refreshing org.spring[email protected]762efe5d: startup date [Thu Aug 23 09:23:43 CST 2018]; root of context hierarchy
Bean 的名稱為:awareService
ResourceLoader 載入的檔案內容為:盤古開天地...
八月 23, 2018 9:23:43 上午 org.springframework.context.annotation.AnnotationConfigApplicationContext doClose
資訊: Closing org.spring[email protected]762efe5d: startup date [Thu Aug 23 09:23:43 CST 2018]; root of context hierarchy