深入理解spring之Aware接口的相關實現

前面幾篇文章簡單的介紹了spring中bean註解以及怎麼在spring實現bean自動注入對應的bean,未查看的同學可以點擊查看:


瞭解spring容器的IOC(依賴注入)的同學應該知道,我們的所有的bean對於spring容器是無意識的,啥叫無意識呢,就是你完全可以把spring容器替換成其他的容器而不需要改變你的代碼,並且bean之間也是沒有耦合的,既然這樣,那問題就來,假如現在我們需要對spring有意識,換句話說就是現在我們的業務可能需要用到spring底層的一些功能那麼我們該怎麼實現?這個其實優秀的spring框架早就幫我們想到了,那就是spring提供了一系列的xxxAware接口供我們自己來實現使用


首先我來看一張圖如下:


從這個圖中我們可以看到spring給我們提供了多達12種Aware接口,這邊我們主要演示一下BeanNameAware,ResourceLoaderAware,ApplicationContextAware,BeanFactoryAware的使用,其他的xxxAware感興趣的同學可以自己下去試試

首先我們新建一個MyAware如下:


/**
* 定義一個繼承了BeanNameAware,
*             ResourceLoaderAware,
*             ApplicationContextAware,
*             BeanFactoryAware
*            的bean
* @author zhangqh
* @date 2018年5月19日
*/

public class MyAware implements BeanNameAware,ResourceLoaderAware,ApplicationContextAware,BeanFactoryAware{
   private String beanName;
   private ResourceLoader loader;
   private ApplicationContext applicationContext;
   private BeanFactory beanFactory;
   // BeanFactoryAware中的方法
   public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
       this.beanFactory = beanFactory;
   }
   // ApplicationContextAware中的方法
   public void setApplicationContext(ApplicationContext applicationContext)
           throws BeansException
{
       this.applicationContext = applicationContext;
   }
   // ResourceLoaderAware中的方法
   public void setResourceLoader(ResourceLoader resourceLoader) {
       this.loader = resourceLoader;
   }
   public void printResult() throws IOException {
       System.out.println("BeanNameAware Bean的名稱是:" + beanName);
       Resource resource = loader.getResource("classpath:test.txt");
       System.out.println("----------------------------------------" );
       System.out.print("ResourceLoaderAware ResourceLoader加載的內容是:");
       String line = null;
       BufferedReader reader = new BufferedReader(new InputStreamReader(
               resource.getInputStream()));
       while ((line = reader.readLine()) != null) {
           System.out.println(line);
       }
       reader.close();
       Environment environment = applicationContext.getEnvironment();
       System.out.println("----------------------------------------" );
       System.out.println("ApplicationContextAware 系統是:" + environment.getProperty("os.name"));
       boolean flow = beanFactory.isSingleton(beanName);
       System.out.println("----------------------------------------" );
       System.out.println("BeanFactoryAware bean【" + beanName+" 】是單例嘛:"+flow);
   }
   // BeanNameAware中的方法
   public void setBeanName(String name) {
       this.beanName = name;
   }
}


src\main\resources目錄下邊我們有一個test.txt文件內容是:


i'm test data


測試方法如下:


AnnotationConfigApplicationContext applicationContext2 = new AnnotationConfigApplicationContext(MainScanConfig.class);
MyAware myAware = (MyAware) applicationContext2.getBean("myAware");
myAware.printResult();


運行結果如下:


BeanNameAware Bean的名稱是:myAware
----------------------------------------
ResourceLoaderAware ResourceLoader加載的內容是:i'm test data
----------------------------------------
ApplicationContextAware 系統是:Windows 7
----------------------------------------
BeanFactoryAware beanmyAware 】是單例嘛:true


從以上測試結果可以發現我們需要注入spring相關的服務已經成功的加入到了我們自定義的MyAware中了


好了,看了這麼的我們稍微簡單的總結下xxxAware接口

  • 都是Aware接口的子接口,即都繼承了Aware接口 

  • 父接口Aware中沒有定義任何方法

  • 接口內均定義了一個set方法,set參數就是我們需要獲取的對象


以上是今天文章的所有內容,歡迎大家吐槽


推薦閱讀

全網最全技術視頻和電子書免費發放

更多優質文章請關注以下公衆號查閱:




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