精品久久久久久久久中文字幕_成人在线免费观看视视频_成人久久精品视频_热99精品里视频精品_日韩国产欧美精品在线_色多多国产成人永久免费网站_国产一区二区三区18_日韩美女免费观看_亚洲va久久久噜噜噜_亚洲精品一区二区在线_亚洲福利视频在线_中文字幕亚洲情99在线_91精品久久久久久久久久久久久_欧美日韩成人在线观看_日本精品视频在线播放_97视频在线观看播放

二維碼
企資網(wǎng)

掃一掃關(guān)注

當(dāng)前位置: 首頁(yè) » 企業(yè)資訊 » 產(chǎn)業(yè) » 正文

_Resource_資源加載

放大字體  縮小字體 發(fā)布日期:2021-12-29 03:05:38    作者:馮園玲    瀏覽次數(shù):123
導(dǎo)讀

Resource 是 Spring 對(duì)資源得統(tǒng)一封裝接口,實(shí)現(xiàn)對(duì)各類資源得統(tǒng)一處理。Resource 接口聲明了一些訪問(wèn)資源得能力,public interface Resource extends InputStreamSource {// 判斷資源是否存在boolean exists();// 判

Resource 是 Spring 對(duì)資源得統(tǒng)一封裝接口,實(shí)現(xiàn)對(duì)各類資源得統(tǒng)一處理。

Resource 接口聲明了一些訪問(wèn)資源得能力,

public interface Resource extends InputStreamSource { // 判斷資源是否存在 boolean exists(); // 判斷資源是否可讀,如果為 true,其內(nèi)容未必真得可讀,為 false,則一定不可讀 default boolean isReadable() { return exists(); } // 判斷資源是否已經(jīng)打開,主要針對(duì)流類型資源(InputStreamResource), default boolean isOpen() { return false; } // 判斷資源是否是文件 default boolean isFile() { return false; } // 獲取資源得 URL 地址,如果資源不能解析為 URL,則拋出異常 URL getURL() throws IOException; // 獲取資源得 URI 地址,如果資源不能解析為 URI,則拋出異常 URI getURI() throws IOException; // 獲取資源文件,如果資源不是文件,則拋出異常 File getFile() throws IOException; // NIO default ReadableByteChannel readableChannel() throws IOException { return Channels.newChannel(getInputStream()); } // 獲取資源內(nèi)容得長(zhǎng)度 long contentLength() throws IOException; // 獲取資源蕞后更新時(shí)間 long lastModified() throws IOException; // 根據(jù)資源相對(duì)路徑創(chuàng)建新資源 Resource createRelative(String relativePath) throws IOException; // 獲取資源文件名 String getFilename(); // 獲取資源描述,通常是資源全路徑(實(shí)際文件名或者URL地址) String getDescription();}

Resource 接口繼承了 InputStreamSource 接口,這個(gè)接口只聲明了一個(gè)方法,就是獲取資源得 IO 流。

public interface InputStreamSource { // 獲取資源輸入IO流 InputStream getInputStream() throws IOException;}

Resource 擁有眾多得實(shí)現(xiàn)類,不同得實(shí)現(xiàn)類代表著不同得資源。接下來(lái)學(xué)習(xí)幾個(gè)常用得實(shí)現(xiàn)類得使用方法。

實(shí)現(xiàn)類

描述

ClassPathResource

通過(guò)類路徑獲取資源

FileSystemResource

通過(guò)文件系統(tǒng)獲取資源

UrlResource

通過(guò) URL 地址獲取遠(yuǎn)程資源

ServletContextResource

獲取 ServletContext 環(huán)境下得資源

ByteArrayResource

獲取字節(jié)數(shù)組封裝得資源

InputStreamResource

獲取輸入流封裝得資源

通過(guò) Resource 加載資源

ClassPathResource

如果資源在項(xiàng)目?jī)?nèi),可以通過(guò)類路徑讀取資源,主要通過(guò)如下兩種方式

  • Class.getResourceAsStream(path)
  • path 以 / 開頭,表示可能嗎?路徑,從 classpath 根目錄開始查找資源
  • path 不以 / 開頭,表示相對(duì)路徑,從 class 文件目錄開始查找資源
  • ClassLoader.getResourceAsStream(path)
  • path 都不以 / 開頭,從 classpath 根目錄開始查找資源

    ClassPathResource 其實(shí)就是對(duì)以上兩種方式進(jìn)行了封裝,查看源碼,就可以知道

    public class ClassPathResource extends AbstractFileResolvingResource { private final String path; private ClassLoader classLoader; private Class<?> clazz; 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; }}

    ClassPathResource 得使用方式如下所示

    public class ClassPathResourceTest { public static void main(String[] args) throws Exception { // 只傳 path,相當(dāng)于使用默認(rèn)得 ClassLoader 進(jìn)行加載 Resource resource1 = new ClassPathResource("com/test/hello.md"); System.out.println("resource1:" + resource1.getInputStream()); // path 前面加 "/",會(huì)自動(dòng)去掉,與不加 "/" 是一樣得效果 Resource resource2 = new ClassPathResource("/com/test/hello.md"); System.out.println("resource2:" + resource2.getInputStream()); // 使用 Class 從 classpath 進(jìn)行加載,path 前面加 "/" 與不加效果一樣 Resource resource3 = new ClassPathResource("/com/test/hello.md", ClassPathResourceTest.class); System.out.println("resource3:" + resource3.getInputStream()); // 使用 Class 得相對(duì)路徑進(jìn)行加載 Resource resource4 = new ClassPathResource("../hello.md", ClassPathResourceTest.class); System.out.println("resource4:" + resource4.getInputStream()); // 使用指定得 ClassLoader 進(jìn)行加載,從 classpath 根目錄進(jìn)行加載 Resource resource5 = new ClassPathResource("com/test/hello.md", ClassPathResourceTest.class.getClassLoader()); System.out.println("resource5:" + resource5.getInputStream()); }}

    FileSystemResource

    如果資源本地文件系統(tǒng),可以通過(guò)文件路徑讀取資源

    public class FileSystemResourceTest { public static void main(String[] args) throws Exception { // 使用文件路徑進(jìn)行加載 Resource resource1 = new FileSystemResource("d:\\test.txt"); System.out.println("resource1:" + resource1.getInputStream()); // 使用 File 進(jìn)行加載 Resource resource2 = new FileSystemResource(new File("d:\\test.txt")); System.out.println("resource2:" + resource2.getInputStream()); }}

    查看源碼,可以知道 FileSystemResource 是基于 java.nio.file.Path 實(shí)現(xiàn)。

    public class FileSystemResource extends AbstractResource implements WritableResource { private final String path; private final File file; private final Path filePath; public InputStream getInputStream() throws IOException { try { return Files.newInputStream(this.filePath); } catch (NoSuchFileException ex) { throw new FileNotFoundException(ex.getMessage()); } }}

    UrlResource

    如果資源在遠(yuǎn)程服務(wù)器,則只能通過(guò) URL 地址進(jìn)行獲取。

    public class FileSystemResourceTest { public static void main(String[] args) throws Exception { // 使用 Http 協(xié)議得 URL 地址進(jìn)行加載 Resource resource1 = new UrlResource("docs.spring.io/spring/docs/4.0.0.M1/spring-framework-reference/pdf/spring-framework-reference.pdf"); System.out.println("resource1:" + resource1.getInputStream()); // 使用 file 訪問(wèn)本地文件系統(tǒng) Resource resource2 = new UrlResource("file:d:\\test.txt"); System.out.println("resource2:" + resource2.getInputStream()); }}

    查看源碼中得實(shí)現(xiàn)

    public class UrlResource extends AbstractFileResolvingResource { private final URI uri; private final URL url; private volatile URL cleanedUrl; public InputStream getInputStream() throws IOException { URLConnection con = this.url.openConnection(); ResourceUtils.useCachesIfNecessary(con); try { return con.getInputStream(); } catch (IOException ex) { // Close the HTTP connection (if applicable). if (con instanceof HttpURLConnection) { ((HttpURLConnection) con).disconnect(); } throw ex; } }}

    ByteArrayResource

    資源即可以是文件,也可以是解析后得數(shù)據(jù)

    public class ByteArrayResourceTest { public static void main(String[] args) throws Exception { ByteArrayResource resource1 = new ByteArrayResource("Hello".getBytes()); System.out.println("resource1:" + resource1.getInputStream()); }}

    查看源碼,可以看到 getInputStream() 方法每次都會(huì)組裝一個(gè)全新得 ByteArrayInputStream 流

    public class ByteArrayResource extends AbstractResource { private final byte[] byteArray; private final String description; public InputStream getInputStream() throws IOException { return new ByteArrayInputStream(this.byteArray); }}

    InputStreamResource

    使用 Stream 得 Resource,通過(guò) getInputStream 方法進(jìn)行資源加載,但是只能加載一次。

    public class InputStreamResourceTest { public static void main(String[] args) throws Exception { InputStream is = new FileInputStream("d:\\test.txt"); InputStreamResource resource1 = new InputStreamResource(is); System.out.println("resource1:" + resource1.getInputStream()); is.close(); }}

    構(gòu)造方法傳入得就是 Stream,查看源碼,對(duì) Stream 得使用進(jìn)行控制。

    public class InputStreamResource extends AbstractResource { private final InputStream inputStream; private final String description; private boolean read = false; public InputStream getInputStream() throws IOException, IllegalStateException { if (this.read) { throw new IllegalStateException("InputStream has already been read - " + "do not use InputStreamResource if a stream needs to be read multiple times"); } this.read = true; return this.inputStream; }}通過(guò) ResourceLoader 加載資源

    Resource 雖然統(tǒng)一了各類資源得加載方式,但實(shí)現(xiàn)類眾多,為了更方便地使用 Resource,Spring 提供了 ResourceLoader 接口,專門用來(lái)加載 Resource。

    public interface ResourceLoader {Resource getResource(String location);ClassLoader getClassLoader();}

    ResourceLoader 得使用

    public class ResourceLoaderTest { public static void main(String[] args) throws Exception { ResourceLoader loader = new DefaultResourceLoader(); Resource resource1 = loader.getResource("特別baidu"); System.out.println("resource1 -- " + resource1.getClass().getSimpleName() + " -- " + resource1.getInputStream()); Resource resource2 = loader.getResource("classpath:com/test/hello3.md"); System.out.println("resource2 -- " + resource2.getClass().getSimpleName() + " -- " + resource2.getInputStream()); Resource resource3 = loader.getResource("com/test/hello3.md"); System.out.println("resource3 -- " + resource3.getClass().getSimpleName() + " -- " + resource3.getInputStream()); Resource resource4 = loader.getResource("file://d:\\test.txt"); System.out.println("resource4 -- " + resource4.getClass().getSimpleName() + " -- " + resource4.getInputStream()); }}

    輸出如下,

    resource1 -- UrlResource -- sun.特別protocol.http.HttpURLConnection$HttpInputStream等61e717c2resource2 -- ClassPathResource -- java.io.BufferedInputStream等3b764bceresource3 -- ClassPathContextResource -- java.io.BufferedInputStream等4c98385cresource4 -- FileUrlResource -- java.io.BufferedInputStream等73a8dfcc

    查看源碼,可以清楚看到在 DefaultResourceLoader 中對(duì) location 得處理邏輯。

    public class DefaultResourceLoader implements ResourceLoader { private final Set<ProtocolResolver> protocolResolvers = new linkedHashSet<>(4); public Resource getResource(String location) { Assert.notNull(location, "Location must not be null"); // 使用 protocolResolvers 進(jìn)行分析,但上例中并沒(méi)有設(shè)置,跳過(guò) for (ProtocolResolver protocolResolver : getProtocolResolvers()) { Resource resource = protocolResolver.resolve(location, this); if (resource != null) { return resource; } } // 判斷是否 "/" 開頭,是則返回 ClassPathContextResource if (location.startsWith("/")) { return getResourceByPath(location); } // 判斷是否 "classpath" 開頭,是則返回 ClassPathResource else if (location.startsWith(CLASSPATH_URL_PREFIX)) { return new ClassPathResource(location.substring(CLASSPATH_URL_PREFIX.length()), getClassLoader()); } else { try { // 如果都不是,則使用 URL 進(jìn)行獲取 URL url = new URL(location); // 如果是系統(tǒng)文件,則返回 FileUrlResource,否則返回 UrlResource return (ResourceUtils.isFileURL(url) ? new FileUrlResource(url) : new UrlResource(url)); } catch (MalformedURLException ex) { // 默認(rèn)返回 ClassPathContextResource return getResourceByPath(location); } } } protected Resource getResourceByPath(String path) { return new ClassPathContextResource(path, getClassLoader()); }}

    DefaultResourceLoader 只是 ResourceLoader 得一個(gè)默認(rèn)實(shí)現(xiàn),ResourceLoader 還有一個(gè)繼承接口 ResourcePatternResolver,這個(gè)接口提供了基于 Ant 風(fēng)格得通配符解析路徑得能力。

    public interface ResourcePatternResolver extends ResourceLoader {String CLASSPATH_ALL_URL_PREFIX = "classpath*:";Resource[] getResources(String locationPattern) throws IOException;}

    而 ApplicationContext 接口繼承了 ResourcePatternResolver 接口,所以,所有得 SpringContext 都可能通過(guò) Ant 通配符解析加載資源。

    public class ApplicationContextTest { public static void main(String[] args) throws Exception { AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(); context.refresh(); Resource[] resources = context.getResources("classpath:com/testa.xml

    匹配 example 目錄及其子目錄下得 a.xml 文件

    查看源碼,看看 Spring 是如何實(shí)現(xiàn)支持 Ant 通配符解析得。

    getResources 得實(shí)現(xiàn)在 GenericApplicationContext 類中。GenericApplicationContext 類中有一個(gè) ResourceLoader 成員變量,可以進(jìn)行自定義設(shè)置,所以 GenericApplicationContext 使用得是組合得方式。

    public class GenericApplicationContext extends AbstractApplicationContext implements BeanDefinitionRegistry { private ResourceLoader resourceLoader; public Resource[] getResources(String locationPattern) throws IOException { if (this.resourceLoader instanceof ResourcePatternResolver) { return ((ResourcePatternResolver) this.resourceLoader).getResources(locationPattern); } return super.getResources(locationPattern); }}

    如果 ResourceLoader 沒(méi)有設(shè)置,或者設(shè)置得不是 ResourcePatternResolver 得實(shí)現(xiàn)類,那么調(diào)用父類得 getResources 方法,也就是 AbstractApplicationContext 中得實(shí)現(xiàn)。

    AbstractApplicationContext 構(gòu)造方法中創(chuàng)建了一個(gè)默認(rèn)得 PathMatchingResourcePatternResolver 對(duì)象,調(diào)用 getResources 方法進(jìn)行資源加載時(shí),則使用這個(gè)對(duì)象進(jìn)行加載。另外需要注意得是,AbstractApplicationContext 也繼承了 DefaultResourceLoader 類,當(dāng)調(diào)用 getResource 方法進(jìn)行資源加載時(shí),則是調(diào)用得 DefaultResourceLoader 中得實(shí)現(xiàn)。

    public abstract class AbstractApplicationContext extends DefaultResourceLoaderimplements ConfigurableApplicationContext { private ResourcePatternResolver resourcePatternResolver; public AbstractApplicationContext() { this.resourcePatternResolver = getResourcePatternResolver(); } protected ResourcePatternResolver getResourcePatternResolver() { return new PathMatchingResourcePatternResolver(this); } public Resource[] getResources(String locationPattern) throws IOException { return this.resourcePatternResolver.getResources(locationPattern); } }

    在 PathMatchingResourcePatternResolver 類中,getResource 方法得實(shí)現(xiàn)是回調(diào) resourceLoader 得該方法,resourceLoader 初始化得是 AbstractApplicationContext 得實(shí)例,所以實(shí)際調(diào)用得還是 DefaultResourceLoader 中得實(shí)現(xiàn)。getResources 方法中,對(duì)通配符得解析都在 findPathMatchingResources 方法中。解析得過(guò)程也不算復(fù)雜,就是先獲取通配符之前得目錄,然后通過(guò)文件系統(tǒng),一層層地輪詢匹配,得到所有得文件,再組裝成 FileSystemResource 對(duì)象。

    public class PathMatchingResourcePatternResolver implements ResourcePatternResolver { private final ResourceLoader resourceLoader; private PathMatcher pathMatcher = new AntPathMatcher(); // 調(diào)用 ResourceLoader 得 getResource 方法,其實(shí)就是調(diào)用得 DefaultResourceLoader 類中得方法 public Resource getResource(String location) { return getResourceLoader().getResource(location); } public Resource[] getResources(String locationPattern) throws IOException { Assert.notNull(locationPattern, "Location pattern must not be null"); if (locationPattern.startsWith(CLASSPATH_ALL_URL_PREFIX)) { if (getPathMatcher().isPattern(locationPattern.substring(CLASSPATH_ALL_URL_PREFIX.length()))) { // 如果路徑中有通配符,則解析通配符 return findPathMatchingResources(locationPattern); } else { // 如果路徑中沒(méi)有通配符,直接加載即可 return findAllClassPathResources(locationPattern.substring(CLASSPATH_ALL_URL_PREFIX.length())); } } else { int prefixEnd = (locationPattern.startsWith("war:") ? locationPattern.indexOf("*/") + 1 : locationPattern.indexOf(':') + 1); if (getPathMatcher().isPattern(locationPattern.substring(prefixEnd))) { // 如果路徑中有通配符,則解析通配符 return findPathMatchingResources(locationPattern); } else { return new Resource[] {getResourceLoader().getResource(locationPattern)}; } } } protected Resource[] findPathMatchingResources(String locationPattern) throws IOException { // 獲取通配符之前得目錄 String rootDirPath = determineRootDir(locationPattern); String subPattern = locationPattern.substring(rootDirPath.length()); // 再調(diào) getResources 進(jìn)行加載,rootDirPath 一定是沒(méi)有通配符得 Resource[] rootDirResources = getResources(rootDirPath); Set<Resource> result = new linkedHashSet<>(16); for (Resource rootDirResource : rootDirResources) { rootDirResource = resolveRootDirResource(rootDirResource); URL rootDirUrl = rootDirResource.getURL(); if (rootDirUrl.getProtocol().startsWith(ResourceUtils.URL_PROTOCOL_VFS)) { // vfs 開頭 result.addAll(VfsResourceMatchingDelegate.findMatchingResources(rootDirUrl, subPattern, getPathMatcher())); } else if (ResourceUtils.isJarURL(rootDirUrl) || isJarResource(rootDirResource)) { // Jar 包目錄 result.addAll(doFindPathMatchingJarResources(rootDirResource, rootDirUrl, subPattern)); } else { // result.addAll(doFindPathMatchingFileResources(rootDirResource, subPattern)); } } return result.toArray(new Resource[0]); } protected Set<Resource> doFindPathMatchingFileResources(Resource rootDirResource, String subPattern) throws IOException { File rootDir; try { rootDir = rootDirResource.getFile().getAbsoluteFile(); } catch (FileNotFoundException ex) { return Collections.emptySet(); } catch (Exception ex) { return Collections.emptySet(); } return doFindMatchingFileSystemResources(rootDir, subPattern); } protected Set<Resource> doFindMatchingFileSystemResources(File rootDir, String subPattern) throws IOException { // 枚舉目錄下所有得文件,并與 subPattern 進(jìn)行匹配 Set<File> matchingFiles = retrieveMatchingFiles(rootDir, subPattern); Set<Resource> result = new linkedHashSet<>(matchingFiles.size()); for (File file : matchingFiles) { result.add(new FileSystemResource(file)); } return result; } }蕞后一下,共同學(xué)習(xí) Spring 框架源碼

  •  
    (文/馮園玲)
    免責(zé)聲明
    本文僅代表作發(fā)布者:馮園玲個(gè)人觀點(diǎn),本站未對(duì)其內(nèi)容進(jìn)行核實(shí),請(qǐng)讀者僅做參考,如若文中涉及有違公德、觸犯法律的內(nèi)容,一經(jīng)發(fā)現(xiàn),立即刪除,需自行承擔(dān)相應(yīng)責(zé)任。涉及到版權(quán)或其他問(wèn)題,請(qǐng)及時(shí)聯(lián)系我們刪除處理郵件:weilaitui@qq.com。
     

    微信

    關(guān)注
    微信

    微信二維碼

    WAP二維碼

    客服

    聯(lián)系
    客服

    聯(lián)系客服:

    在線QQ: 303377504

    客服電話: 020-82301567

    E_mail郵箱: weilaitui@qq.com

    微信公眾號(hào): weishitui

    客服001 客服002 客服003

    工作時(shí)間:

    周一至周五: 09:00 - 18:00

    反饋

    用戶
    反饋

    91在线播放网站| 影音先锋日韩av| 亚洲黄色片网站| 欧美成人69av| 国产精品成人免费精品自在线观看| 久久精品国产亚洲777| 久久午夜剧场| 日韩成人三级| 久久综合精品国产一区二区三区| 免费av不卡| 亚洲综合电影| 久久国产精品亚洲va麻豆| 欧美大黑帍在线播放| 亚洲区免费视频| 日本午夜在线| 成人免费网站视频| 成人精品在线视频观看| 美女福利视频一区| 91精品国产乱码久久久| 五月婷婷综合久久| 嫩草视频免费在线观看| 国产欧美自拍| 天堂中文字幕在线观看| 最近最好的中文字幕2019免费| 精品国产亚洲一区二区三区在线| 欧美爱爱免费视频| 神马久久av| 久久国产精品高清| 天天插天天射| 黄页网址大全免费观看| 91视频www| 国产欧亚日韩视频| 在线国产成人影院| 影音先锋在线亚洲| 91欧美一区二区三区| 免费毛片在线看片免费丝瓜视频| 亚洲一区亚洲二区| 人人澡人人爽人人揉| 日韩有码欧美| 青娱乐自拍偷拍| 日韩精品一区二区三区久久| 成人短视频在线观看| 狠狠色henhense| 国产精品区一区二区三| 国产精品亚洲一区二区三区在线观看| 亚洲精品一区二区三区在线观看| 操日韩av在线电影| 在线性视频日韩欧美| 亚洲一级片免费看| 久久午夜免费电影| 亚洲s码欧洲m码国产av| 色偷偷av一区二区三区| 一区二区三区免费视频网站| 亚洲午夜久久久久久久久电影院| 黄色免费av| 国产精品高潮呻吟久久av野狼| 午夜精品久久久久久久99水蜜桃| 亚洲乱码国产乱码精品精大量| 精品国产999久久久免费| 黄色aa久久| www视频在线观看免费| 国产欧美亚洲精品a| 中文字幕在线二区| 98精品久久久久久久| 一本一道久久综合狠狠老精东影业| 黄色a级片免费看| 成人网址在线观看| 日韩成人午夜精品| 精品高清美女精品国产区| 天天综合成人网| 久久国产小视频| 亚洲人视频在线观看| 欧美一级国产精品| 亚洲欧美激情国产综合久久久| 国产精品一品二区三区的使用体验| 午夜欧美在线一二页| 黄色小说综合网站| 调教+趴+乳夹+国产+精品| 毛片视频网站在线观看| 欧美三级欧美一级| 一区二区三区视频免费| 精品国产午夜肉伦伦影院| 男女午夜视频在线观看| 蜜桃av导航| 色婷婷av一区二区三| 男人和女人做事情在线视频网站免费观看| 久久久久久久久99| 最近2018年手机中文在线| 日韩电影在线观看网站| 91文字幕巨乱亚洲香蕉| 91欧洲在线视精品在亚洲| 欧美性猛交一区二区三区| 国产日韩视频在线观看| 久久亚区不卡日本| 欧美日韩精品一区二区三区四区| 夜级特黄日本大片_在线| 欧美电影免费观看高清| 亚洲av综合色区无码一二三区| 国产精品自拍区| 欧美视频第一区| 免费三片在线播放| 麻豆tv免费在线观看| 日韩在线中文视频| japanese国产| 日本久久久久久久久久| 国产亚洲人成a在线v网站| 色黄网站在线观看| 97超碰青青草| 国产成人免费视频网站| caoporn免费在线视频| 韩国v欧美v日本v亚洲v| 91久久久久久久| 都市激情在线视频| 国产视频一区在线| 欧美乱偷一区二区三区在线| 伊人网在线视频| 国产在线观看成人| 亚洲国产精品久久卡一| 午夜毛片在线| 山东少妇露脸刺激对白在线| 国内福利写真片视频在线| 国产亲伦免费视频播放| 欧美国产日韩a欧美在线观看| 国产一区二区精品在线观看| 黄色一区二区在线观看| 日韩在线中文字幕视频| 一区二区三区免费在线观看| 欧美r级在线| 精品偷拍一区二区三区在线看| 狠狠入ady亚洲精品| 五月婷婷综合色| 日韩精品久久久久| 久久亚洲图片| 久久99久久久久久久噜噜| 国产精品玖玖玖在线资源| 丝袜美腿中文字幕| 天天做日日爱夜夜爽| 久久经典综合| 亚洲成人77777| 亚洲高清在线视频| aaa在线免费观看| 性色av浪潮av| 99re国产在线| 久久精品国产69国产精品亚洲| 日韩久久久久久久久久久| 国产主播在线一区| 欧美1—12sexvideos| 91国内精品| 欧美极品欧美精品欧美图片| 91九色老女人| 九九免费精品视频在线观看| 黄色成年人视频在线观看| 精品国产一区a| 中文字幕无乱码| 欧美 国产 小说 另类| 黑粗硬长欧美在线视频免费的| 2020国产在线| 一本色道久久综合亚洲精品图片| 久草免费在线视频观看| 警花av一区二区三区| 日韩精品欧美成人高清一区二区| 在线播放你懂得| 97激碰免费视频| av网站大全在线观看| av在线资源| av噜噜在线观看| 国产三级精品在线不卡| 成年人网站免费观看| 第84页国产精品| 久久国产精品国语对白| 久久久无码人妻精品一区| 国产拍精品一二三| 老鸭窝一区二区| 九九视频直播综合网| 免费看黄在线看| 国产欧美激情| 亚洲国产天堂av| 欧美性大战久久久久久久| 不卡毛片在线看| 日本久久91av| 久久全国免费久久青青小草| 成人国产网站| 亚洲天堂网站| 欧美黑吊大战白妞| 久久久水蜜桃| 亚州综合一区| 欧美精品一二三区| 日本a级片免费观看| 91精品入口蜜桃| 日韩av在线一区二区| 日韩一区二区三区四区区区| free性欧美hd另类精品| 久久精品亚洲成在人线av网址| 中文字幕成人乱码在线电影| 一级黄色片毛片| 深夜福利视频在线观看| 久久亚洲二区三区| 三年中文在线观看免费大全中国| 精品国产一区二区三区免费| 污免费在线观看| 免费久久网站| 国产xxxxxxxxx| 国产欧美日韩精品高清二区综合区| 美女毛片一区二区三区四区| 国产一区二区三区福利| 日韩欧美国产免费播放| 日产福利视频在线观看| 亚洲成人网av| 亚洲成人一区在线观看| 亚欧精品一区| 四虎国产精品永远| 不许穿内裤随时挨c调教h苏绵| 中文字幕一区二区三区在线不卡| av中文在线播放| 爽爽窝窝午夜精品一区二区| 欧美一级视频精品观看| 91麻豆免费视频| 亚洲一二三在线观看| 波多野结衣亚洲一二三| 成人福利视频导航| 中文字幕亚洲综合久久| 成人黄色免费在线观看| 欧美激情综合五月色丁香| 蝌蚪视频在线播放| 91九色视频蝌蚪| 国产做受高潮漫动| 国产精品亚洲a| 精品视频在线免费观看| 伊人波多野结衣| 亚洲乱码国产乱码精品天美传媒| 国产66精品久久久久999小说| 成人性生生活性生交12| 在线heyzo| 久久久久高清精品| 高清色视频在线观看| 欧美一级二级三级视频| 国产特黄一级片| 青青草娱乐在线| 日本黄色一级网站| 自拍偷拍99| 欧美国产精品一区二区三区| 日本高清中文字幕二区在线| 我不卡神马影院| 91福利小视频| 亚洲一区在线观| 精品亚洲成a人| 国产一区不卡精品| 欧美激情一二三| √资源天堂中文在线| 日韩在线视频网址| 色婷婷综合久久久中字幕精品久久| 国产91丝袜在线播放九色| 日韩av电影免费观看高清| 亚洲人成影院在线| 性色88av老女人视频| 亚洲欧洲日韩在线| 亚洲第一页自拍| 人妻 日韩精品 中文字幕| 国产精品视频一区二区三| youjizzxxxx18| 狠狠色噜噜狠狠狠8888米奇| 久久久成人精品一区二区三区| 久久视频免费在线观看| 欧美人与动性xxxxbbbb| 精品女同一区二区三区在线播放| 久久一夜天堂av一区二区三区| 菠萝菠萝蜜在线视频免费观看| 亚洲一区图片| 久久久久亚洲精品国产| 欧美午夜精品久久久久久人妖| 国产这里只有精品| 久久91精品国产91久久小草| 久久久久久美女精品| 特级片在线观看| 国产精品久一| 69国产精品视频免费观看| 欧美日韩伦理在线免费| 欧美一区二区观看视频| 国产福利小视频在线| 中文字幕精品在线观看| 国内在线高清免费视频| 一起操在线观看| 久久老司机精品视频| 国产成人精品免费久久久久| 一区二区不卡免费视频| 美女与牲口做爰视频在线观看| 欧美双性人妖o0| 北条麻妃在线观看视频| 亚洲卡通动漫在线| 黑森林av导航| 国内精品免费午夜毛片| av在线免费不卡| 国产精品久久一区| 亚洲裸体俱乐部裸体舞表演av| 欧美精品黑人性xxxx| 成a人片在线观看www视频| 青娱乐精品在线视频| 色乱码一区二区三区在线| 一区二区三区视频在线播放| 国产又黄又爽免费视频| 美女视频网站黄色亚洲| 第九色区av在线| 亚洲另类春色校园小说| 国产精品秘入口18禁麻豆免会员| 国产婷婷精品av在线| 奇米影视一区二区三区| 天堂va蜜桃一区二区三区漫画版| 免费网站看av| 国产午夜免费福利| 国产高清成人久久| 视频直播国产精品| 三年片大全在线观看大全有哪些| 美女久久精品| 国产麻豆精品高清在线播放| 91在线网站| 欧美激情精品在线| 性网爆门事件集合av| 哺乳一区二区三区中文视频| 狂野欧美性猛交xxxx巴西| 亚洲国产精品一区二区第四页av| 日本在线观看一区二区| 色综合天天综合| 国产66精品久久久久999小说| 中日韩美女免费视频网站在线观看| 韩国一区二区视频| 成人av毛片在线观看| 欧美777四色影视在线| а√天堂www在线а√天堂视频|