久久亚洲精品成人_国产精品欧美综合亚洲_亚洲va天堂va欧美ⅴa在线_91色视频在线观看_久久影院亚洲_一级黄色片播放_日韩av在线一区_精品一区二区在线看_老头吃奶性行交视频_日韩免费高清视频_天天操天天爽天天干_日本欧美在线视频

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

注解學習(模仿springMvc的注解注入方式)

2019-11-14 15:39:44
字體:
來源:轉載
供稿:網友

最近在看sPRingMvc的源碼,看到了該框架的注入注解的部分覺的有點吃力,可能還是對注解的方面的知識還認識的不夠深刻,所以特意去學習注解方面的知識。由于本人也是抱著學習的態度來閱讀源碼,若文章在表述和代碼方面如有不妥之處,歡迎批評指正。留下你的腳印,歡迎評論!希望能互相學習。

1,首先定義三個常用的注解Service,Autowired,Contrller;(主要的解釋都在代碼中有,在這里就不多陳述)

Service:

package com.lishun.Annotation;import java.lang.annotation.Documented;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;/*Description: * @Target:指定注解的使用范圍(指的是,在哪些類型可以使用該注解:Service注解只能在類,接口(包括注解類型)或enum等使用) * 可選值: * 可選的值在枚舉類 ElemenetType 中,包括:           ElemenetType.CONSTRUCTOR 構造器聲明           ElemenetType.FIELD 域聲明(包括 enum 實例)           ElemenetType.LOCAL_VARIABLE 局部變量聲明          ElemenetType.ANNOTATION_TYPE 作用于注解量聲明          ElemenetType.METHOD 方法聲明          ElemenetType.PACKAGE 包聲明           ElemenetType.PARAMETER 參數聲明           ElemenetType.TYPE 類,接口(包括注解類型)或enum聲明  * */@Target(ElementType.TYPE)/*Description: * @Retention :表示在什么級別保存該注解信息 * 可選的參數值在枚舉類型 RetentionPolicy 中,包括:           RetentionPolicy.SOURCE 注解將被編譯器丟棄           RetentionPolicy.CLASS 注解在class文件中可用,但會被VM丟棄           RetentionPolicy.RUNTIME VM將在運行期也保留注釋,因此可以通過反射機制讀取注解的信息。  * */@Retention(RetentionPolicy.RUNTIME)/*@Documented 將此注解包含在 javadoc 中 ,它代表著此注解會被javadoc工具提取成文檔。 * 在doc文檔中的內容會因為此注解的信息內容不同而不同。相當與@see,@param 等。 * */@Documentedpublic @interface Service {    /* @interface用來聲明一個注解,其中的每一個方法實際上是聲明了一個配置參數。     * 方法的名稱就是參數的名稱,返回值類型就是參數的類型(返回值類型只能是基本類型、Class、String、enum)。     * 可以通過default來聲明參數的默認值。    */    String value() default "this is service annotation";}

 

Autowired:

package com.lishun.Annotation;import java.lang.annotation.Documented;import java.lang.annotation.ElementType;import java.lang.annotation.Inherited;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;@Target({ElementType.METHOD,ElementType.FIELD})  @Retention(RetentionPolicy.RUNTIME)  public @interface Autowired {      public String value() default "no description";  }

Contrller:

package com.lishun.Annotation;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)public @interface Contrller {    String value() default "this is contrller annotation";}

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

2:javaBean數據池-BeanFactory:主要存放含有注解的類;

package com.lishun.factory;import java.util.HashMap;import java.util.Map;/** * Description:存放所有bean的數據池  * @author lishun * @since 2015-09-10 */public class BeanFactory {    private static Map<String, Object> map = new HashMap<String, Object>();    public static void addBean(String beanName, Object bean) {        map.put(beanName, bean);    }    public static Object getBean(String beanName) throws Exception {        Object o = map.get(beanName);        if (o != null) {            return o;        } else {            throw new Exception("未注入的類型:" + beanName);        }    }    public static Boolean containsBean(String beanName){        return map.containsKey(beanName);    }}

 

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

3:編寫處理注解的核心代碼(這里涉及的主要知識是反射,如果反射知識不夠熟練的話建議先學習反射方面的知識),主要涉及的兩個類是注解驅動(AnnotationDriven)和注解掃描類(PackUtils-這個類主要的是掃描包名下所有的類(如com.lishun,就是掃描該包下所有的類),代碼主要是來自網絡)

AnnotationDriven:

package com.lishun.utils;import java.lang.annotation.Annotation;import java.lang.reflect.Field;import java.util.List;import com.lishun.Annotation.Autowired;import com.lishun.Annotation.Contrller;import com.lishun.Annotation.Service;import com.lishun.factory.BeanFactory;/** * Description:注入驅動類,所有的注解注入都在這里實現(這里只實現了通過類型來注入值,其他方式沒實現,其實代碼都是差不多了,有興趣的可以自行腦補) * @author lishun * */public class AnnotationDriven {    public static void annotationDriven(String packName) throws Exception {        //注入Service和Contrller        List<Class<?>> classSaveServicePaths = PackUtils                .getClassListByAnnotation(packName, Service.class);        List<Class<?>> classSaveContrllerPaths = PackUtils                .getClassListByAnnotation(packName, Contrller.class);        saveBean(classSaveServicePaths);        saveBean(classSaveContrllerPaths);        //注入Autowired        List<Class<?>> classInjectPaths = PackUtils.getClassListByAnnotation(                packName, Autowired.class);        inject(classInjectPaths);    }    private static void saveBean(List<Class<?>> classSavePaths)            throws InstantiationException, IllegalaccessException {        for (Class<?> classPath : classSavePaths) {            try {                Class c = Class.forName(classPath.getName());                Object o = c.newInstance();                //掃描的到的含有注解的類實例化后保存在池中                BeanFactory.addBean(classPath.getName(), o);            } catch (ClassNotFoundException e) {                e.printStackTrace();            }        }    }    private static void inject(List<Class<?>> classInjectPaths) throws Exception {        Object o = null;        for (Class<?> classInjectPath : classInjectPaths) {            Class c = Class.forName(classInjectPath.getName());            //判斷存放bean的池中是否存在該bean            if (BeanFactory.containsBean(classInjectPath.getName())) {                o = BeanFactory.getBean(classInjectPath.getName());            } else {                o = c.newInstance();            }            Field[] fields = c.getDeclaredFields();            for (Field field : fields) {                Annotation[] annotations = field.getAnnotations();                for (Annotation annotation : annotations) {                    // 判斷是否是通過類型注解注入                    if (annotation instanceof Autowired) {                        Class classField = field.getType();                        Object clazz = BeanFactory                                .getBean(classField.getName());                        field.set(o, clazz);                        BeanFactory.addBean(classInjectPath.getName(), o);                    }                }            }        }    }}

PackUtils:

package com.lishun.utils;import java.io.File;import java.io.FileFilter;import java.lang.annotation.Annotation;import java.lang.reflect.Field;import java.net.JarURLConnection;import java.net.URL;import java.util.ArrayList;import java.util.Enumeration;import java.util.List;import java.util.jar.JarEntry;import java.util.jar.JarFile;/** * Description:掃描指定包工具類的注解 * @author lishun * @since 2015-09-10 */public class PackUtils {    public static List<Class<?>> getClassList(String packageName, boolean isRecursive) {        List<Class<?>> classList = new ArrayList<Class<?>>();        try {            Enumeration<URL> urls = Thread.currentThread().getContextClassLoader().getResources(packageName.replaceAll("http://.", "/"));            while (urls.hasMoreElements()) {                URL url = urls.nextElement();                if (url != null) {                    String protocol = url.getProtocol();                    if (protocol.equals("file")) {                        String packagePath = url.getPath();                        addClass(classList, packagePath, packageName, isRecursive);                    } else if (protocol.equals("jar")) {                        JarURLConnection jarURLConnection = (JarURLConnection) url.openConnection();                        JarFile jarFile = jarURLConnection.getJarFile();                        Enumeration<JarEntry> jarEntries = jarFile.entries();                        while (jarEntries.hasMoreElements()) {                            JarEntry jarEntry = jarEntries.nextElement();                            String jarEntryName = jarEntry.getName();                            if (jarEntryName.endsWith(".class")) {                                String className = jarEntryName.substring(0, jarEntryName.lastIndexOf(".")).replaceAll("/", ".");                                if (isRecursive || className.substring(0, className.lastIndexOf(".")).equals(packageName)) {                                    classList.add(Class.forName(className));                                }                            }                        }                    }                }            }        } catch (Exception e) {            e.printStackTrace();        }        return classList;    }    // 獲取指定包名下的所有類(可根據注解進行過濾)    public static List<Class<?>> getClassListByAnnotation(String packageName, Class<? extends Annotation> annotationClass) {        List<Class<?>> classList = new ArrayList<Class<?>>();        try {            Enumeration<URL> urls = Thread.currentThread().getContextClassLoader().getResources(packageName.replaceAll("http://.", "/"));            while (urls.hasMoreElements()) {                URL url = urls.nextElement();                if (url != null) {                    String protocol = url.getProtocol();                    if (protocol.equals("file")) {                        String packagePath = url.getPath();                        addClassByAnnotation(classList, packagePath, packageName, annotationClass);                    } else if (protocol.equals("jar")) {                        JarURLConnection jarURLConnection = (JarURLConnection) url.openConnection();                        JarFile jarFile = jarURLConnection.getJarFile();                        Enumeration<JarEntry> jarEntries = jarFile.entries();                        while (jarEntries.hasMoreElements()) {                            JarEntry jarEntry = jarEntries.nextElement();                            String jarEntryName = jarEntry.getName();                            if (jarEntryName.endsWith(".class")) {                                String className = jarEntryName.substring(0, jarEntryName.lastIndexOf(".")).replaceAll("/", ".");                                Class<?> cls = Class.forName(className);                                if (cls.isAnnotationPresent(annotationClass)) {                                    classList.add(cls);                                }                            }                        }                    }                }            }        } catch (Exception e) {            e.printStackTrace();        }        return classList;    }    private static void addClass(List<Class<?>> classList, String packagePath, String packageName, boolean isRecursive) {        try {            File[] files = getClassFiles(packagePath);            if (files != null) {                for (File file : files) {                    String fileName = file.getName();                    if (file.isFile()) {                        String className = getClassName(packageName, fileName);                        classList.add(Class.forName(className));                    } else {                        if (isRecursive) {                            String subPackagePath = getSubPackagePath(packagePath, fileName);                            String subPackageName = getSubPackageName(packageName, fileName);                            addClass(classList, subPackagePath, subPackageName, isRecursive);                        }                    }                }            }        } catch (Exception e) {            e.printStackTrace();        }    }    private static File[] getClassFiles(String packagePath) {        return new File(packagePath).listFiles(new FileFilter() {            @Override            public boolean accept(File file) {                return (file.isFile() && file.getName().endsWith(".class")) || file.isDirectory();            }        });    }    private static String getClassName(String packageName, String fileName) {        String className = fileName.substring(0, fileName.lastIndexOf("."));        if (!packageName.equals("")) {            className = packageName + "." + className;        }        return className;    }    private static String getSubPackagePath(String packagePath, String filePath) {        String subPackagePath = filePath;        if (!packagePath.equals("")) {            subPackagePath = packagePath + "/" + subPackagePath;        }        return subPackagePath;    }    private static String getSubPackageName(String packageName, String filePath) {        String subPackageName = filePath;        if (!packageName.equals("")) {            subPackageName = packageName + "." + subPackageName;        }        return subPackageName;    }    private static void addClassByAnnotation(List<Class<?>> classList, String packagePath, String packageName, Class<? extends Annotation> annotationClass) {        try {            File[] files = getClassFiles(packagePath);            if (files != null) {                for (File file : files) {                    String fileName = file.getName();                    if (file.isFile()) {                        String className = getClassName(packageName, fileName);                        Class<?> cls = Class.forName(className);                        if (cls.isAnnotationPresent(annotationClass)) {                            classList.add(cls);                        }                        Field[] fields=cls.getFields();                        for (Field field : fields) {                            if(field.isAnnotationPresent(annotationClass)){                                 classList.add(cls);                            }                        }                    } else {                        String subPackagePath = getSubPackagePath(packagePath, fileName);                        String subPackageName = getSubPackageName(packageName, fileName);                        addClassByAnnotation(classList, subPackagePath, subPackageName, annotationClass);                    }                }            }        } catch (Exception e) {            e.printStackTrace();        }    }}

 

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

4 最后編寫平時使用的設計模式來測試注解(Dao,Service,Contrller)【這里主要是為測試注解的注入,所以沒有使用實際的使用數據庫數據,側重點不在這里】

Dao

package com.lishun.Dao;import com.lishun.Annotation.Service;@Servicepublic class UserDao {    public void run(){        System.out.println("測試成功");    }}

Service:

package com.lishun.Service;import com.lishun.Annotation.Autowired;import com.lishun.Annotation.Service;import com.lishun.Dao.UserDao;@Servicepublic class UserService {    @Autowired    public UserDao userDao;    public void run(){         userDao.run();    }}

Controller:

package com.lishun.controller;import com.lishun.Annotation.Autowired;import com.lishun.Annotation.Contrller;import com.lishun.Service.UserService;@Contrllerpublic class UserContrller {    @Autowired    public  UserService userService;    public void login(){        userService.run();    }}

測試入口

package com.lishun.t;import java.lang.annotation.Annotation;import java.lang.reflect.Field;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;import java.util.Arrays;import java.util.List;import org.junit.Test;import com.lishun.Annotation.Autowired;import com.lishun.Annotation.Contrller;import com.lishun.Annotation.Service;import com.lishun.Dao.UserDao;import com.lishun.Service.UserService;import com.lishun.controller.UserContrller;import com.lishun.factory.BeanFactory;import com.lishun.utils.AnnotationDriven;import com.lishun.utils.PackUtils;public class test {    @Test    public void main() throws Exception {        //啟動時根據需要掃描的包名,來注入含有注解的類的字段值        AnnotationDriven.annotationDriven("com.lishun");        //這里相當于web的訪問一次controller的一次請求        UserContrller user = (UserContrller) BeanFactory                .getBean("com.lishun.controller.UserContrller");        user.login();    }}

最后運行,

控制臺輸出:測試成功

由于本人水平有限,若文章在表述和代碼方面如有不妥之處,歡迎批評指正。留下你的腳印,歡迎評論!希望能互相學習。需要源碼的留下郵箱

 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
日韩国产高清视频在线| 7777精品久久久大香线蕉小说| 欧美激情亚洲综合| 蜜桃传媒视频第一区入口在线看| 欧洲国内综合视频| 首页国产欧美久久| 天堂在线精品视频| 成人3d动漫一区二区三区91| 日韩一区二区精品在线观看| 视频在线在亚洲| 性欧美丰满熟妇xxxx性久久久| 成人久久18免费网站漫画| 91精品国产综合久久福利| 国产一区二区三区免费看| 国产精品18在线| 亚洲精品国产系列| 欧美麻豆久久久久久中文| 亚洲另类春色国产| 草逼视频免费看| 亚洲精品国产久| 成人在线免费观看视视频| 欧美欧美欧美欧美首页| 国产91精品一区二区| 久久国产精品二区| 国产又粗又长又大的视频| 国产美女91呻吟求| 欧美成人a∨高清免费观看| caoporen国产精品视频| 稀缺呦国内精品呦| 国产午夜精品一区二区三区视频| av免费在线播放网站| 美女性感视频久久久| 一区二区成人在线观看| 亚洲乱码在线观看| 人人妻人人澡人人爽人人精品 | 国产精品高清在线观看| 色综合一区二区| 国产91在线看| 艳妇乳肉豪妇荡乳av| 97精品人妻一区二区三区蜜桃| 亚洲v国产v| 17婷婷久久www| 欧美日韩卡一卡二| 豆国产96在线|亚洲| 亚洲一区 视频| 波多野结衣免费观看| 欧美日韩一区二区三区免费| 色综合男人天堂| 欧美视频在线免费| www.av亚洲| 黄色av中文字幕| 免费网站看av| 老司机免费视频| 精品国产一区二区三区无码| 91最新在线免费观看| www.亚洲一区| 日韩一区二区三区三四区视频在线观看 | 国产成人久久久久| 黄色av免费在线播放| 欧美精品在线免费| 欧美伊人久久久久久久久影院 | 中国特级黄色片| 女同性恋一区二区| 国产色综合一区二区三区| 免费91在线视频| 欧美一级黄色录像| 一区二区在线观看不卡| 国产成a人无v码亚洲福利| 精品乱子伦一区二区| 国产精彩视频在线| 自拍偷拍亚洲天堂| 黄色一级片免费播放| 日韩黄色片在线| 美女被啪啪一区二区| 国产精品69av| 欧美精品一区三区| 国产一区二区激情| 亚洲精品久久7777777| 色狠狠av一区二区三区| 亚洲电影激情视频网站| 国产精品美女久久久久久久久久久 | 亚洲狼人综合干| 少妇免费毛片久久久久久久久| 国产精品久久久久久五月尺| 91国偷自产一区二区三区的观看方式| 国产亚洲a∨片在线观看| 欧美精品自拍偷拍| 大胸美女被爆操| 欧美一区在线视频| 欧美波霸videosex极品| 91污在线观看| av观看免费在线| 91精品久久久久久久久久久久久| 欧美尺度大的性做爰视频| 亚洲图片在区色| 欧美日韩亚洲综合在线 欧美亚洲特黄一级 | 国产免费黄色录像| 久久国产精品免费看| 麻豆视频在线免费看| 好吊日免费视频| 日本日本19xxxⅹhd乱影响| 美国av在线播放| 日韩精品大片| 亚洲欧洲精品在线| 久久这里只有精品8| 僵尸世界大战2 在线播放| 男人添女人下面高潮视频| 乱妇乱女熟妇熟女网站| 亚洲 国产 图片| 国产艳妇疯狂做爰视频| 完美搭档在线观看| 成人做爰69片免网站| 欧美日韩在线国产| 日韩电影在线观看一区二区| 国产欧美日韩成人| 污视频网站在线播放| 久久国产生活片100| 国产盗摄一区二区三区| 久久久精品综合| 亚洲婷婷国产精品电影人久久| 亚洲成人资源在线| 在线一区二区三区四区| 精品国产91洋老外米糕| 一区二区三区黄色| 国产91色在线|| 精品国产一区二区三区免费 | 东方aⅴ免费观看久久av| 久久久精品免费网站| 亚洲乱码国产乱码精品精98午夜 | 中文字幕精品一区二区精品绿巨人| 欧美韩国日本综合| 一区二区三区四区激情| 欧美亚洲免费在线一区| 日韩精品极品毛片系列视频| 午夜精品福利在线观看| 国产成人免费观看| 99视频精品全部免费看| 天天做天天干天天操| 国产又粗又长免费视频| 国产乡下妇女三片| 六月丁香婷婷久久| 国产精品污网站| 欧美日韩国产天堂| 欧美成人精品三级在线观看 | 精品国产一区二区三区久久狼黑人| 欧美综合国产精品久久丁香| 国产一级精品aaaaa看| 日韩小视频在线播放| 国产一精品一aⅴ一免费| 91av在线免费视频| 免费成人在线观看视频| 中文字幕av一区二区三区高 | 亚洲在线一区二区| 国产爆乳无码一区二区麻豆 | 成人av在线播放观看| 久久久久久无码精品人妻一区二区| 性欧美疯狂猛交69hd| 亚洲成人精品女人久久久| 国产欧美一区二区精品性色超碰| 欧美精品九九99久久| 久久九九免费视频| 国产美女99p| 992kp免费看片| 久久艹免费视频| 国产精品18久久久久久久久| 欧美日韩免费网站| 久久视频在线直播| 欧美一二三四五区| 午夜福利三级理论电影| 国产精品自拍第一页| 国产成人久久精品77777最新版本 国产成人鲁色资源国产91色综 | 亚洲韩国欧洲国产日产av| 国产精品白嫩美女在线观看| 成人av在线不卡| 亚洲国产123| 免费在线视频一区| 婷婷综合另类小说色区| 久热精品视频在线免费观看 | 国产亚洲精品久久久久久打不开| 秋霞国产午夜精品免费视频| 欧美特级www| 国内精品久久影院| 日本中文字幕网址| 久久免费激情视频| 国产亚洲美州欧州综合国 | www.色小姐com| 国内精品不卡在线| 欧美日韩dvd在线观看| 国产成人97精品免费看片| 欧美黄色免费影院| 国产高潮久久久| 国产欧美日韩综合| 久久躁狠狠躁夜夜爽| 老司机激情视频| 国产一级精品视频| 国产精品视频九色porn| 久久久精品2019中文字幕神马| 亚洲一区二区在线免费观看| 久草视频手机在线| jvid福利写真一区二区三区| 国产视频亚洲精品| 正在播放国产精品| 日本三级免费看| 国产农村妇女精品| 色综合久久悠悠| 国产视频在线视频| 性一交一乱一色一视频麻豆| 日韩欧美国产骚| 国产在线观看不卡| 大乳护士喂奶hd| 狠狠色综合日日| 亚洲女人天堂av| 欧美a级免费视频| 欧美日韩a v| 亚洲成人精品在线观看| 91精品久久久久久久久久入口 | 精品人体无码一区二区三区| 丁香激情综合国产| 亚洲美女视频网站| 99re8这里只有精品| 好吊色在线视频| 亚洲妇女屁股眼交7| 亚洲综合在线做性| 日韩欧美视频免费观看| 国产精品久久久久毛片软件| 国产精品久久久久免费a∨大胸| 日本五十肥熟交尾| 不卡欧美aaaaa| 97人人模人人爽人人喊中文字| 在线观看日本www| 国产精品亚洲а∨天堂免在线| www.99久久热国产日韩欧美.com| 久章草在线视频| 美女国产一区二区| 久久精品色欧美aⅴ一区二区| 茄子视频成人免费观看| 日本成人在线一区| 在线观看中文字幕亚洲| www.日本一区| 国产精品夜夜嗨| 69av成年福利视频| 亚洲午夜久久久久久久国产| 国产精品久久久久久亚洲毛片 | 五月婷婷一区| 国产精品国产三级国产普通话对白| 在线亚洲欧美专区二区| 亚洲一区精彩视频| av中文在线观看| 精品福利一二区| 激情综合在线观看| 国产一区二区三区免费在线观看| 久久69精品久久久久久国产越南| 天天躁日日躁狠狠躁av| 91麻豆国产在线观看| 亚洲www永久成人夜色| 久久国产黄色片| 日韩欧美成人激情| 无人在线观看的免费高清视频| 国产很黄免费观看久久| 国产成人精品免费久久久久| 青青草免费av| 欧美艳星brazzers| 日韩日韩日韩日韩日韩| 国产在线一区观看| 国产精品jizz在线观看麻豆| 久久久久久久福利| 日韩一级免费观看| 一区二区三区视频网| www.激情成人| 7777精品伊久久久大香线蕉语言| 中文字幕第一页在线播放| 精品中文视频在线| 久久性爱视频网站| 精品福利免费观看| 亚洲熟妇无码一区二区三区导航| 国产91丝袜在线18| 91亚洲一区精品| 91麻豆视频在线观看| 久久精品成人动漫| 麻豆changesxxx国产| 日韩免费高清av| 国产伦精品一区二区免费| 婷婷成人激情在线网| 成人精品视频在线播放| av资源网一区| 日本在线免费观看一区| 国内精品自线一区二区三区视频| 国产在线高清精品| www.av网站| 欧洲精品在线视频| 在线亚洲欧美日韩| 国内精品在线一区| 老熟妇一区二区三区啪啪| 欧美国产中文字幕| 少妇久久久久久久| 欧美激情高清视频| 国产一级一级国产| 欧美精品videosex极品1| 久久久久久久99| www亚洲精品| 在线观看日本网站| 欧美成人午夜影院| 69xxxx国产| 韩国精品美女www爽爽爽视频| 波多野结衣高清在线| 久久人人爽亚洲精品天堂| 久久久久人妻一区精品色欧美| 国产亚洲人成a一在线v站| 久久久香蕉视频| 日韩一区二区久久久| 日韩精品在线一区二区三区| 欧美亚洲免费电影| 日韩一级片免费观看| 99三级在线| 91啪亚洲精品| 国产黄视频在线| 欧美日韩在线影院| av av在线| 亚洲精品久久久久| 国产一级片毛片| 国产精品国产福利国产秒拍 | 天天操天天摸天天爽| 午夜久久久影院| 91香蕉国产线在线观看| 日韩欧美一卡二卡| 美女的奶胸大爽爽大片| 久久大大胆人体| 精品国自产拍在线观看| 成人在线观看91| 91欧美一区二区| 欧美日韩大尺度| 欧美高清www午色夜在线视频| 黄色香蕉视频在线观看| 久久夜色精品亚洲噜噜国产mv| 一级成人免费视频| 91网在线免费观看| 91麻豆国产香蕉久久精品| 中文字幕第38页| 欧美一区二区福利在线| 国产黄色片在线免费观看| 91精品国产高清| 麻豆久久久久久| 男人的天堂avav| 一本到一区二区三区| 成人性生活毛片| 97不卡在线视频| 国产麻豆视频精品| 国产主播在线看| 宅男噜噜噜66一区二区66| www.av麻豆| 999在线观看免费大全电视剧| 久久婷婷国产综合国色天香| 日韩a在线播放| 精品国产123| 国产日韩一级片| 亚洲精品在线观看免费| 天天综合网 天天综合色| 国产三级在线观看完整版| 午夜欧美不卡精品aaaaa| 蜜臂av日日欢夜夜爽一区| 免费超爽大片黄| 欧美日本乱大交xxxxx| 国产无遮挡又黄又爽又色| 91精品国产免费久久久久久 | 成人免费观看男女羞羞视频| 欧美精品一区二区三区免费播放| 日韩一级片在线播放| 中文字幕理论片| 日本一区二区三区四区高清视频 | 国产精品一区二区男女羞羞无遮挡| www.av91| 日韩高清不卡av| 天堂网av2018| 国产精品丝袜白浆摸在线 | 久久久久久久9| 日韩精品自拍偷拍| 丰满少妇一级片| 异国色恋浪漫潭| 日韩一区二区三免费高清| 国产乱人乱偷精品视频| 精品嫩模一区二区三区| 精品免费视频一区二区| 亚洲欧美日本在线观看| 九热视频在线观看| 欧美成人午夜激情在线| 国产mv日韩mv欧美| 国产精品1000部啪视频| 国产精品欧美日韩久久| 一区二区三区欧美视频| 五月天激情四射| www婷婷av久久久影片| 亚洲欧美日韩中文视频| 老司机精品视频在线| 手机在线免费毛片| 国产97在线播放| 一区二区三区四区视频精品免费| 在线观看日本视频| www.欧美黄色| 美女性感视频久久久| 国产日产欧美一区二区三区| 老妇女50岁三级| 亚洲精品国产系列| 亚洲午夜未满十八勿入免费观看全集| 国内外成人在线视频| 欧美亚一区二区三区| 精品视频一区二区三区四区| 欧美一区2区视频在线观看| 蜜桃视频免费观看一区| 欧美激情aaa| 日产精品高清视频免费|