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

首頁(yè) > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

Spring面向切面 --- AspectJ --- 簡(jiǎn)單使用

2019-11-14 21:03:09
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
SPRing面向切面 --- aspectJ --- 簡(jiǎn)單使用Spring面向切面 --- AspectJ --- 簡(jiǎn)單使用

昨天回復(fù)說(shuō)說(shuō)的時(shí)候突然寫下了下面的一段話:分享一下:

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

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

面向切面編程用到了動(dòng)態(tài)代理,感興趣的讀者可以參考我的日志:

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

1.AspectJ - AOP面向切面編程是面向?qū)ο蟮囊粋€(gè)補(bǔ)充

在保存用戶前添加一個(gè)日志,再加上時(shí)刻的記錄??傊?,就是方法前后加一點(diǎn)業(yè)務(wù)邏輯

新建資源庫(kù):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();            }}

上面的程序中,兩個(gè)類繼承了實(shí)現(xiàn)InvocationHandler接口的抽象類,

也可以說(shuō)是間接地實(shí)現(xiàn)了InvocationHandler接口;

聲明為UserService接口類型的service,

在循環(huán)中每一次接收Proxy.newProxyInstance方法的計(jì)算結(jié)果后就會(huì)改變它指向的對(duì)象。

運(yùn)行結(jié)果如下:

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

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

注解的方式實(shí)現(xiàn)AOP使用的是aspectj,aspectj是專門用來(lái)產(chǎn)生動(dòng)態(tài)代理的一個(gè)框架可以使用aspectj注解的方式實(shí)現(xiàn)spring的AOP,把這個(gè)邏輯織入到原來(lái)的邏輯里面去

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

在類上添加注解 @Aspect和 @Component,在方法上添加注解 @Before切入點(diǎn)語(yǔ)法 @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要加在對(duì)應(yīng)的實(shí)現(xiàn)類上,因?yàn)間etBean后要獲取這個(gè)對(duì)象

/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();    }}

運(yùn)行結(jié)果如下:

八月 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

術(shù)語(yǔ)解釋:JoinPoint:連接點(diǎn)、切入點(diǎn),在哪里把邏輯加進(jìn)區(qū)PointCut:JoinPoint的集合,可以一次性定義好多切入點(diǎn)Aspect:切面,切面類加進(jìn)去的邏輯可以認(rèn)為是一個(gè)切面Advice:在這個(gè)點(diǎn)上建議怎么辦,比如 @BeforeTarget:被織入邏輯的被代理對(duì)象Weave:織入

2.切面和通知切入點(diǎn):// 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也定義了自己的織入點(diǎn)語(yǔ)法,但是我們只要用AspectJ的語(yǔ)法就可以了

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

如果織入點(diǎn)表達(dá)式相同,可以定義Pointcut定義方法名接收織入點(diǎn)表達(dá)式的值,使用時(shí) @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();    }}

運(yùn)行結(jié)果如下:

八月 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

可以實(shí)現(xiàn)聲明式的異常管理,struts2已經(jīng)實(shí)現(xiàn)了聲明式的異常管理,這里略過(guò)通知執(zhí)行的先后順序

3.cglib如果被代理的類實(shí)現(xiàn)了接口,就會(huì)使用JDK自帶的Proxy和InvocationHandler來(lái)實(shí)現(xiàn)代理當(dāng)被代理的類沒有實(shí)現(xiàn)接口,它會(huì)用cglib直接操作二進(jìn)制碼的形式來(lái)產(chǎn)生代理的代碼引入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();    }}

運(yùn)行結(jié)果如下:

八月 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:從源碼視圖切換到設(shè)計(jì)視圖

在執(zhí)行UserService.save()時(shí),發(fā)現(xiàn)符合配置的切入點(diǎn)表達(dá)式對(duì)應(yīng)的是LogAspect.before(),于是先執(zhí)行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();    }}

運(yùn)行結(jié)果如下:

八月 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虛擬機(jī)參數(shù)中添加-Dcom.sun.management.jmxremote=true

如果修改配置文件,使用了自定義標(biāo)簽的jsp頁(yè)面,修改了注解,等等情況:還是要重啟服務(wù)器的

在方法內(nèi)部修改代碼,不用重啟服務(wù)器,這已經(jīng)是很大的便捷了,

有興趣的小伙伴們?nèi)パ芯抗δ芨鼜?qiáng)大的熱部署吧。。。。

目錄結(jié)構(gòu):

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

更多好文請(qǐng)關(guān)注:http://www.49028c.com/kodoyang/

>*_*<

kongdongyang

2014/8/31


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
免费黄色网页在线观看| 57pao成人国产永久免费| 中文字幕免费观看| 亚洲综合图片一区| 黄色免费观看视频网站| 成人免费不卡视频| 成人婷婷网色偷偷亚洲男人的天堂| 美女航空一级毛片在线播放| 日韩av不卡播放| 日本高清黄色片| 能看av的网址| 秋霞影院一区| av污在线观看| 9色porny自拍视频一区二区| 久久国产精品一区二区三区| 亚洲v天堂v手机在线| 亚洲免费在线播放| 亚洲精品tv久久久久久久久| 黄网网址免费| 在线观看免费网站黄| 日日摸夜夜添夜夜添毛片av| 波多野结衣之无限发射| 精品美女久久久久| 激情四射综合网| 欧美专区在线播放| 欧美猛少妇色xxxxx| 中文成人综合网| 天堂中文在线8| 国产高清精品一区二区| 亚洲中文字幕无码不卡电影| 色综合亚洲图丝熟| 香蕉大人久久国产成人av| 亚洲一级片在线播放| 亚洲欧美日本国产专区一区| 九九**精品视频免费播放| 中文字幕在线播放av| 日本50路肥熟bbw| 亚洲精品久久久中文字幕| 亚洲婷婷伊人| 波多野结衣爱爱| 久久精品国产精品亚洲精品| 国产福利在线看| 国产成人无码精品久在线观看| 99久久伊人久久99| 日韩激情文学| 一本大道av一区二区在线播放| 在线观看日本中文字幕| 欧美日韩人妻精品一区二区三区| 天天摸夜夜添狠狠添婷婷| 亚洲国产清纯| 大荫蒂欧美视频另类xxxx| 亚洲伊人网站| 久久se精品一区精品二区| 国产精品白丝av嫩草影院| 97精品视频在线观看自产线路二| 日韩天天综合| 绯色av一区二区| 高清av在线| 欧美残忍xxxx极端| 91丨porny丨在线中文| 老色鬼精品视频在线观看播放| 亚洲蜜桃精久久久久久久| 欧美疯狂做受xxxx富婆| 先锋资源一区二区| 免费一级在线观看播放网址| 99精品在免费线中文字幕网站一区| 9.1人成人免费视频网站| 国产sm精品调教视频网站| 九色91国产| 免费日韩一级片| 牛牛视频精品一区二区不卡| 国产农村妇女精品一区二区| 亚洲免费不卡| 国产免费观看久久| 一区二区不卡| 依依综合在线| 欧美草草影院在线视频| 成人在线免费观看av| 欧美xxx.com| 欧美wwwwwww| 国产成人自拍视频在线观看| 精品在线视频免费| 一区二区中文| 亚洲欧美视频一区| 欧美一区二区三区在线视频| 美国一级黄色录像| 91精品国产综合久久久久久丝袜| 91精品国产综合久久香蕉的特点| 国产精品99久久久久久有的能看| 宅男噜噜噜66一区二区| 美女在线观看视频一区二区| 五月婷婷激情网| 一本高清dvd不卡在线观看| 99国产精品一区二区| 国产精品香蕉一区二区三区| 欧美三级在线免费观看| 99re国产| 99久久精品日本一区二区免费| 欧美精产国品一二三区| 香蕉视频污视频| 黄色漫画在线免费看| 91精品麻豆日日躁夜夜躁| 91麻豆高清视频| 无码国产精品久久一区免费| 日韩在线中文字幕| 精品久久久久人成| 啄木系列成人av电影| 亚洲一区二区三区爽爽爽爽爽| 国产十六处破外女视频| 日韩视频免费在线观看| 精品日本一区二区三区在线观看| 色天使久久综合网天天| 好吊成人免视频| 欧美成人高潮一二区在线看| 三上悠亚作品在线观看| 东方aⅴ免费观看久久av| 在线观看国产免费视频| 欧美伊人久久久久久久久影院| 国产av一区二区三区传媒| 黑人极品videos精品欧美裸| 亚洲欧美在线第一页| a亚洲天堂av| 最新日韩免费视频| av在线导航| 欧美日韩亚州综合| 欧美性xxxx极品hd满灌| 在线观看特色大片免费视频| 91精品人妻一区二区三区| www在线看| 欧美xxxxxxxx| 一区二区三区四区五区| 懂色aⅴ精品一区二区三区蜜月| 国产精品v欧美精品v日本精品动漫| 日日干天夜夜| 欧美96在线| av在线app| 毛片中文字幕| 浮力国产第一页| 日韩视频在线观看免费| 给我看免费高清在线观看| 国产影视一区二区| 97超碰在线人人| 人妻与黑人一区二区三区| 俺去啦最新地址| 国产超级va在线视频| 国产做受69高潮| 操bbb操bbb| 91精品91久久久中77777老牛| 国产精品福利影院| 日韩美女爱爱视频| 精品欧美色视频网站在线观看| 奴色虐av一区二区三区| 日韩三级视频在线看| 中文字幕日韩欧美一区二区三区| 影音先锋中文在线观看| 精品日本一线二线三线不卡| 日本午夜精品一区二区| 欧美日韩午夜视频| 久久一日本道色综合久久| 久久精品视频在线免费观看| 久久久亚洲欧洲日产| 亚洲永久精品在线观看| 亚洲色图都市激情| 久久久久国产精品一区二区| 狠狠色噜噜狠狠狠| 欧美老女人性生活| 亚洲毛片在线观看| 丝袜a∨在线一区二区三区不卡| 日本理论片午伦夜理片在线观看| 免费不卡在线观看av| 精品在线视频免费观看| 97久久超碰国产精品电影| 亚洲欧美自拍一区| 日韩福利一区二区| 国产91丝袜在线观看| 一个人看的www日本高清视频| 四虎国产成人精品免费一女五男| 免费精品国产| 精品美女www爽爽爽视频| 99亚洲男女激情在线观看| 亚洲欧美高清视频| 91导航在线观看| 亚洲小说欧美另类婷婷| 欧美性极品少妇精品网站| 天堂av资源网| 久久国产精品亚洲77777| 8x海外华人永久免费日韩内陆视频| 国内精品福利视频| 国产精品成人aaaa在线| 国产欧美一区二区精品久导航| 美女亚洲一区| 欧美男体视频| 无码人妻久久一区二区三区| 性猛交ⅹ×××乱大交| 国产超碰91| 中文字幕欧美日韩一区二区| 91精品国自产在线偷拍蜜桃| 91国产精品| 国产99久久精品| 欧美日韩一区二区三区四区不卡| 日韩精品专区在线影院重磅| 天天影视天天精品| 成人动漫在线免费观看| 7788色淫网站小说| 久久av一区| 久久久久久青草| 日韩欧美高清| 女同性αv亚洲女同志| 亚洲大胆精品| 亚洲人成在线一二| 欧美在线短视频| 黑人巨大精品欧美一区| 99国产精品久久久久久久久久久| 国产欧洲在线| 欧美日韩精品一二三区| 亚洲成a人片在线观看中文| 欧美在线短视频| 日本高清不卡三区| 成人黄色免费视频| 欧美福利影院| 99视频在线免费| 欧美性极品xxxx娇小| 99热这里只有精品免费| 免费在线观看精品| 国产日韩v精品一区二区| 亚洲精品成a人ⅴ香蕉片| 亚洲va天堂va国产va久| 久久艹中文字幕| 成人a在线视频免费观看| 亚洲一区二区三区四区在线| 一区二区三区四区视频在线观看| 国产精品777777在线播放| 网站在线你懂的| 中文字幕第5页| 国产专区一区二区三区| 91精品国产91久久久久麻豆 主演| 欧美高清在线播放| 丝袜足控免费网站xx网站| 欧美多人爱爱视频网站| 天天做天天爱天天综合网| 91精品久久久久久久91蜜桃| 国产精品jvid在线观看蜜臀| 嫩草黄色影院| 久久久精品亚洲| 亚洲人精品午夜射精日韩| 国产一级黄色录像| 中文字幕一区二区三区免费视频| 激情六月婷婷综合| 激情视频在线观看一区二区三区| 日本免费不卡一区二区| 国产一区二区三区精彩视频| 亚洲v国产v欧美v久久久久久| 中出中文字幕| 亚洲18在线看污www麻豆| 日韩欧美黄色网址| 国内精品久久久久久99蜜桃| 国产精品白丝jk黑袜喷水| 日本色综合中文字幕| 国产精品乱码一区二区| 成人丝袜18视频在线观看| 国产精品久久久久久吹潮| 亚洲三级av| 成人av网站免费| wwwxxxx在线观看| 欧美日韩国产探花| 精品国产伦一区二区三区观看说明| 免费日韩中文字幕| 亚洲激情中文| 妺妺窝人体色www看人体| 九色成人免费视频| 黄色亚洲大片免费在线观看| 96sao精品免费视频观看| 蜜桃av一区二区三区| 三级影片在线观看欧美日韩一区二区| 天堂tv亚洲tv日本tv欧美人tv| 日韩欧美在线视频| 国产成人小视频在线观看| 亚洲色图国产精品| 91片在线免费观看| 999精品免费视频| 色婷婷一区二区三区| ass极品国模人体欣赏| 亚洲国产精品99| 日韩大陆av| 韩国在线视频一区| 91视频一区二区三区| 天天综合网久久综合网| 日本精品久久久久中文字幕| 99热这里只有精品7| 日韩精品在线网站| 国产日韩欧美激情| 欧美禁忌电影网| 先锋在线亚洲| www.av麻豆| 国产iv一区二区三区| 日韩美女一区二区三区| 久久久国产精品视频| 高清av一区二区| 日韩va亚洲va欧美va清高| 97se亚洲| 尤物在线免费视频| 国产香蕉精品视频一区二区三区| 日本a级片在线播放| 日韩精品四区| 蜜臀av午夜一区二区三区| 久久国产人妖系列| 亚洲香蕉伊综合在人在线视看| 无码人妻精品一区二区三区在线| 日本视频一区二区在线观看| 在线成人视屏| 亚洲一区三区视频在线观看| 成人欧美视频在线| 色婷婷久久久久swag精品| 国产乱子视频| 日韩欧美中文| 97超碰中文字幕| 中文另类视频| 看全色黄大色黄女片18| 插菊花综合1| 亚洲欧洲日产国码av系列天堂| 大桥未久av一区二区三区中文| 国产露脸91国语对白| 51视频国产精品一区二区| 欧美人xxx| 日韩一级性生活片| 免费观看视频www| 欧美一区二区福利在线| 黄色网址中文字幕|