亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

Spring源碼分析——資源訪問利器Resource之接口和抽象類分析

2019-11-14 21:18:23
字體:
來源:轉載
供稿:網友
SPRing源碼分析——資源訪問利器Resource之接口和抽象類分析

  從今天開始,一步步走上源碼分析的路。剛開始肯定要從簡單著手。我們先從java發展史上最強大的框架——Spring、、、旗下的資源抽象接口Resource開始吧。

  我看了好多分析Spring源碼的,每每一開始就是Spring IOC、AOP、BeanFactory這樣的Spring典型模塊,實在看厭了,這些暫且留到以后。我的想法是,分析就分析別人沒分析過的,或者以不同的角度來分析別人分析過的。

  可能很多用了Spring多年的程序員對Resource都了解有限,畢竟訪問資源一般是搭建web工程框架的時候的事情。不過了解它也是非常有好處的。

  這個接口的作用是可以讓我們更方便操縱底層資源。因為JDK操縱底層資源基本就是 java.net.URL 、java.io.File 、java.util.Properties這些。取資源基本是根據絕對路徑或當前類的相對路徑來取。從類路徑或Web容器上下文中獲取資源的時候也不方便。Resource接口提供了更強大的訪問底層資源的能力。

  廢話不多說,看源碼之前先來看一下Resource的類結構。

一、類結構

一、Resource接口

  如圖,Resouce接口并不是一個根接口,它繼承了一個簡單的父接口%20InputStreamSource,這個接口只有一個方法,用以返回一個輸入流:

InputStream%20getInputStream()%20throws%20IOException;

  來,直接上Resource接口的源碼,中文是我根據英文注釋自己翻譯的,如下:

public%20interface%20Resource%20extends%20InputStreamSource%20{%20%20%20%20boolean%20exists();%20%20%20%20%20%20//%20%20資源是否存在%20%20%20%20boolean%20isReadable();%20%20//%20%20資源是否可讀%20%20%20%20boolean%20isOpen();%20%20%20%20%20%20//%20%20資源所代表的句柄是否被一個stream打開了%20%20%20%20URL%20getURL()%20throws%20IOException;%20%20%20//%20%20返回資源的URL的句柄%20%20%20%20URI%20getURI()%20throws%20IOException;%20%20%20//%20%20返回資源的URI的句柄%20%20%20%20File%20getFile()%20throws%20IOException;%20//%20%20返回資源的File的句柄%20%20%20%20long%20contentLength()%20throws%20IOException;%20%20%20//%20%20資源內容的長度%20%20%20%20long%20lastModified()%20throws%20IOException;%20%20%20%20//%20%20資源最后的修改時間%20%20%20%20Resource%20createRelative(String%20relativePath)%20throws%20IOException;%20%20%20//根據資源的相對路徑創建新資源%20%20%20%20String%20getFilename();%20%20//%20%20資源的文件名%20%20%20%20String%20getDescr
/* * Copyright 2002-2011 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * *      http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */package org.springframework.core.io;import java.io.File;import java.io.IOException;import java.io.InputStream;import java.net.HttpURLConnection;import java.net.URI;import java.net.URL;import java.net.URLConnection;import org.springframework.util.ResourceUtils;/** * Abstract base class for resources which resolve URLs into File references, * such as {@link UrlResource} or {@link ClassPathResource}. * * <p>Detects the "file" protocol as well as the JBoss "vfs" protocol in URLs, * resolving file system references accordingly. * * @author Juergen Hoeller * @since 3.0 */public abstract class AbstractFileResolvingResource extends AbstractResource {    @Override    public File getFile() throws IOException { //  通過資源的URL得到資源本身,是文件就返回文件,否則返回描述        URL url = getURL();        if (url.getProtocol().startsWith(ResourceUtils.URL_PROTOCOL_VFS)) {            return VfsResourceDelegate.getResource(url).getFile();        }        return ResourceUtils.getFile(url, getDescription());    }    @Override    protected File getFileForLastModifiedCheck() throws IOException {  //從<壓縮文件地址>中獲取文件        URL url = getURL();        if (ResourceUtils.isJarURL(url)) {            URL actualUrl = ResourceUtils.extractJarFileURL(url);            if (actualUrl.getProtocol().startsWith(ResourceUtils.URL_PROTOCOL_VFS)) {                return VfsResourceDelegate.getResource(actualUrl).getFile();            }            return ResourceUtils.getFile(actualUrl, "Jar URL");        }        else {            return getFile();        }    }    protected File getFile(URI uri) throws IOException {   //  通過資源uri獲取文件        if (uri.getScheme().startsWith(ResourceUtils.URL_PROTOCOL_VFS)) {            return VfsResourceDelegate.getResource(uri).getFile();        }        return ResourceUtils.getFile(uri, getDescription());    }    @Override    public boolean exists() {  //判斷資源是否存在,如果是文件Url,直接獲取文件判斷,否則,建立連接來判斷。        try {            URL url = getURL();            if (ResourceUtils.isFileURL(url)) {                // Proceed with file system resolution...                return getFile().exists();            }            else {                // Try a URL connection content-length header...                URLConnection con = url.openConnection();                ResourceUtils.useCachesIfNecessary(con);                HttpURLConnection httpCon =                        (con instanceof HttpURLConnection ? (HttpURLConnection) con : null);                if (httpCon != null) {                    httpCon.setRequestMethod("HEAD");                    int code = httpCon.getResponseCode();                    if (code == HttpURLConnection.HTTP_OK) {                        return true;                    }                    else if (code == HttpURLConnection.HTTP_NOT_FOUND) {                        return false;                    }                }                if (con.getContentLength() >= 0) {                    return true;                }                if (httpCon != null) {                    // no HTTP OK status, and no content-length header: give up                    httpCon.disconnect();                    return false;                }                else {                    // Fall back to stream existence: can we open the stream?                    InputStream is = getInputStream();                    is.close();                    return true;                }            }        }        catch (IOException ex) {            return false;        }    }    @Override    public boolean isReadable() {  //  是否可讀        try {            URL url = getURL();            if (ResourceUtils.isFileURL(url)) {                // Proceed with file system resolution...                File file = getFile();                return (file.canRead() && !file.isDirectory());            }            else {                return true;            }        }        catch (IOException ex) {            return false;        }    }    @Override    public long contentLength() throws IOException {        URL url = getURL();        if (ResourceUtils.isFileURL(url)) {            // Proceed with file system resolution...            return getFile().length();        }        else {            // Try a URL connection content-length header...            URLConnection con = url.openConnection();            ResourceUtils.useCachesIfNecessary(con);            if (con instanceof HttpURLConnection) {                ((HttpURLConnection) con).setRequestMethod("HEAD");            }            return con.getContentLength();
上一篇:Java 注釋說明

下一篇:Java 中的System.exit

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲第一页中文字幕| 欧美激情免费观看| 日本精品久久久久影院| 久久久久久久成人| 亚洲理论在线a中文字幕| 亚洲3p在线观看| 日韩电影免费观看在线观看| 少妇高潮久久久久久潘金莲| 高清日韩电视剧大全免费播放在线观看| 亚洲欧美日韩精品久久亚洲区| 国产一区二区三区四区福利| 日韩成人在线网站| 日韩av日韩在线观看| 久久久亚洲影院| 亚洲欧美国产一本综合首页| 国产精品视频内| 日韩一区二区欧美| 久久久亚洲精品视频| 亚洲天堂日韩电影| 国产丝袜一区二区三区| 亚洲国产精品久久久久| 91精品视频在线免费观看| 国产精品久久久久av免费| 97国产在线观看| 国产v综合v亚洲欧美久久| 日韩在线免费av| 中文字幕日韩在线播放| 亚洲a成v人在线观看| 在线观看不卡av| 午夜精品久久久久久99热软件| 亚洲精品福利在线观看| 国产一区二区三区久久精品| 欧美丝袜美女中出在线| 亚洲国产精品资源| 精品亚洲一区二区三区在线播放| 人体精品一二三区| 日韩电影中文字幕在线观看| 97在线视频免费| 精品国内自产拍在线观看| 91视频九色网站| 日韩亚洲欧美中文高清在线| 久久精品成人欧美大片古装| 亚洲精品电影在线观看| 欧美日韩免费一区| 久久国内精品一国内精品| 色偷偷av一区二区三区| 国内精品一区二区三区四区| 亚洲欧洲成视频免费观看| 亚洲一区二区三区视频播放| 国产精品九九九| 欧美日韩国产色视频| www国产精品com| 亚洲a区在线视频| 亚洲欧洲在线免费| 欧美另类高清videos| 色狠狠久久aa北条麻妃| 日韩欧美高清视频| 国产精品影片在线观看| 欧美一区视频在线| 国产综合视频在线观看| 日本久久久a级免费| 国产主播在线一区| 亚洲国产精品免费| 欧美在线观看日本一区| 日韩av在线免播放器| **欧美日韩vr在线| 97国产一区二区精品久久呦| 欧美小视频在线观看| 欧美肥臀大乳一区二区免费视频| 国产精品高潮粉嫩av| 精品精品国产国产自在线| 日本亚洲欧洲色α| 国产99久久久欧美黑人| 亚洲人成网7777777国产| 国产精品一区二区在线| 国产午夜精品免费一区二区三区| 欧美激情啊啊啊| 欧美尺度大的性做爰视频| 亚洲电影免费观看高清完整版在线| 欧美在线观看视频| 国产99久久精品一区二区| 成人日韩av在线| 在线观看中文字幕亚洲| 亚洲欧美精品伊人久久| 日韩欧美在线一区| 国产亚洲精品成人av久久ww| 国内免费久久久久久久久久久| 国产日韩在线播放| 亚洲国产天堂久久国产91| 91精品在线播放| 欧美日韩成人黄色| 成人福利在线视频| 国产精品激情av电影在线观看| 欧美一级电影在线| 亚洲香蕉av在线一区二区三区| 性欧美长视频免费观看不卡| 欧美孕妇性xx| 成人免费视频在线观看超级碰| 亚洲精品短视频| 成人信息集中地欧美| 久久精品久久精品亚洲人| 中文字幕国产精品久久| 日韩电影免费观看在线观看| 国产一区视频在线播放| 国产精品成熟老女人| 亚洲欧美精品一区二区| 中文字幕不卡av| 亚洲精品视频在线播放| 国产精品揄拍500视频| 这里只有精品丝袜| 国产精品免费观看在线| 日韩精品福利在线| 久久亚洲国产精品成人av秋霞| 国产一区二区三区精品久久久| 成人免费在线视频网址| 亚洲自拍偷拍福利| 亚洲欧美另类国产| 精品久久中文字幕久久av| 秋霞av国产精品一区| 91精品国产亚洲| 日韩在线观看成人| 中文字幕日韩av电影| 欧美俄罗斯乱妇| 国产欧美va欧美va香蕉在| 亚洲最大成人网色| 日本精品一区二区三区在线播放视频| 正在播放国产一区| 亚洲人成网站在线播| 日韩电视剧在线观看免费网站| 国产激情视频一区| 欧美激情第三页| 国产精品丝袜一区二区三区| 亚洲va码欧洲m码| 国产精品免费久久久久影院| 7777kkkk成人观看| 欧美国产日韩免费| 日韩免费av一区二区| 久久久精品一区二区| 九九热视频这里只有精品| 国产免费一区二区三区在线能观看| 亚洲人成电影在线播放| 91精品国产91久久久久福利| 久久成人av网站| 日韩成人中文字幕| 久久影视电视剧凤归四时歌| 国产一区二区三区中文| 人人爽久久涩噜噜噜网站| 亚洲精品福利视频| 国产欧美欧洲在线观看| 国产精品福利在线| 日韩电影在线观看免费| 97avcom| 中文字幕欧美国内| 欧美激情一区二区久久久| 亚洲乱码一区二区| 国产视频精品自拍| 成人97在线观看视频| 美女久久久久久久| 国语自产精品视频在免费| 性色av一区二区咪爱| 欧美日韩在线视频首页| 国产精品视频内| 播播国产欧美激情| 日韩精品欧美国产精品忘忧草|