国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專(zhuān)欄INFORMATION COLUMN

spring-framework的Resource知識(shí)點(diǎn)

Jonathan Shieber / 1199人閱讀

摘要:接口類(lèi)三個(gè)具有代表性的實(shí)現(xiàn)類(lèi)通過(guò)的和,我們找到利用去解析路徑配置文件的路徑。上面可能講的有點(diǎn)繞,但卻是入口之一。根據(jù)路徑的特性,分別封裝為或?qū)ο蟆A硗庥冒锏淖隽藢?shí)驗(yàn),發(fā)現(xiàn)可以讀到包里的信息。則是包的根地方,如,用于公共配置文件。

接口類(lèi):org.springframework.core.io.Resource
三個(gè)具有代表性的實(shí)現(xiàn)類(lèi):

org.springframework.web.context.support.ServletContextResource

org.springframework.core.io.ClassPathResource

org.springframework.core.io.UrlResource

通過(guò)XmlWebApplicationContext的loadBeanDefinitions(DefaultListableBeanFactory beanFactory)和loadBeanDefinitions(XmlBeanDefinitionReader reader),我們找到ApplicationContext利用ServletContextResourcePatternResolver去解析路徑(配置文件的路徑)。
上面可能講的有點(diǎn)繞,但卻是入口之一。 我們可以跳出這個(gè)細(xì)節(jié)來(lái)看,其實(shí)Resource是通過(guò)ResourceLoader去加載(名字也能看出啦),而ApplicationContex是ResourceLoader的一個(gè)實(shí)現(xiàn)。所以Application有g(shù)etResource()的方法,但具體實(shí)例化Resource,ApplicationContex不親自干,而是用組合的形式交給ResourcePatternResolver去處理,這是因?yàn)椴煌h(huán)境尋找配置文件的形式不一樣,而其中PathMatchingResourcePatternResolver和ServletContextResourcePatternResolver是ResourcePatternResolver的實(shí)現(xiàn),用于不同環(huán)境中加載Resource。

ServletContextResourcePatternResolver會(huì)將路徑封裝成Resource對(duì)象。根據(jù)路徑的特性,分別封裝為ServletContextResource、ClassPathResource或UrlResource對(duì)象。

這里個(gè)路徑清理的工具類(lèi)StringUtils.cleanPath,參考《StringUtils知識(shí)點(diǎn)》

我們先看一些默認(rèn)路徑的知識(shí):

package org.springframework.jc;

import org.apache.commons.logging.Log;

import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import java.util.Map;
import java.util.Properties;

public class ClassGetResourceTest {

    public static void main(String[] args) throws IOException {
        System.out.println("============================================env===================================");
        Map map = System.getenv();
        for (Iterator itr = map.keySet().iterator(); itr.hasNext(); ) {
            String key = itr.next();
            System.out.println(key + "=" + map.get(key));
        }
        System.out.println("============================================properties===================================");
        Properties properties = System.getProperties();
        for(String key:properties.stringPropertyNames()){
            System.out.println(key + "=" + properties.get(key));  // user.dir=/home/cherry/git/spring-framework
        }
        System.out.println(ClassGetResourceTest.class.getResource(""));  //file:/home/cherry/git/spring-framework/spring-core/out/test/classes/org/springframework/jc/
        System.out.println(ClassGetResourceTest.class.getResource("/")); //file:/home/cherry/git/spring-framework/spring-core/out/test/classes/

        //喲喲,不同包下的類(lèi),Log.class.getResource("")是不一樣的!!! 可以獲取jar包里的配置文件哦,如commons-logging-1.2.jar包
        System.out.println(Log.class.getResource(""));  //jar:file:/home/cherry/.gradle/caches/modules-2/files-2.1/commons-logging/commons-logging/1.2/4bfc12adfe4842bf07b657f0369c4cb522955686/commons-logging-1.2.jar!/org/apache/commons/logging/
        System.out.println(Log.class.getResource("/")); //file:/home/cherry/git/spring-framework/spring-core/out/test/classes/


        File file = new File("test.txt");
        file.createNewFile();
        System.out.println(file.getAbsolutePath());  //使用user.dir作為根目錄

        System.out.println(ClassGetResourceTest.class.getName() + ".ROOT");

        System.out.println(ClassGetResourceTest.class.getClassLoader());                        //sun.misc.Launcher$AppClassLoader@18b4aac2
        System.out.println(ClassGetResourceTest.class.getClassLoader().getResource(""));  //file:/home/cherry/git/spring-framework/spring-core/out/test/classes/
                                                                                                //作用和ClassGetResourceTest.class.getResource("/")一樣

        System.out.println(ClassGetResourceTest.class.getClassLoader().getResource("/")); //null
                                                                                                //ClassLoader.getResource不可以使用"/"

        //不同包下的類(lèi),結(jié)果也與ClassGetResourceTest.class.getClassLoader()一樣,于是不可以獲取jar包里的配置文件哦,如commons-logging-1.2.jar包
        System.out.println(Log.class.getClassLoader());                        //sun.misc.Launcher$AppClassLoader@18b4aac2
        System.out.println(Log.class.getClassLoader().getResource(""));  //file:/home/cherry/git/spring-framework/spring-core/out/test/classes/
                                                                                                //作用和ClassGetResourceTest.class.getResource("/")一樣

        System.out.println(Log.class.getClassLoader().getResource("/")); //null
                                                                                                //ClassLoader.getResource不可以使用"/"


    }
}

從上可以得出一些結(jié)論:

user.dir是jvm的系統(tǒng)屬性,默認(rèn)是取你執(zhí)行命令時(shí)的目錄,也就是說(shuō)如果在/mydata使用命令 /mydata/jc-test/server.sh start,此時(shí)user.dir為/mydata,如果在/mydata/other目錄執(zhí)行/mydata/jc-test/server.sh start,則此時(shí)user.dir為/mydata/other

class.getResource方法,根據(jù)是否以根目錄“/”開(kāi)始來(lái)決定文件目錄:

class.getResource("")相對(duì)于當(dāng)前類(lèi)的目錄,是個(gè)相對(duì)路徑。例如一些不是公共的配置文件,僅僅這個(gè)類(lèi)或這個(gè)包下使用的配置文件。   另外用jar包里的class做了實(shí)驗(yàn),發(fā)現(xiàn)可以讀到j(luò)ar包里的信息。   
class.getResource("/")則是包的根地方,如..../classes/,用于公共配置文件。

ClassLoader.getResource方法,不可以根目錄“/”開(kāi)始來(lái)決定文件目錄,否則為null:

ClassLoader.getResource("")則是包的根地方,如..../classes/  
ClassLoader.getResource("")為null

好了,我們現(xiàn)在回歸主題,org.springframework.core.io.ClassPathResource能夠根據(jù)類(lèi)或加載器(classload)來(lái)加載類(lèi)路徑的文件,原文:

Resource implementation for class path resources. Uses either a given ClassLoader or a given Class for loading resources.

核心邏輯:

/**
     * This implementation opens an InputStream for the given class path resource.
     * @see java.lang.ClassLoader#getResourceAsStream(String)
     * @see java.lang.Class#getResourceAsStream(String)
     */
    @Override
    public InputStream getInputStream() throws IOException {
        InputStream is;
        if (this.clazz != null) {
            is = this.clazz.getResourceAsStream(this.path);
        }
        else if (this.classLoader != null) {
            is = this.classLoader.getResourceAsStream(this.path);
        }
        else {
            is = ClassLoader.getSystemResourceAsStream(this.path);
        }
        if (is == null) {
            throw new FileNotFoundException(getDescription() + " cannot be opened because it does not exist");
        }
        return is;
    }

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/67937.html

相關(guān)文章

  • Spring筆記03_AOP

    摘要:介紹什么是在軟件業(yè),為的縮寫(xiě),意為面向切面編程,通過(guò)預(yù)編譯方式和運(yùn)行期動(dòng)態(tài)代理實(shí)現(xiàn)程序功能的統(tǒng)一維護(hù)的一種技術(shù)。切面是切入點(diǎn)和通知引介的結(jié)合。切面類(lèi)權(quán)限校驗(yàn)。。。 1. AOP 1.1 AOP介紹 1.1.1 什么是AOP 在軟件業(yè),AOP為Aspect Oriented Programming的縮寫(xiě),意為:面向切面編程,通過(guò)預(yù)編譯方式和運(yùn)行期動(dòng)態(tài)代理實(shí)現(xiàn)程序功能的統(tǒng)一維護(hù)的一種技術(shù)...

    blair 評(píng)論0 收藏0
  • spring-framework源碼研讀

    摘要:額外知識(shí)點(diǎn)參考知識(shí)點(diǎn)加載策略資源后,容器啟動(dòng)時(shí)會(huì)調(diào)用的方法。從獲取對(duì)象對(duì)象,如果存在則拋異常。這個(gè)是重點(diǎn)核心的知識(shí)點(diǎn),參考知識(shí)點(diǎn)。看到這里應(yīng)該知道每一層的作用吧,一層一層往上遞進(jìn)第四步正在研讀 1.根據(jù)我們常用的web.xml里,我們找到的org.springframework.web.context.ContextLoaderListener。web.xml如下 moo...

    rottengeek 評(píng)論0 收藏0
  • Spring筆記04_AOP注解開(kāi)發(fā)_模板_事務(wù)

    摘要:后置增強(qiáng)周杰倫環(huán)繞通知在切面類(lèi)中添加以下方法環(huán)繞通知環(huán)繞前增強(qiáng)環(huán)繞前增強(qiáng)測(cè)試前置增強(qiáng)保存訂單。。。不使用事務(wù)管理。 1. Spring基于AspectJ的注解的AOP開(kāi)發(fā) 1. 1 SpringAOP的注解入門(mén) 創(chuàng)建項(xiàng)目,導(dǎo)入jar包 需要導(dǎo)入Spring基礎(chǔ)包4+2 需要導(dǎo)入AOP聯(lián)盟包、AspectJ包、Spring整合Aspect包Spring-aop包 Spring整合單...

    youkede 評(píng)論0 收藏0
  • 基于注解方式配置springMVC 并整合mybatis(一)

    摘要:在實(shí)戰(zhàn)一書(shū)中前面兩部分分別介紹了和的高級(jí)特性,并且基于類(lèi)配置有一套層的,但是沒(méi)有將層整合層,于是我試著整合了下,也方便以后寫(xiě)測(cè)試。 在《springBoot實(shí)戰(zhàn)》 一書(shū)中前面兩部分分別介紹了spring 和 springMVC的高級(jí)特性,并且基于java類(lèi)配置有一套web層的demo,但是沒(méi)有將web層整合dao層,于是我試著整合了下,也方便以后寫(xiě)測(cè)試demo。下面是我的整理 pom....

    岳光 評(píng)論0 收藏0
  • Spring入門(mén)看這一篇就夠了

    摘要:甲乙交易活動(dòng)不需要雙方見(jiàn)面,避免了雙方的互不信任造成交易失敗的問(wèn)題。這就是的核心思想。統(tǒng)一配置,便于修改。帶參數(shù)的構(gòu)造函數(shù)創(chuàng)建對(duì)象首先,就要提供帶參數(shù)的構(gòu)造函數(shù)接下來(lái),關(guān)鍵是怎么配置文件了。 前言 前面已經(jīng)學(xué)習(xí)了Struts2和Hibernate框架了。接下來(lái)學(xué)習(xí)的是Spring框架...本博文主要是引入Spring框架... Spring介紹 Spring誕生: 創(chuàng)建Spring的...

    superw 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<