1. 程式人生 > >Spring Aware

Spring Aware

type nconf war 資源加載 eight not override lose mea

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容器的服務

。因為ApplicationContext接口集成了MessageSource接口,ApplicationEventPublisher接口和ResourceLoader接口,所以Bean集成了ApplicationContextAware接口就可以獲得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