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

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

Spring面向切面 --- AspectJ --- 簡單使用

2019-11-14 21:03:09
字體:
來源:轉載
供稿:網友
SPRing面向切面 --- aspectJ --- 簡單使用Spring面向切面 --- AspectJ --- 簡單使用

昨天回復說說的時候突然寫下了下面的一段話:分享一下:

<!--*******************************************

其實經過的記憶是可以進行道德化的篡改的,就像夏目漱石的《我是貓》;但是不管怎么改,真正的事實是由每一個人的碎片拼起來的;經濟學里計算成本的是在計算將來的成本而不是過去的成本,就像動漫《未來日記》一樣;過去發生的事情總是在影響著將來,但是過去發生的事情卻不能充當將來下一個操作符的影響要素。********************************************-->

面向切面編程用到了動態代理,感興趣的讀者可以參考我的日志:

http://www.49028c.com/kodoyang/p/DesignPattern_DynamicProxy.html

1.AspectJ - AOP面向切面編程是面向對象的一個補充

在保存用戶前添加一個日志,再加上時刻的記錄??傊褪欠椒ㄇ昂蠹右稽c業務邏輯

新建資源庫:Preference>java>BuildPath>UserLibraries,AddLibrary>UserLibrary

/Spring_AOP/src/yuki/spring/aop/imitate/UserService.java

package yuki.spring.aop.imitate;public interface UserService {    void save();}

/Spring_AOP/src/yuki/spring/aop/imitate/UserServiceImpl.java

package yuki.spring.aop.imitate;public class UserServiceImpl implements UserService{    public void save(){        System.out.println("user saved...");    }}

/Spring_AOP/src/yuki/spring/aop/imitate/Intercepter.java

package yuki.spring.aop.imitate;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;public abstract class Intercepter implements InvocationHandler {    private Object target;    public void setTarget(Object target) {        this.target = target;    }        protected abstract void beforeMethod();    protected abstract void afterMethod();        @Override    public Object invoke(Object proxy, Method m, Object[] args)            throws Throwable {        beforeMethod();        m.invoke(target, args);        afterMethod();        return null;    }}

/Spring_AOP/src/yuki/spring/aop/imitate/LogIntercepter.java

package yuki.spring.aop.imitate;public class LogIntercepter extends Intercepter {    @Override    public void beforeMethod() {        System.out.println("log start...");    }    @Override    protected void afterMethod() {        System.out.println("log end...");    }}

/Spring_AOP/src/yuki/spring/aop/imitate/TimeIntercepter.java

package yuki.spring.aop.imitate;public class TimeIntercepter extends Intercepter {    @Override    protected void beforeMethod() {        System.out.println("start:" + System.currentTimeMillis());    }    @Override    protected void afterMethod() {        System.out.println("end:" + System.currentTimeMillis());    }}

/Spring_AOP/src/yuki/spring/aop/imitate/ProxyTest.java

package yuki.spring.aop.imitate;import java.lang.reflect.Proxy;public class ProxyTest {    public static void main(String[] args) {        UserService service = new UserServiceImpl();                Intercepter[] intercepters = {new LogIntercepter(), new TimeIntercepter()};        for(Intercepter intercepter : intercepters){            intercepter.setTarget(service);            service = (UserService) Proxy.newProxyInstance(                    service.getClass().getClassLoader(),                     service.getClass().getInterfaces(), intercepter);        }                service.save();            }}

上面的程序中,兩個類繼承了實現InvocationHandler接口的抽象類,

也可以說是間接地實現了InvocationHandler接口;

聲明為UserService接口類型的service,

在循環中每一次接收Proxy.newProxyInstance方法的計算結果后就會改變它指向的對象。

運行結果如下:

start:1409496143248log start...user saved...log end...end:1409496143250

<aop:aspectj-autoproxy></aop:aspectj-autoproxy>

注解的方式實現AOP使用的是aspectj,aspectj是專門用來產生動態代理的一個框架可以使用aspectj注解的方式實現spring的AOP,把這個邏輯織入到原來的邏輯里面去

引入jar:aspectjrt.jar、aspectj-weaver.jar:http://www.java2s.com/Code/Jar/a/aspectj.htm

在類上添加注解 @Aspect和 @Component,在方法上添加注解 @Before切入點語法 @Before("execution(public void yuki.spring.aop.annotation"+ ".UserServiceImpl.save(yuki.spring.aop.annotation.User))")引入jar:aopalliance-.jar:http://www.java2s.com/Code/Jar/a/Downloadaopalliancejar.htm@Component要加在對應的實現類上,因為getBean后要獲取這個對象

/Spring_AOP/src/yuki/spring/aop/annotation/User.java

package yuki.spring.aop.annotation;public class User {}

/Spring_AOP/src/yuki/spring/aop/annotation/UserService.java

package yuki.spring.aop.annotation;public interface UserService {    void save(User user);}

/Spring_AOP/src/yuki/spring/aop/annotation/UserServiceImpl.java

package yuki.spring.aop.annotation;import org.springframework.stereotype.Component;@Component("userService")public class UserServiceImpl implements UserService{    public void save(User user){        System.out.println("user saved...");    }}

/Spring_AOP/src/annotation.xml

<?xml version="1.0" encoding="UTF-8"?><beans xmlns:aop="http://www.springframework.org/schema/aop"    xmlns:context="http://www.springframework.org/schema/context"     xmlns="http://www.springframework.org/schema/beans"    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xsi:schemaLocation="http://www.springframework.org/schema/beans                         http://www.springframework.org/schema/beans/spring-beans-4.0.xsd                         http://www.springframework.org/schema/aop                         http://www.springframework.org/schema/aop/spring-aop-4.0.xsd                         http://www.springframework.org/schema/context                         http://www.springframework.org/schema/context/spring-context-4.0.xsd ">        <context:annotation-config></context:annotation-config>    <context:component-scan base-package="yuki.spring.aop.annotation"></context:component-scan>        <aop:aspectj-autoproxy></aop:aspectj-autoproxy>    </beans>

/Spring_AOP/src/yuki/spring/aop/annotation/LogIntercepter.java

package yuki.spring.aop.annotation;import org.aspectj.lang.annotation.Aspect;import org.aspectj.lang.annotation.Before;import org.springframework.stereotype.Component;@Aspect@Componentpublic class LogIntercepter {    @Before("execution(public void yuki.spring.aop.annotation"            + ".UserServiceImpl.save(yuki.spring.aop.annotation.User))")    public void beforeMethod() {        System.out.println("method start...");    }}

/Spring_AOP/src/yuki/spring/aop/annotation/TimeIntercepter.java

package yuki.spring.aop.annotation;import org.aspectj.lang.annotation.AfterReturning;import org.aspectj.lang.annotation.Aspect;import org.aspectj.lang.annotation.Before;import org.springframework.stereotype.Component;@Aspect@Componentpublic class TimeIntercepter {    @Before("execution("            + "public * yuki.spring.aop.annotation..*.*(..)"            + ")")    public void beforeMethod() {        System.out.println("before:" + System.currentTimeMillis());    }    @AfterReturning("execution( public * yuki.spring.aop.annotation..*.*(..) )")    public void afterReturningMethod() {        System.out.println("afterReturning:" + System.currentTimeMillis());    }}

/Spring_AOP/src/yuki/spring/aop/annotation/PointcutIntercepter.java

package yuki.spring.aop.annotation;import org.aspectj.lang.annotation.AfterReturning;import org.aspectj.lang.annotation.Aspect;import org.aspectj.lang.annotation.Before;import org.aspectj.lang.annotation.Pointcut;import org.springframework.stereotype.Component;@Aspect@Componentpublic class PointcutIntercepter {    @Pointcut("execution( public * yuki.spring.aop.annotation..*.*(..) )")    public void myMethod() {}        @Before("myMethod()")    public void beforeMethod() {        System.out.println("PointcutIntercepter::before");    }    @AfterReturning("myMethod()")    public void afterReturningMethod() {        System.out.println("PointcutIntercepter::afterReturning");    }}

/Spring_AOP/src/yuki/spring/aop/annotation/UserServiceTest.java

package yuki.spring.aop.annotation;import org.junit.Test;import org.springframework.context.support.ClassPathXmlapplicationContext;public class UserServiceTest {    @Test    public void testSave() {                @SuppressWarnings("resource")        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("annotation.xml");        UserService service = (UserService) context.getBean("userService");        service.save(new User());        context.destroy();    }}

運行結果如下:

八月 31, 2014 10:59:10 下午 org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@1637f22: startup date [Sun Aug 31 22:59:10 CST 2014]; root of context hierarchy八月 31, 2014 10:59:10 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions信息: Loading XML bean definitions from class path resource [annotation.xml]method start...PointcutIntercepter::beforebefore:1409497152268user saved...afterReturning:1409497152268PointcutIntercepter::afterReturning八月 31, 2014 10:59:12 下午 org.springframework.context.support.ClassPathXmlApplicationContext doClose信息: Closing org.springframework.context.support.ClassPathXmlApplicationContext@1637f22: startup date [Sun Aug 31 22:59:10 CST 2014]; root of context hierarchy

術語解釋:JoinPoint:連接點、切入點,在哪里把邏輯加進區PointCut:JoinPoint的集合,可以一次性定義好多切入點Aspect:切面,切面類加進去的邏輯可以認為是一個切面Advice:在這個點上建議怎么辦,比如 @BeforeTarget:被織入邏輯的被代理對象Weave:織入

2.切面和通知切入點:// the execution of any public method:execution(public * *(..))// the execution of any method with a name beginning with "set":execution(* set*(..))// the execution of any method defined by the AccountService interface:execution(* com.xyz.service.AccountService.*(..))// the execution of any method defined in the service package:execution(* com.xyz.service..(..))// the execution of any method defined in the service package or a sub-package:execution(* com.xyz.service..*.*(..))spring也定義了自己的織入點語法,但是我們只要用AspectJ的語法就可以了

通知:Before、AfterReturn、AfterThrowing、After(意思是finally)Around:在ProceedingJoinPoint.proceed()前后加邏輯

如果織入點表達式相同,可以定義Pointcut定義方法名接收織入點表達式的值,使用時 @AfterReturning("pointcut()")

/Spring_AOP/src/yuki/spring/aop/pointcut/User.java

package yuki.spring.aop.pointcut;public class User {}

/Spring_AOP/src/yuki/spring/aop/pointcut/UserService.java

package yuki.spring.aop.pointcut;public interface UserService {    void save(User user);}

/Spring_AOP/src/yuki/spring/aop/pointcut/UserServiceImpl.java

package yuki.spring.aop.pointcut;import org.springframework.stereotype.Component;@Component("userService")public class UserServiceImpl implements UserService{    public void save(User user){        System.out.println("user saved...");        //throw new RuntimeException("exception...");    }}

/Spring_AOP/src/yuki/spring/aop/pointcut/TransactionAspect.java

package yuki.spring.aop.pointcut;import org.aspectj.lang.ProceedingJoinPoint;import org.aspectj.lang.annotation.AfterReturning;import org.aspectj.lang.annotation.AfterThrowing;import org.aspectj.lang.annotation.Around;import org.aspectj.lang.annotation.Aspect;import org.aspectj.lang.annotation.Before;import org.aspectj.lang.annotation.Pointcut;import org.springframework.stereotype.Component;@Aspect@Componentpublic class TransactionAspect {    @Pointcut("execution( public * yuki.spring.aop.pointcut..*.*(..) )")    public void pointcut(){}        @Before("pointcut()")    public void before(){        System.out.println("before");    }    @AfterReturning("pointcut()")    public void afterReturning(){        System.out.println("afterReturning");    }    @AfterThrowing("pointcut()")    public void afterThrowing(){        System.out.println("afterThrowing");    }        @Around("pointcut()")    public void aroundMethod(ProceedingJoinPoint pjp) throws Throwable{        System.out.println("method around start...");        pjp.proceed();        System.out.println("method around end...");    }    }

/Spring_AOP/src/pointcut.xml

<?xml version="1.0" encoding="UTF-8"?><beans xmlns:aop="http://www.springframework.org/schema/aop"    xmlns:context="http://www.springframework.org/schema/context"     xmlns="http://www.springframework.org/schema/beans"    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xsi:schemaLocation="http://www.springframework.org/schema/beans                         http://www.springframework.org/schema/beans/spring-beans-4.0.xsd                         http://www.springframework.org/schema/aop                         http://www.springframework.org/schema/aop/spring-aop-4.0.xsd                         http://www.springframework.org/schema/context                         http://www.springframework.org/schema/context/spring-context-4.0.xsd ">        <context:annotation-config></context:annotation-config>    <context:component-scan base-package="yuki.spring.aop.pointcut"></context:component-scan>        <aop:aspectj-autoproxy></aop:aspectj-autoproxy>    </beans>

/Spring_AOP/src/yuki/spring/aop/pointcut/UserServiceTest.java

package yuki.spring.aop.pointcut;import org.junit.Test;import org.springframework.context.support.ClassPathXmlApplicationContext;public class UserServiceTest {    @Test    public void testSave() {                @SuppressWarnings("resource")        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("pointcut.xml");        UserService service = (UserService) context.getBean("userService");        service.save(new User());        context.destroy();    }}

運行結果如下:

八月 31, 2014 11:09:22 下午 org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@1637f22: startup date [Sun Aug 31 23:09:22 CST 2014]; root of context hierarchy八月 31, 2014 11:09:22 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions信息: Loading XML bean definitions from class path resource [pointcut.xml]method around start...beforeuser saved...method around end...afterReturning八月 31, 2014 11:09:24 下午 org.springframework.context.support.ClassPathXmlApplicationContext doClose信息: Closing org.springframework.context.support.ClassPathXmlApplicationContext@1637f22: startup date [Sun Aug 31 23:09:22 CST 2014]; root of context hierarchy

可以實現聲明式的異常管理,struts2已經實現了聲明式的異常管理,這里略過通知執行的先后順序

3.cglib如果被代理的類實現了接口,就會使用JDK自帶的Proxy和InvocationHandler來實現代理當被代理的類沒有實現接口,它會用cglib直接操作二進制碼的形式來產生代理的代碼引入jar:cglib-2.2.jar:http://www.java2s.com/Code/Jar/c/Downloadcglib22jar.htm

/Spring_AOP/src/yuki/spring/aop/cglib/UserService.java

package yuki.spring.aop.cglib;import org.springframework.stereotype.Component;@Componentpublic class UserService {    public void save(){        System.out.println("user saved...");    }}

/Spring_AOP/src/yuki/spring/aop/cglib/CglibAspect.java

package yuki.spring.aop.cglib;import org.aspectj.lang.ProceedingJoinPoint;import org.aspectj.lang.annotation.Around;import org.aspectj.lang.annotation.Aspect;import org.aspectj.lang.annotation.Pointcut;import org.springframework.stereotype.Component;@Aspect@Componentpublic class CglibAspect {    @Pointcut("execution( public * yuki.spring.aop.cglib..*.*(..) )")    public void pointcut(){}        @Around("pointcut()")    public void aroundMethod(ProceedingJoinPoint pjp) throws Throwable{        System.out.println("method around start...");        pjp.proceed();        System.out.println("method around end...");    }    }

/Spring_AOP/src/cglib.xml

<?xml version="1.0" encoding="UTF-8"?><beans xmlns:aop="http://www.springframework.org/schema/aop"    xmlns:context="http://www.springframework.org/schema/context"     xmlns="http://www.springframework.org/schema/beans"    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xsi:schemaLocation="http://www.springframework.org/schema/beans                         http://www.springframework.org/schema/beans/spring-beans-4.0.xsd                         http://www.springframework.org/schema/aop                         http://www.springframework.org/schema/aop/spring-aop-4.0.xsd                         http://www.springframework.org/schema/context                         http://www.springframework.org/schema/context/spring-context-4.0.xsd ">        <context:annotation-config></context:annotation-config>    <context:component-scan base-package="yuki.spring.aop.cglib"></context:component-scan>        <aop:aspectj-autoproxy></aop:aspectj-autoproxy>    </beans>

/Spring_AOP/src/yuki/spring/aop/cglib/UserServiceTest.java

package yuki.spring.aop.cglib;import org.junit.Test;import org.springframework.context.support.ClassPathXmlApplicationContext;public class UserServiceTest {    @Test    public void testSave() {                @SuppressWarnings("resource")        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("cglib.xml");        UserService service = (UserService) context.getBean("userService");        System.out.println(service.getClass());        service.save();        context.destroy();    }}

運行結果如下:

八月 31, 2014 11:14:17 下午 org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@1637f22: startup date [Sun Aug 31 23:14:17 CST 2014]; root of context hierarchy八月 31, 2014 11:14:17 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions信息: Loading XML bean definitions from class path resource [cglib.xml]class yuki.spring.aop.cglib.UserService$$EnhancerBySpringCGLIB$$b8ea6837method around start...user saved...method around end...八月 31, 2014 11:14:19 下午 org.springframework.context.support.ClassPathXmlApplicationContext doClose信息: Closing org.springframework.context.support.ClassPathXmlApplicationContext@1637f22: startup date [Sun Aug 31 23:14:17 CST 2014]; root of context hierarchy

4.xml:AOPpointcut可以聲明在aspect的里面或外面

eclipse:從源碼視圖切換到設計視圖

在執行UserService.save()時,發現符合配置的切入點表達式對應的是LogAspect.before(),于是先執行before,然后save()可以直接指定pointcut,也可以在外部指定然后再引用它如果使用第三方類的切面類邏輯,那么就必須要使用xml配置的方式

/Spring_AOP/src/yuki/spring/aop/xml/UserService.java

package yuki.spring.aop.xml;import org.springframework.stereotype.Component;@Component("userService")public class UserService {    public void save(){        System.out.println("user saved...");    }}

/Spring_AOP/src/yuki/spring/aop/xml/LogAspect.java

package yuki.spring.aop.xml;public class LogAspect {    public void before() {        System.out.println("method start...");    }}

/Spring_AOP/src/xml.xml

<?xml version="1.0" encoding="UTF-8"?><beans xmlns:aop="http://www.springframework.org/schema/aop"    xmlns:context="http://www.springframework.org/schema/context"     xmlns="http://www.springframework.org/schema/beans"    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xsi:schemaLocation="http://www.springframework.org/schema/beans                         http://www.springframework.org/schema/beans/spring-beans-4.0.xsd                         http://www.springframework.org/schema/aop                         http://www.springframework.org/schema/aop/spring-aop-4.0.xsd                         http://www.springframework.org/schema/context                         http://www.springframework.org/schema/context/spring-context-4.0.xsd ">        <context:annotation-config></context:annotation-config>    <context:component-scan base-package="yuki.spring.aop.xml"></context:component-scan>        <bean id="logAspect" class="yuki.spring.aop.xml.LogAspect"></bean>    <!--     <aop:config>        <aop:pointcut id="servicePointcut"                expression="execution( public * yuki.spring.aop.xml..*.*(..) )" />        <aop:aspect id="logAspect" ref="logAspect">            <aop:before method="before" pointcut-ref="servicePointcut"/>        </aop:aspect>    </aop:config>     -->    <aop:config>        <aop:aspect id="logAspect" ref="logAspect">            <aop:before method="before"                     pointcut="execution( public * yuki.spring.aop.xml..*.*(..) )"/>        </aop:aspect>    </aop:config></beans>

/Spring_AOP/src/yuki/spring/aop/xml/UserServiceTest.java

package yuki.spring.aop.xml;import org.junit.Test;import org.springframework.context.support.ClassPathXmlApplicationContext;public class UserServiceTest {    @Test    public void testSave() {                @SuppressWarnings("resource")        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("xml.xml");        UserService service = (UserService) context.getBean("userService");        service.save();        context.destroy();    }}

運行結果如下:

八月 31, 2014 11:19:01 下午 org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@1637f22: startup date [Sun Aug 31 23:19:01 CST 2014]; root of context hierarchy八月 31, 2014 11:19:01 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions信息: Loading XML bean definitions from class path resource [xml.xml]method start...user saved...八月 31, 2014 11:19:02 下午 org.springframework.context.support.ClassPathXmlApplicationContext doClose信息: Closing org.springframework.context.support.ClassPathXmlApplicationContext@1637f22: startup date [Sun Aug 31 23:19:01 CST 2014]; root of context hierarchy

5.tomcat debug的熱部署在tomcat的jdk虛擬機參數中添加-Dcom.sun.management.jmxremote=true

如果修改配置文件,使用了自定義標簽的jsp頁面,修改了注解,等等情況:還是要重啟服務器的

在方法內部修改代碼,不用重啟服務器,這已經是很大的便捷了,

有興趣的小伙伴們去研究功能更強大的熱部署吧。。。。

目錄結構:

本文參考了[尚學堂馬士兵_Spring_AOP]的公開課程

更多好文請關注:http://www.49028c.com/kodoyang/

>*_*<

kongdongyang

2014/8/31


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
在线播放日韩精品| 亚洲一区二区三区视频播放| 大荫蒂欧美视频另类xxxx| 亚洲成人精品视频| 国产一区二区三区欧美| 日本免费久久高清视频| 国产精品久久久久久av福利软件| 久久久999精品免费| 成人在线一区二区| 日韩欧美亚洲综合| 日韩欧美一区视频| 久久久久久久色| 国产97在线|日韩| 91精品国产高清久久久久久久久| 日本不卡高字幕在线2019| 777国产偷窥盗摄精品视频| 91老司机在线| 91国产视频在线| 成人精品网站在线观看| 国产日韩欧美在线观看| 亚洲精品一区二区三区婷婷月| 91中文在线视频| 精品国产一区二区三区久久久| 国产精品福利在线观看网址| 亚洲高清一二三区| 国产日韩欧美在线观看| 亚洲成色777777女色窝| 第一福利永久视频精品| 国内精品免费午夜毛片| 日韩电影视频免费| 精品香蕉一区二区三区| 色中色综合影院手机版在线观看| 91禁国产网站| 国产精品激情av在线播放| wwwwwwww亚洲| 国产视频一区在线| 久久久免费av| 欧美做受高潮1| 日韩资源在线观看| 狠狠做深爱婷婷久久综合一区| 欧美性色视频在线| 国精产品一区一区三区有限在线| 亚洲午夜精品久久久久久久久久久久| 亚洲欧洲一区二区三区久久| 亚洲另类激情图| 一本大道香蕉久在线播放29| 欧美精品国产精品日韩精品| 米奇精品一区二区三区在线观看| 国产精品久久婷婷六月丁香| 国产精品旅馆在线| 国产欧美在线看| 精品久久久久人成| 久热精品视频在线观看| 成人免费视频xnxx.com| 91成人国产在线观看| 亚洲欧美精品一区二区| 欧美二区在线播放| 亚洲白拍色综合图区| 欧洲成人在线观看| 亚洲精品福利在线观看| 亚洲高清在线观看| 国产精品久久久久99| 不卡中文字幕av| 欧美日韩性生活视频| 91精品视频在线看| 伊人一区二区三区久久精品| 黄色91在线观看| 精品国内产的精品视频在线观看| 亚洲一区二区福利| 国产有码一区二区| 国产精品日韩专区| 成人做爰www免费看视频网站| 97免费视频在线| 久久久av电影| 91色在线视频| 成人夜晚看av| 精品性高朝久久久久久久| 国产精品电影久久久久电影网| 91精品国产综合久久香蕉的用户体验| 国产一区av在线| 国产精品白丝av嫩草影院| 2018国产精品视频| 日韩视频免费在线观看| 中文字幕亚洲一区二区三区| 久久久国产一区二区| 最好看的2019年中文视频| 久久精品色欧美aⅴ一区二区| 亚洲精品456在线播放狼人| 黑人极品videos精品欧美裸| 91在线看www| 亚洲精品国产美女| 中文字幕在线成人| 欧美肥婆姓交大片| 一区二区三区无码高清视频| 亚洲图中文字幕| 欧美专区在线观看| 日本午夜人人精品| 久久婷婷国产麻豆91天堂| 日本高清视频一区| 国产亚洲人成网站在线观看| 亚洲欧美中文日韩在线| 久久久国产精品亚洲一区| 热久久99这里有精品| 91久久精品一区| 国产精品第2页| 日韩av电影国产| 热99精品只有里视频精品| 欧美区在线播放| 欧美激情二区三区| 久久天天躁狠狠躁老女人| 国产精品偷伦视频免费观看国产| 欧美人与物videos| 国产九九精品视频| 91久久精品国产91性色| 91精品国产91久久久久久吃药| 亚洲一区二区中文字幕| 亚洲色图五月天| 日韩欧美在线一区| 久久97精品久久久久久久不卡| 国产成人在线视频| 成人网在线视频| 国产欧美日韩丝袜精品一区| 91中文在线视频| 热久久免费视频精品| 午夜精品久久久久久久久久久久久| 57pao国产成人免费| 精品欧美国产一区二区三区| 国产色婷婷国产综合在线理论片a| 91在线视频成人| 国产97色在线|日韩| 亚洲精品美女在线观看播放| 亚洲精品视频在线播放| 久久综合色影院| 日韩有码在线电影| 38少妇精品导航| 国产女人18毛片水18精品| 日韩精品视频在线播放| 日韩免费在线电影| 98精品国产自产在线观看| 国产午夜精品全部视频播放| 66m—66摸成人免费视频| 国产精品久久久久不卡| 91人人爽人人爽人人精88v| 5252色成人免费视频| 国产在线观看精品| 97在线日本国产| 国产免费久久av| 亚洲免费一级电影| 热久久这里只有精品| 亚洲在线免费观看| 亚洲人成网7777777国产| 亚洲国产日韩精品在线| 久久久精品国产| 中文字幕久久精品| 国产精品福利在线观看网址| 精品国产一区二区在线| 一区二区三区国产在线观看| 亚洲成人网在线观看| 精品欧美一区二区三区| 青草成人免费视频| 久久久久一本一区二区青青蜜月| 18久久久久久| 欧美日韩亚洲天堂| 欧美极品少妇xxxxⅹ喷水|