1. 程式人生 > >Spring系列-深入研究資源載入

Spring系列-深入研究資源載入

java本身的資源載入方式

研究spring對於資源管理前,我們先看看java中的資源載入,就是通過classLoader類載入器進行的,看看它載入資源的方式:
這裡寫圖片描述
如何使用,來看一個例子:

package com.demo;
import java.io.IOException;
public class SimpleJava {
    public static void main(String[] args) throws IOException {
        System.out.println(Thread.currentThread().getContextClassLoader
().getResource("com/demo/SimpleJava.class")); System.out.println(SimpleJava.class.getClassLoader().getResource("com/demo/SimpleJava.class")); System.out.println(ClassLoader.getSystemResource("com/demo/SimpleJava.class")); System.out.println(SimpleJava.class.getResource("SimpleJava.class"
)); } }

列印:

file:/D:/codingspace/spare_workspace/spring4/target/classes/com/demo/SimpleJava.class
file:/D:/codingspace/spare_workspace/spring4/target/classes/com/demo/SimpleJava.class
file:/D:/codingspace/spare_workspace/spring4/target/classes/com/demo/SimpleJava.class
file:/D:/codingspace/spare_workspace/spring4/target/classes/com/demo/SimpleJava
.class

從例子中我們可以看到,可以通過不同的方式,獲取到當前類的類載入器,並進行資源的載入。如果不清楚類載入器的機制,可以看看我的另一篇部落格:類載入器簡析
每個類載入器載入資源時,都有自己固定的位置,也就是例項化類載入器時傳遞的url,相當於類載入器載入的資源的倉庫,也只會在自己的的倉庫中尋找資源,
而classPath下的資源,都是AppClassLoader類進行載入。
上面例子中,不管是執行緒上下文載入器,還是通過Class獲取的載入器都是AppClassLoader。
對於通過SimpleJava.class.getResource進行的資源載入,我們可以通過分析原始碼:

//這是class類中進行資源載入的方法
public java.net.URL getResource(String name) {
        name = resolveName(name); //通過解析資源名稱,如果是以/開頭,會在classpath下找尋,name必須為包含全限定名稱的路徑。
        //上面的例子中SimpleJava.class.getResource("SimpleJava.class")的路徑可以換成:/com/demo/SimpleJava.class,如果不是以/開頭,則會在相對於SimpleJava.class的目錄下找尋。
        ClassLoader cl = getClassLoader0();
        if (cl==null) {
            // A system class.
            return ClassLoader.getSystemResource(name);
        }
        return cl.getResource(name);
    }

spring對資源管理的支援

ResourceLoader

spring資源載入基礎介面,提供方法:

Resource getResource(String location);
ClassLoader getClassLoader();

Resource

spring代表資源的基礎介面,提供方法從資源中獲取file,url等的方法,如下:
這裡寫圖片描述

這兩個類的關係,從不同Loader獲取代表不同路徑的Resource。
1、DefaultResourceLoader
可以從url或者classpath下獲取資源,方法:Resource getResource(String location) ,引數以/或者classpath開頭,都代表從classpath下獲取資源,具體可以看原始碼。

 package com.demo;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.ClassRelativeResourceLoader;
import org.springframework.core.io.DefaultResourceLoader;
import java.io.IOException;
import java.util.concurrent.ExecutionException;
public class SimpleJava {

    public static void main(String[] args) throws IOException, ExecutionException, InterruptedException {
        DefaultResourceLoader loader = new DefaultResourceLoader();
        System.out.println(loader.getResource("classpath:com/demo/SimpleJava.class").getFile());
        System.out.println(loader.getResource("/com/demo/SimpleJava.class").getFile());
        System.out.println(new ClassPathResource("/com/demo/SimpleJava.class").getFile());
        System.out.println(new ClassPathResource("com/demo/SimpleJava.class").getFile());

        ClassRelativeResourceLoader loader1 = new ClassRelativeResourceLoader(SimpleJava.class);
        System.out.println(loader1.getResource("SimpleJava.class").getFile());
    }
}

如果是從classpath下載入資源,我們可以直接使用ClassPathResource類進行資源的包裝。
2、ClassRelativeResourceLoader
繼承DefaultResourceLoader,從名字可以看見,和class物件相關的載入資源方式,可以從建構函式中看到:public ClassRelativeResourceLoader(Class

ClassPathResource

在Spring中,我們最常用的也是ClassPathResource,我們看下它的繼承關係:
這裡寫圖片描述

其實ClassPathResource只不過通過封裝了jdk的資源管理方式,使得使用起來更容易理解,從名字我們也可以看出來,這個類時從classPath下載入資源,簡單的分析下原始碼:

//最常用的構造方法
public ClassPathResource(String path) {
        this(path, (ClassLoader) null);
    }
//從path中獲取資源的方法,可以看到,我們並沒有傳遞Class,classLoader為null,那麼就是執行的ClassLoader.getSystemResource,也就是開始我們分析的。
protected URL resolveURL() {
        if (this.clazz != null) {
            return this.clazz.getResource(this.path);
        }
        else if (this.classLoader != null) {
            return this.classLoader.getResource(this.path);
        }
        else {
            return ClassLoader.getSystemResource(this.path);
        }
    }

相關推薦

Spring系列-深入研究資源載入

java本身的資源載入方式 研究spring對於資源管理前,我們先看看java中的資源載入,就是通過classLoader類載入器進行的,看看它載入資源的方式: 如何使用,來看一個例子: package com.demo; import java.

深入 Spring 系列之靜態資源處理

extend ada tst mar 找到 方法 rman 依賴 1-43 1. 背景 前一段時間,WebIDE 開源的過程中,無意間接觸到 webjars,覺得比較有趣,於是研究並整理了一下。 webjars 是將前端的庫(比如 jQuery)打包成 Jar 文件,然

Spring Boot入門系列三(資源文件屬性配置)

response mage 註意 site spa website 圖片 process ram   Spring Boot 資源文件屬性配置     配置文件是指在resources根目錄下的application.properties或application.yml配置

深入研究Spring-IoC:原始碼分析依賴注入

1.前言 對於容器建立的過程已經闡述過一遍了,下面是依賴注入的問題。Spring提供的依賴注入的方法主要由兩種:一種是通過getBean的方法;另一種是通過註解@Autowaire。 需要指出的是依賴注入的過程是使用者第一次向ioc容器索要Bean的時候開始生產的,也可以通過設定

深入研究Spring-IoC:原始碼分析容器建立

1.前言 從之前的分析中可以知道IOC容器的建立大致分為3步:Resource定位、BeanDefinition載入解析、向容器註冊BeanDefinition。 Tiny-spring手動實現了Spring框架,通過對這個原始碼的解讀可以更好更有效的理解Spring。 2.

深入研究Spring-IoC :容器建立的幾種方式

1.前言 本文為對tiny-spring的學習解讀,程式碼參考自tiny-spring。一個手寫的Spring簡易版框架。 前面已經提到了Spring IOC容器的建立大致分為3個步驟。但是這個三個步驟是有一個演進的過程的,Spring容器建立方式前後有6種,從最基本的例項化建立

深入研究Spring-IoC:兩種設計和實現

一.Sprng IOC 解除了物件例項化造成的耦合現象;將物件的建立和對生命週期的管理交給了容器來管理,可以通過注入的方式將IOC容器中的物件供給開發者使用,極大方便了開發。 二.IOC容器系列的兩種設計和實現–BeanFactory和ApplicationCont

Android apk動態載入機制的研究(二) 資源載入和activity生命週期管理

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Android 8.1 原始碼_核心篇 -- 深入研究 PackageManagerService 系列(1)

開篇 前言 如果你真正的深入分析過 PackageManagerService,你會發現 PackageManagerService 的原始碼真的很大,而且邏輯、結構都甚為複雜。對 PackageManagerService 系列的原始碼分析是基於 Android

Spring-統一資源載入策略

前言 在前面我們初步簡單的分析了一下BeanFactory的體系結構,第一步我們需要從配置檔案中讀取配置資訊,JDK所提供的訪問資源的類(如java.net.URL、File等),並不能很好的滿足各種底層資源的訪問需求,比如缺少從類路徑或者Web容器的上下文獲

Spring中的資源載入

  大家也都知道JDK的類載入器:BootStrap ClassLoader、ExtenSion ClassLoader、Application ClassLoader;也使用了雙親委派模型,主要是為了防止程式碼注入;   但是我一直在想那Spring 這麼牛逼的框架到底有沒有自定義的類載入器呢?   S

Spring Web MVC 深入研究

Spring Web MVC如何真正起作用 介紹 這是對Spring Web MVC的強大功能和內部工作的深入研究,它是Spring Framework的一部分。 專案設定 在本文中,我們將使用最新和最好的Spring Framework 5.我們將重點放

深入理解Spring系列之八:常用的擴充套件介面

Spring不僅提供了一個進行快速開發的基礎框架,而且還提供了很多可擴充套件的介面,用於滿足一些額外的開發需求,本篇將對常用的可擴充套件介面進行歸納總結。 1.InitializingBean介面 InitializingBean介面中只有一個afterPr

深入理解Spring系列之十二:@Transactional是如何工作的

結合Spring框架,在進行資料庫操作的時候,經常使用@Transactional註解,工作經歷中看到很多開發者使用方式都是錯誤的,沒有深入理解過其原理,這是很危險的!!本篇將深入Spring原始碼,分析@Transactional註解的工作原理。相信,看完你會

從零開始開發IoC依賴注入框架 -- containerx (深入研究Spring原始碼)(含github原始碼)

摘要: 自己寫了一個開源的IoC控制反轉(依賴注入)框架,名為containerx。初學Spring原始碼的同學,可以先研究下這個小專案。更容易理解Spring的原始碼 自己寫了一個開源的IoC控制反轉(依賴注入)框架,名為containerx。初學Spring原始碼的同學,可以先研究下這個

Android Apk資源載入機制原始碼分析以及資源動態載入實現系列文章

Android系統中執行Apk時是如何對包內的資源進行載入以及我們開發中設定相關資源後又是如何被加載出來,這個系列我們可以學習系統載入資源的機制原理,然後我們再巧妙的利用學習系統載入技巧來打造我們自己的動態資源載入機制實現。 這個系列主要分為如下3部分內容來講

Spring Framework 深入】—— IoC容器初始化 -> Bean定義資源的Resource定位

基本概念 ApplicationContext 繼承體系 本文主要關注ApplicationContext的繼承體系,至於BeanFactory的分支,以後再研究。 BeanFactory or ApplicationContext? Bea

Spring 3 MVC深入研究

一、前言: 大家好,Spring3 MVC是非常優秀的MVC框架,由其是在3.0版本釋出後,現在有越來越多的團隊選擇了Spring3 MVC了。Spring3 MVC結構簡單,應了那句話簡單就是美,而且他強大不失靈活,效能也很優秀。 Struts2也是比較優秀的MV

Spring資源載入基礎ClassLoader

1 ClassLoader工作機制1.1 ClassLoader作用尋找類位元組碼檔案並構造出類在JVM內部表示的元件.負責執行時查詢和裝入Class位元組碼檔案1.2 裝載步驟1.2.1 裝載查詢裝載

ado.net EF學習系列----深入理解查詢延遲載入技術

ado.net EF是微軟的一個ORM框架,使用過EF的同學都知道EF有一個延遲載入的技術。 如果你是一個老鳥,你可能瞭解一些,如果下面的學習過程中哪些方面講解的不對,歡迎批評指教。如果一個菜鳥,那