Spring Aware
阿新 • • 發佈:2017-09-20
type nconf war 資源加載 eight not override lose mea
。因為ApplicationContext接口集成了MessageSource接口,ApplicationEventPublisher接口和ResourceLoader接口,所以Bean集成了ApplicationContextAware接口就可以獲得Spring容器的所有服務,但原則上我們還是用到什麽接口,就實現什麽接口。
Spring的依賴註入最大亮點就是你所擁有的Bean對Spring容器的存在是沒有意識的。即你可以將你的容器換成別的容器,如GOOGLE Guice,這時Bean之間的耦合度降低。
但是在實際的項目中,你不可避免的要用到Spring容器本身的資源,這時你的Bean必須要意識到Spring容器的存在,才能調用Spring所提供的資源,這就是所謂的Spring Aware。其實Spring Aware本來就是Spring設計用來框架內部使用的,如果使用了Spring Aware,那麽你的Bean其實將會和Spring框架耦合。
那spring為我們提供了哪些Aware接口呢》
BeanNameAware |
獲得容器中Bean的名稱 |
BeanFactoryAware | 獲得當前的bean factory,這樣就可以調用容器的服務 |
ApplicationContextAware* | 獲得當前的application context,這樣就可以調用容器的服務 |
MessageSourceAware | 獲得message source,這樣就可以會的文本信息 |
ApplicationEventPublisherAware | 應用事件發布器,可以發布事件 |
ResourceLoaderAware | 獲得資源加載器,可以獲得外部資源文件 |
Spring Aware的目的就是為了Bean獲得Spring容器的服務
示例如下:
(1)在lwh.highlight_spring4.ch3.aware下創建一個test.txt,內容隨意,給下面的外部資源加載使用
(2)Spring Aware演示Bean
package com.lwh.highlight_spring4.ch3.aware;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; /** * Created by luwenhu on 2017/9/20. */ //實現了BeanNameAware,ResourceLoaderAware接口,獲得了Bean名稱和加載資源的服務 @Service public class AwareService implements BeanNameAware,ResourceLoaderAware{ private String beanName; private ResourceLoader loader; @Override public void setBeanName(String name) { this.beanName = name; } @Override public void setResourceLoader(ResourceLoader resourceLoader) { this.loader = resourceLoader; } public void outputResult(){ System.out.println("Bean的名稱是:"+beanName); Resource resource = loader.getResource("classpath:com/lwh/highlight_spring4/ch3/aware/test.txt"); try{ String string = IOUtils.toString(resource.getInputStream()); System.out.println("ResourceLoader加載的內容為:"+string); }catch (Exception e){ e.printStackTrace(); } } }
(3)配置類
package com.lwh.highlight_spring4.ch3.aware; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; /** * Created by luwenhu on 2017/9/20. */ @Configuration @ComponentScan("com.lwh.highlight_spring4.ch3.awar") public class AwareConfig { }
(4)運行類
package com.lwh.highlight_spring4.ch3.aware; import com.lwh.highlight_spring4.ch1.aop.AopConfig; import org.springframework.context.annotation.AnnotationConfigApplicationContext; /** * Created by luwenhu on 2017/9/20. */ public class Main { public static void main(String[] args){ AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AwareService.class); AwareService awareService = context.getBean(AwareService.class); awareService.outputResult(); context.close(); } }
(5)運行結果
Spring Aware