精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

SpringBoot 實(shí)現(xiàn)動(dòng)態(tài)插拔的 AOP,太實(shí)用了!

開發(fā)
本文實(shí)現(xiàn)熱插拔AOP就在于對(duì)advice、advised、advisor、pointcut?概念的理解,這是實(shí)現(xiàn)熱插拔AOP的前提。

現(xiàn)在有這么一個(gè)需求:就是我們?nèi)罩镜拈_與關(guān)是交給使用人員來控制的,而不是由我們開發(fā)人員固定寫死的。大家都知道可以用aop來實(shí)現(xiàn)日志管理,但是如何動(dòng)態(tài)的來實(shí)現(xiàn)日志管理呢?

aop源碼中的實(shí)現(xiàn)邏輯中有這么一個(gè)步驟,就是會(huì)依次掃描Advice的實(shí)現(xiàn)類,然后執(zhí)行。我們要做的就是自定義一個(gè)advice的實(shí)現(xiàn)類然后,在用戶想要開啟日志的時(shí)候就把a(bǔ)dvice加到項(xiàng)目中來,關(guān)閉日志的時(shí)候就把a(bǔ)dvice剔除就行了。

前置知識(shí)

(1) Advice:

org.aopalliance.aop.Advice

“通知”,表示 Aspect 在特定的 Join point 采取的操作。包括 “around”, “before” and “after 等 Advice,大體上分為了三類:BeforeAdvice、MethodInterceptor、AfterAdvice

(2) Advisor:

org.springframework.aop.Advisor

“通知者”,它持有 Advice,是 Spring AOP 的一個(gè)基礎(chǔ)接口。它的子接口 PointcutAdvisor 是一個(gè)功能完善接口,它涵蓋了絕大部分的 Advisor。

(3) Advised:

org.springframework.aop.framework.Advised

AOP 代理工廠配置類接口。提供了操作和管理 Advice 和 Advisor 的能力。它的實(shí)現(xiàn)類 ProxyFactory 是 Spring AOP 主要用于創(chuàng)建 AOP 代理類的核心類。

熱插拔AOP執(zhí)行核心邏輯

核心實(shí)現(xiàn)代碼

(1) 動(dòng)態(tài)管理advice端點(diǎn)實(shí)現(xiàn)

@RestControllerEndpoint(id = "proxy")
@RequiredArgsConstructor
public class ProxyMetaDefinitionControllerEndPoint {

    private final ProxyMetaDefinitionRepository proxyMetaDefinitionRepository;


    @GetMapping("listMeta")
    public List<ProxyMetaDefinition> getProxyMetaDefinitions(){
       return proxyMetaDefinitionRepository.getProxyMetaDefinitions();
    }

    @GetMapping("{id}")
    public ProxyMetaDefinition getProxyMetaDefinition(@PathVariable("id") String proxyMetaDefinitionId){
        return proxyMetaDefinitionRepository.getProxyMetaDefinition(proxyMetaDefinitionId);
    }

    @PostMapping("save")
    public String save(@RequestBody ProxyMetaDefinition definition){

        try {
            proxyMetaDefinitionRepository.save(definition);
            return "success";
        } catch (Exception e) {

        }
        return "fail";

    }

    @PostMapping("delete/{id}")
    public String delete(@PathVariable("id")String proxyMetaDefinitionId){
        try {
            proxyMetaDefinitionRepository.delete(proxyMetaDefinitionId);
            return "success";
        } catch (Exception e) {

        }
        return "fail";
    }

}

(2) 利用事件監(jiān)聽機(jī)制捕獲安裝或者卸載插件

@RequiredArgsConstructor
public class ProxyMetaDefinitionChangeListener {

    private final AopPluginFactory aopPluginFactory;

    @EventListener
    public void listener(ProxyMetaDefinitionChangeEvent proxyMetaDefinitionChangeEvent){
        ProxyMetaInfo proxyMetaInfo = aopPluginFactory.getProxyMetaInfo(proxyMetaDefinitionChangeEvent.getProxyMetaDefinition());
        switch (proxyMetaDefinitionChangeEvent.getOperateEventEnum()){
            case ADD:
                aopPluginFactory.installPlugin(proxyMetaInfo);
                break;
            case DEL:
                aopPluginFactory.uninstallPlugin(proxyMetaInfo.getId());
                break;
        }

    }
}

(3) 安裝插件

public void installPlugin(ProxyMetaInfo proxyMetaInfo){
        if(StringUtils.isEmpty(proxyMetaInfo.getId())){
            proxyMetaInfo.setId(proxyMetaInfo.getProxyUrl() + SPIILT + proxyMetaInfo.getProxyClassName());
        }
        AopUtil.registerProxy(defaultListableBeanFactory,proxyMetaInfo);
    }

(4) 安裝插件核心實(shí)現(xiàn)

public static void registerProxy(DefaultListableBeanFactory beanFactory,ProxyMetaInfo proxyMetaInfo){
        AspectJExpressionPointcutAdvisor advisor = getAspectJExpressionPointcutAdvisor(beanFactory, proxyMetaInfo);
        addOrDelAdvice(beanFactory,OperateEventEnum.ADD,advisor);

    }

    private static AspectJExpressionPointcutAdvisor getAspectJExpressionPointcutAdvisor(DefaultListableBeanFactory beanFactory, ProxyMetaInfo proxyMetaInfo) {
        BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition();
        GenericBeanDefinition beanDefinition = (GenericBeanDefinition) builder.getBeanDefinition();
        beanDefinition.setBeanClass(AspectJExpressionPointcutAdvisor.class);
        AspectJExpressionPointcutAdvisor advisor = new AspectJExpressionPointcutAdvisor();
        advisor.setExpression(proxyMetaInfo.getPointcut());
        advisor.setAdvice(Objects.requireNonNull(getMethodInterceptor(proxyMetaInfo.getProxyUrl(), proxyMetaInfo.getProxyClassName())));
        beanDefinition.setInstanceSupplier((Supplier<AspectJExpressionPointcutAdvisor>) () -> advisor);
        beanFactory.registerBeanDefinition(PROXY_PLUGIN_PREFIX + proxyMetaInfo.getId(),beanDefinition);

        return advisor;
    }

(5) 卸載插件

public void uninstallPlugin(String id){
        String beanName = PROXY_PLUGIN_PREFIX + id;
        if(defaultListableBeanFactory.containsBean(beanName)){
           AopUtil.destoryProxy(defaultListableBeanFactory,id);
        }else{
            throw new NoSuchElementException("Plugin not found: " + id);
        }
    }

(6) 卸載插件核心實(shí)現(xiàn)

public static void destoryProxy(DefaultListableBeanFactory beanFactory,String id){
        String beanName = PROXY_PLUGIN_PREFIX + id;
        if(beanFactory.containsBean(beanName)){
            AspectJExpressionPointcutAdvisor advisor = beanFactory.getBean(beanName,AspectJExpressionPointcutAdvisor.class);
            addOrDelAdvice(beanFactory,OperateEventEnum.DEL,advisor);
            beanFactory.destroyBean(beanFactory.getBean(beanName));
        }
    }

(7) 操作advice實(shí)現(xiàn)

public static void addOrDelAdvice(DefaultListableBeanFactory beanFactory, OperateEventEnum operateEventEnum,AspectJExpressionPointcutAdvisor advisor){
        AspectJExpressionPointcut pointcut = (AspectJExpressionPointcut) advisor.getPointcut();
        for (String beanDefinitionName : beanFactory.getBeanDefinitionNames()) {
            Object bean = beanFactory.getBean(beanDefinitionName);
            if(!(bean instanceof Advised)){
                if(operateEventEnum == OperateEventEnum.ADD){
                    buildCandidateAdvised(beanFactory,advisor,bean,beanDefinitionName);
                }
                continue;
            }
            Advised advisedBean = (Advised) bean;
            boolean isFindMatchAdvised = findMatchAdvised(advisedBean.getClass(),pointcut);
            if(operateEventEnum == OperateEventEnum.DEL){
                if(isFindMatchAdvised){
                    advisedBean.removeAdvice(advisor.getAdvice());
                    log.info("########################################## Remove Advice -->【{}】 For Bean -->【{}】 SUCCESS !",advisor.getAdvice().getClass().getName(),bean.getClass().getName());
                }
            }else if(operateEventEnum == OperateEventEnum.ADD){
                if(isFindMatchAdvised){
                    advisedBean.addAdvice(advisor.getAdvice());
                    log.info("########################################## Add Advice -->【{}】 For Bean -->【{}】 SUCCESS !",advisor.getAdvice().getClass().getName(),bean.getClass().getName());
                }
            }


        }
    }

熱插拔AOP演示示例

(1) 創(chuàng)建一個(gè)service

@Service
@Slf4j
public class HelloService implements BeanNameAware, BeanFactoryAware {
    private BeanFactory beanFactory;

    private String beanName;

    @SneakyThrows
    public String sayHello(String message) {
        Object bean = beanFactory.getBean(beanName);
        log.info("============================ {} is Advised : {}",bean, bean instanceof Advised);
        TimeUnit.SECONDS.sleep(new Random().nextInt(3));
        log.info("============================ hello:{}",message);

        return "hello:" + message;

    }

    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        this.beanFactory = beanFactory;
    }

    @Override
    public void setBeanName(String name) {
        this.beanName = name;
    }
}

(2) 創(chuàng)建一個(gè)controller

@RestController
@RequestMapping("hello")
@RequiredArgsConstructor
public class HelloController {

    private final HelloService helloService;

    @GetMapping("{message}")
    public String sayHello(@PathVariable("message")String message){
        return helloService.sayHello(message);
    }
}

(3) 準(zhǔn)備一個(gè)日志切面jar

切面內(nèi)容為

@Slf4j
public class LogMethodInterceptor implements MethodInterceptor {
    @Override
    public Object invoke(MethodInvocation invocation) throws Throwable {
        Object result;
        try {
            result = invocation.proceed();
        } finally {
           log.info(">>>>>>>>>>>>>>>>>>>>>>>>TargetClass:【{}】,method:【{}】,args:【{}】",invocation.getThis().getClass().getName(),invocation.getMethod().getName(), Arrays.toString(invocation.getArguments()));
        }

        return result;
    }
}

(4) 測(cè)試

場(chǎng)景一:未添加切面時(shí) 瀏覽器訪問:http://localhost:8080/hello/zhangsan 觀察控制臺(tái)

場(chǎng)景二:通過postman動(dòng)態(tài)操作代理

① 新增代理

觀察控制臺(tái):

########################################## BuildCandidateAdvised -->【com.github.lybgeek.aop.test.hello.service.HelloService】 With Advice -->【com.github.lybgeek.interceptor.LogMethodInterceptor】 SUCCESS !

此時(shí)瀏覽器訪問:http://localhost:8080/hello/zhangsan

再次觀察控制臺(tái):

出現(xiàn)了切面日志信息,說明代理生效。

② 刪除代理

觀察控制臺(tái):

########################################## Remove Advice -->【com.github.lybgeek.interceptor.LogMethodInterceptor】 For Bean -->【com.github.lybgeek.aop.test.hello.service.HelloService$$EnhancerBySpringCGLIB$$7bc75aa3】 SUCCESS !

此時(shí)瀏覽器訪問:http://localhost:8080/hello/zhangsan

再次觀察控制臺(tái):

此時(shí)沒有出現(xiàn)切面日志信息,說明代理刪除成功

總結(jié)

本文實(shí)現(xiàn)熱插拔AOP就在于對(duì)advice、advised、advisor、pointcut概念的理解,這是實(shí)現(xiàn)熱插拔AOP的前提,其次就是對(duì)自定義classloader也需要有一定的了解,因?yàn)槲覀僯ar不一定從classpath底下加載,也有可能來源其他地方,比如遠(yuǎn)程鏈接啥的,最后就是把原先spring自動(dòng)幫我們實(shí)現(xiàn)aop,我們利用相關(guān)的api,自己手動(dòng)實(shí)現(xiàn)一遍,示例代碼的api只是利用spring api其中一種實(shí)現(xiàn)方式,它還有多種實(shí)現(xiàn)方式,比如可以利用TargetSource,感興趣的朋友,也可以自己實(shí)現(xiàn)一把。

至于那個(gè)代理增刪改查端點(diǎn)contoller,是我之前看springcloud gateway的路由定位器端點(diǎn)源碼,一直沒找到機(jī)會(huì)實(shí)現(xiàn)一下,就把他搬來這個(gè)示例實(shí)現(xiàn)一把,加深一下印象。

責(zé)任編輯:趙寧寧 來源: 碼猿技術(shù)專欄
相關(guān)推薦

2025-07-29 01:22:00

2021-05-19 15:06:44

MySQL數(shù)據(jù)庫(kù)命令

2022-04-19 13:07:25

SchedulePython

2022-03-18 09:25:49

Python圖片PDF

2024-12-27 08:43:17

2022-12-12 09:01:03

2020-06-29 11:05:26

GitHub代碼開發(fā)者

2015-08-05 13:24:15

2020-09-04 09:32:54

蘇寧數(shù)據(jù)治理

2022-09-14 07:36:34

PowerToys微軟

2023-12-22 09:14:48

EDA數(shù)據(jù)分析探索性數(shù)據(jù)分析

2022-06-14 08:50:18

Python交互式儀表板代碼

2009-06-22 15:10:00

java 編程AOP

2023-09-27 08:50:57

Serverles編寫運(yùn)維

2024-08-09 08:46:00

Springjar 包YAML

2018-01-31 10:24:45

熱插拔原理服務(wù)器

2023-03-30 07:48:46

接口鑒權(quán)SpringBoot

2023-05-06 16:26:28

??Vue??UI組件

2017-10-26 21:08:15

Tomcat可插拔SCI

2024-09-02 00:27:51

SpringAOP自定義
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

九色91av视频| 欧美一级日韩一级| 艳色歌舞团一区二区三区| 一级特黄aaa大片| 亚洲性图久久| 国产午夜精品全部视频在线播放| 在线看免费毛片| av小说在线播放| 久久久精品免费免费| 91精品国产综合久久香蕉922| 中文字幕av久久爽av| 狼人精品一区二区三区在线| 欧美日韩三级一区| 国产亚洲精品网站| 97影院秋霞午夜在线观看| 久久综合资源网| 成人高清在线观看| 亚洲网站在线免费观看| 国产精品嫩草99av在线| 久久久精品久久| 亚洲自拍偷拍图| 中文在线综合| 91精品蜜臀在线一区尤物| 东京热加勒比无码少妇| 美女精品导航| 国产精品的网站| 免费久久99精品国产自| 亚洲风情第一页| 理论电影国产精品| 清纯唯美亚洲综合| 日韩成人在线免费视频| 综合激情视频| 久久久精品亚洲| 在线看片中文字幕| 国产欧美日韩在线一区二区| 亚洲精品久久久久中文字幕欢迎你| 亚洲av无日韩毛片久久| 国产成人精选| 精品视频全国免费看| 黄色片一级视频| 成人免费网站观看| 亚洲午夜精品在线| 亚洲啊啊啊啊啊| 国产在线69| 国产精品久久久久7777按摩| 视频一区视频二区视频三区视频四区国产| 天堂视频中文在线| 成人一二三区视频| 国产精品美女xx| 一级片一区二区三区| 蜜桃视频一区二区三区在线观看| 2019中文字幕免费视频| 亚洲一区欧美在线| 在线播放亚洲| 欧美一级bbbbb性bbbb喷潮片| 日韩欧美性视频| 亚洲理伦在线| 欧美综合在线观看| 一级一片免费看| 日本成人在线视频网站| 国产精品久久久久秋霞鲁丝| 在线观看视频二区| 国内精品国产三级国产a久久| 91精品视频大全| 99久久精品免费看国产交换| 国产成人综合亚洲91猫咪| 波多野结衣久草一区| 刘玥91精选国产在线观看| 成人av电影免费观看| 精品视频第一区| 欧美少妇另类| 国产精品麻豆视频| 小泽玛利亚av在线| xxx性欧美| 色综合天天综合给合国产| 欧美日韩怡红院| 国产欧美日韩电影| 亚洲国产成人在线视频| 色婷婷在线影院| 清纯唯美亚洲综合一区| 欧美www在线| 日本一区二区三区四区五区| 久久一二三区| 亚洲一区久久久| 无码精品黑人一区二区三区 | 国产永久av在线| 国产精品毛片大码女人| 久久久天堂国产精品| 无码小电影在线观看网站免费| 欧美亚洲国产一区二区三区va | 99精品国产一区二区三区不卡| 欧美日韩精品久久久免费观看| 免费成人黄色| 婷婷成人激情在线网| www.日日操| 日韩成人精品| 亚洲香蕉成人av网站在线观看| 色老板免费视频| 亚洲影视综合| 成人在线中文字幕| 五月天婷婷激情网| 亚洲欧洲日产国产综合网| 大陆av在线播放| 欧美亚洲二区| 亚洲欧美国产va在线影院| 91香蕉视频污在线观看| 国产欧美在线| 亚洲一区二区中文| √新版天堂资源在线资源| 亚洲成a人v欧美综合天堂下载| www.色就是色| 欧美日韩一区二区三区四区不卡| 久久久av一区| 日韩综合在线观看| 成人h动漫精品一区二区| 亚洲国产一区二区精品视频| 国产激情视频在线看| 在线不卡a资源高清| 无码人妻aⅴ一区二区三区 | 中文字幕成人在线观看| 丁香色欲久久久久久综合网| 久久青草免费| 亚洲无限av看| 国产黄色免费观看| 国产suv一区二区三区88区| 亚洲一区尤物| 欧美xxxx做受欧美护士| 日韩av在线影院| 国产在线视频99| 国产另类ts人妖一区二区| 午夜午夜精品一区二区三区文| 韩国成人二区| 精品成人免费观看| 激情视频在线播放| 国产精品一二三四五| 中文字幕欧美日韩一区二区三区| 日本一区免费网站| 国产亚洲美女精品久久久| 国产成人免费观看视频| av资源网一区| 少妇高潮毛片色欲ava片| 国产极品模特精品一二| 欧美高清视频在线| 性网爆门事件集合av| 亚洲精品国产一区二区三区四区在线| 亚洲综合av在线播放| 日韩片欧美片| 91九色国产在线| 久久99精品久久久久久野外| 777a∨成人精品桃花网| 三级黄色在线观看| 国产一区二区精品久久91| 天天干天天操天天干天天操| 亚洲色图综合| 欧美老肥婆性猛交视频| 亚洲免费黄色片| 午夜影院久久久| 成人精品在线观看视频| 亚洲女人av| 涩涩涩999| 日韩专区视频| 欧美另类精品xxxx孕妇| 丰满大乳国产精品| 欧美日韩一区二区在线播放| 精品人妻无码一区二区三区| 日本伊人色综合网| 亚洲国产精品女人| 一区二区中文字幕在线观看| 亚洲 日韩 国产第一| 美州a亚洲一视本频v色道| 欧美视频中文字幕| 强乱中文字幕av一区乱码| 91在线观看免费视频| 美女黄色片视频| 一区二区三区国产精华| 成人免费视频观看视频| 天堂av中文在线观看| 一本色道久久综合狠狠躁篇怎么玩 | 一区二区三区影视| 99精品偷自拍| 超碰在线播放91| 欧美日韩a区| 欧美二级三级| 国产精品一区三区在线观看| 97精品伊人久久久大香线蕉| 成人在线免费公开观看视频| 日韩一级免费观看| 在线免费黄色av| 136国产福利精品导航| 男人的天堂影院| 另类调教123区| 僵尸世界大战2 在线播放| 成人午夜av| 国产一区二区精品免费| 国产极品一区| 91精品国产91久久久久久最新| а天堂8中文最新版在线官网| 日韩精品专区在线| 国语对白做受69按摩| 亚洲一区二区三区在线播放| 日本少妇xxxxx| proumb性欧美在线观看| 天堂av8在线| 国产乱码精品| 日韩成人三级视频| 久久一区二区三区喷水| 久久精品美女| 午夜久久av| 国产在线精品一区免费香蕉| 悠悠资源网亚洲青| 欧美理论电影在线观看| www.视频在线.com| 日韩毛片在线观看| 亚洲美女综合网| 8x8x8国产精品| 全部毛片永久免费看| 亚洲欧美日韩国产综合| 老司机福利在线观看| 91麻豆精东视频| 在线免费看黄色片| 国产传媒久久文化传媒| 亚洲视频在线不卡| 老司机一区二区| www.涩涩涩| 日韩成人dvd| 国产亚洲精品网站| 亚洲神马久久| 成人性生活视频免费看| 欧美欧美全黄| 伊人再见免费在线观看高清版| 欧美黄色大片在线观看| 日本一区高清在线视频| 亚洲专区视频| 久久亚洲午夜电影| 欧美jizz19性欧美| 国产欧美在线一区二区| 高清精品视频| 国产91aaa| 中文字幕日韩在线| 亚洲综合中文字幕在线| 另类视频一区二区三区| 亚洲va电影大全| 国产色99精品9i| 91视频婷婷| 日本少妇精品亚洲第一区| 91亚洲国产成人精品性色| 99精品美女视频在线观看热舞 | 国产女18毛片多18精品| 欧美日本在线播放| 国产精品毛片一区视频播| 欧美人与z0zoxxxx视频| 国产乱码久久久久| 91麻豆精品国产自产在线| 亚洲天堂中文在线| 日韩一区二区三区免费看| 午夜久久久久久噜噜噜噜| 日韩欧美精品在线视频| 理论片中文字幕| 精品视频在线观看日韩| 国内精品一区视频| 色哟哟亚洲精品一区二区| 黄色的网站在线观看| 欧美精品在线看| 19禁羞羞电影院在线观看| 国产91精品不卡视频| 伊人久久高清| 国产欧美婷婷中文| 亚洲高清在线一区| 国产高清精品一区| 亚洲精品进入| 亚洲精品视频一区二区三区| 亚洲综合激情在线| 给我免费播放片在线观看| 久久久久一区| 午夜一区二区视频| 成人午夜看片网址| 婷婷色一区二区三区| 亚洲黄色片在线观看| 一级片中文字幕| 欧美日韩一区二区三区四区| 91成人一区二区三区| 亚洲成年人在线| 国产成人天天5g影院在线观看| 亚洲性夜色噜噜噜7777| av免费在线观看网址| 欧日韩在线观看| 亚洲国产伊人| 九九九九精品| 我不卡手机影院| 69堂免费视频| 国产精品影视在线| 美女被到爽高潮视频| 一区二区三区高清在线| 无码日韩精品一区二区| 日韩精品一区二区三区在线 | 一道在线中文一区二区三区| 亚洲一区三区| 久久先锋资源| 国产麻豆剧传媒精品国产| 国产精品亲子乱子伦xxxx裸| 日韩欧美中文字幕一区二区| 91精品一区二区三区在线观看| 日本人妖在线| 欧美俄罗斯乱妇| 久久久久伊人| 日本视频一区二区在线观看| 狠狠入ady亚洲精品| 在线免费观看视频黄| 99精品黄色片免费大全| 欧美极品视频在线观看| 色哟哟日韩精品| 后入内射欧美99二区视频| 久久精品亚洲精品| 欧洲亚洲两性| 国产色综合一区二区三区| 91精品国产自产在线观看永久∴| 日本精品一区二区三区四区| 成人国产精品免费| h色网站在线观看| 欧美日韩亚洲综合在线 欧美亚洲特黄一级| 手机av在线免费观看| 久久99精品视频一区97| 亚洲人成777| 日韩三级电影| 日韩不卡一二三区| 亚洲狠狠婷婷综合久久久久图片| 亚洲一区二区三区在线播放| 国产高清不卡视频| 久久精品国产欧美亚洲人人爽| 激情开心成人网| 久久青青草综合| 国产一区二区三区久久| 最新版天堂资源在线| 136国产福利精品导航| 一级特黄色大片| y97精品国产97久久久久久| 成人全视频免费观看在线看| 欧美三级网色| 久热re这里精品视频在线6| 一二三不卡视频| 色激情天天射综合网| 韩日视频在线| 国产精品成人一区| 成人激情视频| 亚洲欧美视频二区| 国产精品久久久一区麻豆最新章节| 国产精品成人无码| 中文字幕亚洲综合| 午夜精品久久久久久毛片| 在线日韩av永久免费观看| 国内一区二区视频| 免费在线观看av网址| 亚洲精品一区二区三区蜜桃下载 | 宅男在线观看免费高清网站| 91在线免费视频| 伊人成年综合电影网| 搡老熟女老女人一区二区| 色网站国产精品| 在线播放麻豆| 99热在线国产| 免费日韩av片| 99热6这里只有精品| 欧美电视剧在线看免费| 国产拍在线视频| 日韩一本精品| 国产一区二区不卡在线| 国产午夜激情视频| 亚洲色图综合网| 亚洲精品第一| 精品一二三四五区| 2017欧美狠狠色| 国产三级自拍视频| 高清视频欧美一级| 国产一区二区三区四区五区传媒 | 人妖一区二区三区| 亚洲色成人一区二区三区小说| 欧美国产乱子伦| 性生活视频软件| 国产精品久久久久久久久借妻| 久久久五月天| 西西大胆午夜视频| 欧美片网站yy| 蜜桃视频动漫在线播放| 亚洲电影免费| 成人av网址在线观看| 中文字幕你懂的| 国内精品久久久久久久| 日本一区二区三区视频| 日批免费观看视频| 欧美影视一区二区三区| 色噜噜狠狠狠综合欧洲色8| 奇米视频888战线精品播放| 国产一区二区三区免费在线观看| 日本一级淫片色费放| 久久精品亚洲精品| 少妇精品久久久一区二区三区| 波多野结衣电影免费观看| 欧美性受xxxx| 狠狠操一区二区三区| 久久天天东北熟女毛茸茸|