Spring 之 Spring Aware
阿新 • • 發佈:2018-11-13
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