日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Spring源碼解析之Configuration

瀏覽:180日期:2022-08-12 09:03:28
目錄一、@Configuration1.1 未加@Configuration1.2 加上@Configuration1.3 Cglib動態代理二、源碼跟蹤2.1 AnnotationConfigApplicationContext2.2 AnnotationConfigApplicationContext#AnnotationConfigApplicationContext(Class<?>... annotatedClasses)2.3 AbstractApplicationContext#refresh()2.4 AbstractApplicationContext#invokeBeanFactoryPostProcessors2.5 PostProcessorRegistrationDelegate#invokeBeanFactoryPostProcessors2.6 PostProcessorRegistrationDelegate#invokeBeanFactoryPostProcessors2.7 ConfigurationClassPostProcessor#postProcessBeanFactory2.8 ConfigurationClaassPostProcessor#enhanceConfigurationClasses2.9 ConfigurationClassUtils#checkConfigurationClassCandidate2.10 ConfigurationClassEnhancer#enhance2.11 ConfigurationClassEnhancer#newEnhancer2.12 ConfigurationClassEnhancer#CallBacks2.13 ConfigurationClassEnhancer#intercept2.13.1 ConfigurationClassEnhancer#isCurrentlyInvokedFactoryMethod2.14 ConfigurationClassEnhancer#resolveBeanReference三、總結一、@Configuration1.1 未加@Configuration

Spring源碼解析之Configuration

Spring源碼解析之Configuration

<!--logback-test.xml,配置不打印日志--><?xml version='1.0' encoding='UTF-8'?><configuration> <include resource='org/springframework/boot/logging/logback/base.xml' /> <logger name='org.springframework' level='OFF'/></configuration>

Spring源碼解析之Configuration

Spring源碼解析之Configuration

Spring源碼解析之Configuration

1.2 加上@Configuration

Spring源碼解析之Configuration

Spring源碼解析之Configuration

Spring源碼解析之Configuration

1.3 Cglib動態代理

Spring源碼解析之Configuration

Spring源碼解析之Configuration

二、源碼跟蹤2.1 AnnotationConfigApplicationContext

Spring源碼解析之Configuration

2.2 AnnotationConfigApplicationContext#AnnotationConfigApplicationContext(Class<?>... annotatedClasses)

Spring源碼解析之Configuration

2.3 AbstractApplicationContext#refresh()

@Overridepublic void refresh() throws BeansException, IllegalStateException {// 同步,線程安全; 防止 fresh還沒結束 就又進入改方法 導致容器初始化錯亂synchronized (this.startupShutdownMonitor) {// 準備刷新 記錄開始時間 設置幾個標志位 驗證環境屬性prepareRefresh(); // 告訴子類刷新內部bean工廠 創建BeanFactory 并且獲取BeanDefinition的定義信息/** *obtainFreshBeanFactory();方法 *解析為一個個beanDefinition 放在我們beanDefinitionMap中管理起來 * 1. refreshBeanFactory(); 核心方法 * AbstractRefreshableApplicationContext#refreshBeanFactory() * 創建DefaultListableBeanFactory 并設置屬性 * 加載BeanFactory; 根據不同的類型,調用不同的方法 * org.springframework.context.support.AbstractXmlApplicationContext#loadBeanDefinitions(org.springframework.beans.factory.support.DefaultListableBeanFactory) */ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory(); // 準備在這種情況下使用的bean工廠 向beanFactory中設置一些屬性 。對BeanFactory 進行各種功能填充prepareBeanFactory(beanFactory); try {// 允許在上下文 的子類中對bean工廠進行后處理 由子類去實現; 主要是自定義去使用postProcessBeanFactory(beanFactory); // 第5步 【BeanFactoryPostProcessors ;bean工廠后置處理器】調用我們的bean工廠后置處理器 (所有實現接口BeanFactoryPostProcessor接口的)//主要是// 會在此將class掃描成BeanDefinition 并注冊bean 到一個BeanDefinitionMap中 這個過程使用到代理//BeanFactoryPostProcessor 可以 用于容器完成初始化()// 此處可以 還沒有實例化Bean之前讀取Bean的信息,并作出一些修改。// 例如修改Bean的屬性,修改Bean的scope等invokeBeanFactoryPostProcessors(beanFactory); //https://blog.csdn.net/caihaijiang/article/details/35552859// 【BeanPostProcessors ;bean后置處理器】 注冊BeanPostProcessor// BeanPostProcessor是Bean的后置處理器,// 在Bean的初始化方法[InitializingBean 以及init-method]前,后執行。registerBeanPostProcessors(beanFactory); // 為上下文初始化Message 源, 即不同語言的消息體, 國際化處理 i18ninitMessageSource(); // 初始化事件傳播器//初始化應用消息廣播器, 并放入'applicationEventMulticaster' bean 中initApplicationEventMulticaster(); // 擴展的一個實現 ,留給子類來初始化其它的Bean。如springboot內嵌的tomcat在這個階段完成onRefresh(); // 注冊監聽器// 在所有注冊的bean 中查找Listener bean , 注冊到消息廣播報中registerListeners(); /**第11步對于非抽象類、非延遲初始化的單例bean,在spring容器啟動的時候調用getBean方法來實例化bean, 并進行相關初始化工作,getBean方法最終調用AbstractAutowireCapableBeanFactory.doCreateBean方法 */// 在創建BeanFactory的過程中,BeanDefinition注冊到了BeanFactory中的一個ConCurretHashMap對象中// 以BeanName為key,BeanDefinition為value ; 實例化所有剩余的(非延遲初始化)單例。finishBeanFactoryInitialization(beanFactory); // 第12步 最后一步:發布相應的事件。//完成刷新過程, 通知生命周期處現器lifecycleProcessor 刷新過程, 同時發出ContextRefreshEvent 通知別人finishRefresh();} catch (BeansException ex) {if (logger.isWarnEnabled()) {logger.warn('Exception encountered during context initialization - ' +'cancelling refresh attempt: ' + ex);} // 第13步 銷毀以創建的BeandestroyBeans(); //取消refresh操作,重置容器的同步標識cancelRefresh(ex); // Propagate exception to caller.throw ex;} finally {resetCommonCaches();}}}2.4 AbstractApplicationContext#invokeBeanFactoryPostProcessors

Spring源碼解析之Configuration

2.5 PostProcessorRegistrationDelegate#invokeBeanFactoryPostProcessors

public static void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory, List<BeanFactoryPostProcessor> beanFactoryPostProcessors) { Set<String> processedBeans = new HashSet<>(); // 對BeanDefinitionRegistry 類型的處理if (beanFactory instanceof BeanDefinitionRegistry) {BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory;List<BeanFactoryPostProcessor> regularPostProcessors = new ArrayList<>();// 用于存放BeanDefinitionRegistryPostProcessorList<BeanDefinitionRegistryPostProcessor> registryProcessors = new ArrayList<>(); // 遍歷所有的beanFactoryPostProcessors,將BeanDefinitionRegistryPostProcessor和普通BeanFactoryPostProcessor區分開for (BeanFactoryPostProcessor postProcessor : beanFactoryPostProcessors) {if (postProcessor instanceof BeanDefinitionRegistryPostProcessor) {BeanDefinitionRegistryPostProcessor registryProcessor =(BeanDefinitionRegistryPostProcessor) postProcessor;/**對于BeanDefinitionRegistryPostProcessor 類型, 在BeanFactoryPostProcessor 的基礎上還有自己定義的方法,需要先調用 */registryProcessor.postProcessBeanDefinitionRegistry(registry);registryProcessors.add(registryProcessor);}else {// 記錄常規BeanFactoryPostProcessorregularPostProcessors.add(postProcessor);}} /**不要在這里初始化FactoryBeans: 我們需要保留所有常規bean未初始化,讓bean工廠后處理器應用到它們!BeanDefinitionRegistryPostProcessors之間的分離實現排好序,點好,等等。獲取spring配置文件中定義的所有實現BeanFactoryPostProcessor接口的bean,然后根據優先級進行排序 */List<BeanDefinitionRegistryPostProcessor> currentRegistryProcessors = new ArrayList<>(); // 首先,調用實現優先排序的BeanDefinitionRegistryPostProcessorsString[] postProcessorNames =beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);for (String ppName : postProcessorNames) {// PriorityOrdered.class 優先排序if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));processedBeans.add(ppName);}}sortPostProcessors(currentRegistryProcessors, beanFactory);registryProcessors.addAll(currentRegistryProcessors);invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);currentRegistryProcessors.clear(); // 接下來,調用實現Ordered的BeanDefinitionRegistryPostProcessorspostProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);for (String ppName : postProcessorNames) {// Ordered.classif (!processedBeans.contains(ppName) && beanFactory.isTypeMatch(ppName, Ordered.class)) {currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));processedBeans.add(ppName);}}sortPostProcessors(currentRegistryProcessors, beanFactory);registryProcessors.addAll(currentRegistryProcessors);invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);currentRegistryProcessors.clear(); // Finally, invoke all other BeanDefinitionRegistryPostProcessors until no further ones appear.boolean reiterate = true;while (reiterate) {reiterate = false;postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);for (String ppName : postProcessorNames) {if (!processedBeans.contains(ppName)) {currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));processedBeans.add(ppName);reiterate = true;}}sortPostProcessors(currentRegistryProcessors, beanFactory);registryProcessors.addAll(currentRegistryProcessors);invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);currentRegistryProcessors.clear();} // Now, invoke the postProcessBeanFactory callback of all processors handled so far.// 調用ConfigurationClassPostProcessor#postProcessBeanFactory增強配置類// 通過cglib生成增強類// 設置beanDefinition的beanClass為增強類,讓@Bean生成的bean是單例invokeBeanFactoryPostProcessors(registryProcessors, beanFactory);invokeBeanFactoryPostProcessors(regularPostProcessors, beanFactory);} else {// Invoke factory processors registered with the context instance.invokeBeanFactoryPostProcessors(beanFactoryPostProcessors, beanFactory);} // BeanFactoryPostProcessor.class類型// Do not initialize FactoryBeans here: We need to leave all regular beans// uninitialized to let the bean factory post-processors apply to them!String[] postProcessorNames =beanFactory.getBeanNamesForType(BeanFactoryPostProcessor.class, true, false);// 篩選出bean工程中存在的所有實現BeanFactoryPostProcessor類的類名稱 // Separate between BeanFactoryPostProcessors that implement PriorityOrdered,// Ordered, and the rest.List<BeanFactoryPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();List<String> orderedPostProcessorNames = new ArrayList<>();List<String> nonOrderedPostProcessorNames = new ArrayList<>();for (String ppName : postProcessorNames) {if (processedBeans.contains(ppName)) {// skip - already processed in first phase above// 已經存在了,不再處理}else if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {// 為PriorityOrdered類型priorityOrderedPostProcessors.add(beanFactory.getBean(ppName, BeanFactoryPostProcessor.class));}else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {// 為Ordered類型orderedPostProcessorNames.add(ppName);}else {// 這個就是我們當前需要關心的PostProcessors//nonOrderedPostProcessors添加的不是bean實例,而是BeanDefinitionnonOrderedPostProcessorNames.add(ppName);}} // First, invoke the BeanFactoryPostProcessors that implement PriorityOrdered.sortPostProcessors(priorityOrderedPostProcessors, beanFactory);invokeBeanFactoryPostProcessors(priorityOrderedPostProcessors, beanFactory); // Next, invoke the BeanFactoryPostProcessors that implement Ordered.List<BeanFactoryPostProcessor> orderedPostProcessors = new ArrayList<>();for (String postProcessorName : orderedPostProcessorNames) {orderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));}sortPostProcessors(orderedPostProcessors, beanFactory);invokeBeanFactoryPostProcessors(orderedPostProcessors, beanFactory); // Finally, invoke all other BeanFactoryPostProcessors.List<BeanFactoryPostProcessor> nonOrderedPostProcessors = new ArrayList<>();for (String postProcessorName : nonOrderedPostProcessorNames) {nonOrderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));}invokeBeanFactoryPostProcessors(nonOrderedPostProcessors, beanFactory); // Clear cached merged bean definitions since the post-processors might have// modified the original metadata, e.g. replacing placeholders in values...beanFactory.clearMetadataCache();}2.6 PostProcessorRegistrationDelegate#invokeBeanFactoryPostProcessors

Spring源碼解析之Configuration

2.7 ConfigurationClassPostProcessor#postProcessBeanFactory

Spring源碼解析之Configuration

Spring源碼解析之Configuration

2.8 ConfigurationClaassPostProcessor#enhanceConfigurationClasses

public void enhanceConfigurationClasses(ConfigurableListableBeanFactory beanFactory) {Map<String, AbstractBeanDefinition> configBeanDefs = new LinkedHashMap<>();for (String beanName : beanFactory.getBeanDefinitionNames()) {BeanDefinition beanDef = beanFactory.getBeanDefinition(beanName);// 判斷是否是一個全注解類// 掃描是全注解類?full和lite的關系if (ConfigurationClassUtils.isFullConfigurationClass(beanDef)) {if (!(beanDef instanceof AbstractBeanDefinition)) {throw new BeanDefinitionStoreException('Cannot enhance @Configuration bean definition ’' +beanName + '’ since it is not stored in an AbstractBeanDefinition subclass');}else if (logger.isInfoEnabled() && beanFactory.containsSingleton(beanName)) {logger.info('Cannot enhance @Configuration bean definition ’' + beanName +'’ since its singleton instance has been created too early. The typical cause ' +'is a non-static @Bean method with a BeanDefinitionRegistryPostProcessor ' +'return type: Consider declaring such methods as ’static’.');}// 是全注解,需要代理,添加到configBeanDefs中configBeanDefs.put(beanName, (AbstractBeanDefinition) beanDef);}}if (configBeanDefs.isEmpty()) {// nothing to enhance -> return immediatelyreturn;} ConfigurationClassEnhancer enhancer = new ConfigurationClassEnhancer();// 遍歷這個mapfor (Map.Entry<String, AbstractBeanDefinition> entry : configBeanDefs.entrySet()) {AbstractBeanDefinition beanDef = entry.getValue();// If a @Configuration class gets proxied, always proxy the target classbeanDef.setAttribute(AutoProxyUtils.PRESERVE_TARGET_CLASS_ATTRIBUTE, Boolean.TRUE);try {// Set enhanced subclass of the user-specified bean classClass<?> configClass = beanDef.resolveBeanClass(this.beanClassLoader);if (configClass != null) {// 進行cglib代理,為@Configuration注解的類生成增強類Class<?> enhancedClass = enhancer.enhance(configClass, this.beanClassLoader);if (configClass != enhancedClass) {if (logger.isTraceEnabled()) {logger.trace(String.format('Replacing bean definition ’%s’ existing class ’%s’ with ' +'enhanced class ’%s’', entry.getKey(), configClass.getName(), enhancedClass.getName()));}// 再通過beanDef.setBeanClass(enhancedClass)修改beanDefinition的BeanClass屬性,// 在bean實例化階段,會利用反射技術將beanClass屬性對應的類實例化出來// 所以最終實例化出來的@Configuration bean是一個代理類的實例beanDef.setBeanClass(enhancedClass);}}}catch (Throwable ex) {throw new IllegalStateException('Cannot load configuration class: ' + beanDef.getBeanClassName(), ex);}}

Spring源碼解析之Configuration

2.9 ConfigurationClassUtils#checkConfigurationClassCandidate

Spring源碼解析之Configuration

Spring源碼解析之Configuration

Spring源碼解析之Configuration

1.在ConfigurationClassUtils類中的checkConfigurationClassCandidate標記是Full @Configuration還是lite @Bean mode

2.通過'full'.equals(configClassAttr)判斷是否是全類注解是全注解

3.則將beandefinition放入map中configBeanDefs.put

4.遍歷這個map

5.使用cglib技術為配置類生成一個enhancedClass

6.通過enhancer.enhance進行cglib代理,為@Configuration注解的類生成增強類

7.再通過beanDef.setBeanClass(enhancedClass)修改beanDefinition的BeanClass屬性,在bean實例化階段,會利用反射技術將beanClass屬性對應的類實例化出來,所以最終實例化出來的@Configuration bean是一個代理類的實例

使用了@Configuration注解的類,屬于Full @Configuration。@Configuration類允許通過調用同一類中的其他@Bean方法來定義bean之間的依賴關系,保證@Bean的對象作用域受到控制,避免多例。

@Configuration類中的@Bean地方會被CGLIB進行代理。Spring會攔截該方法的執行,在默認單例情況下,容器中只有一個Bean,所以我們多次調用user()方法,獲取的都是同一個對象。

對于@Configuration注解的類中@Bean標記的方法,返回的都是一個bean,在增強的方法中,Spring會先去容器中查看一下是否有這個bean的實例了,如果有了的話,就返回已有對象,沒有的話就創建一個,然后放到容器中。

2.10 ConfigurationClassEnhancer#enhance

Spring源碼解析之Configuration

2.11 ConfigurationClassEnhancer#newEnhancer

Spring源碼解析之Configuration

2.12 ConfigurationClassEnhancer#CallBacks

Spring源碼解析之Configuration

2.13 ConfigurationClassEnhancer#intercept

Spring源碼解析之Configuration

2.13.1 ConfigurationClassEnhancer#isCurrentlyInvokedFactoryMethod

Spring源碼解析之Configuration

2.14 ConfigurationClassEnhancer#resolveBeanReference

private Object resolveBeanReference(Method beanMethod, Object[] beanMethodArgs,ConfigurableBeanFactory beanFactory, String beanName) { // The user (i.e. not the factory) is requesting this bean through a call to// the bean method, direct or indirect. The bean may have already been marked// as ’in creation’ in certain autowiring scenarios; if so, temporarily set// the in-creation status to false in order to avoid an exception.// 判斷他是否正在創建boolean alreadyInCreation = beanFactory.isCurrentlyInCreation(beanName);try {if (alreadyInCreation) {beanFactory.setCurrentlyInCreation(beanName, false);}boolean useArgs = !ObjectUtils.isEmpty(beanMethodArgs);if (useArgs && beanFactory.isSingleton(beanName)) {// Stubbed null arguments just for reference purposes,// expecting them to be autowired for regular singleton references?// A safe assumption since @Bean singleton arguments cannot be optional...for (Object arg : beanMethodArgs) {if (arg == null) {useArgs = false;break;}}}Object beanInstance = (useArgs ? beanFactory.getBean(beanName, beanMethodArgs) :beanFactory.getBean(beanName));if (!ClassUtils.isAssignableValue(beanMethod.getReturnType(), beanInstance)) {// Detect package-protected NullBean instance through equals(null) checkif (beanInstance.equals(null)) {if (logger.isDebugEnabled()) {logger.debug(String.format('@Bean method %s.%s called as bean reference ' +'for type [%s] returned null bean; resolving to null value.',beanMethod.getDeclaringClass().getSimpleName(), beanMethod.getName(),beanMethod.getReturnType().getName()));}beanInstance = null;}else {String msg = String.format('@Bean method %s.%s called as bean reference ' +'for type [%s] but overridden by non-compatible bean instance of type [%s].',beanMethod.getDeclaringClass().getSimpleName(), beanMethod.getName(),beanMethod.getReturnType().getName(), beanInstance.getClass().getName());try {BeanDefinition beanDefinition = beanFactory.getMergedBeanDefinition(beanName);msg += ' Overriding bean of same name declared in: ' + beanDefinition.getResourceDescription();}catch (NoSuchBeanDefinitionException ex) {// Ignore - simply no detailed message then.}throw new IllegalStateException(msg);}}Method currentlyInvoked = SimpleInstantiationStrategy.getCurrentlyInvokedFactoryMethod();if (currentlyInvoked != null) {String outerBeanName = BeanAnnotationHelper.determineBeanNameFor(currentlyInvoked);beanFactory.registerDependentBean(beanName, outerBeanName);}return beanInstance;}finally {if (alreadyInCreation) {beanFactory.setCurrentlyInCreation(beanName, true);}}}三、總結 lite @Bean mode :當@Bean方法在沒有使用@Configuration注解的類中聲明時稱之為lite @Bean mode Full @Configuration:如果@Bean方法在使用@Configuration注解的類中聲明時稱之為Full @Configuration

Full @Configuration中的@Bean方法會被CGLIB所代理,而 lite @Bean mode中的@Bean方法不會被CGLIB代理

@Configuration注解作用

1.告訴spring這是一個配置類,相當于spring的xml配置文件

2.被@Configuration 注解的類,會被cglib代理進行增強

3.@Configuration類允許通過調用同一類中的其他@Bean方法來定義bean之間的依賴關系,保證@Bean的對象作用域受到控制,避免多例

@Configuration注解底層是如何實現的,通過源碼咱們可以反推并總結為以下幾點:

Spring源碼解析之Configuration

1.Spring首先會獲取到所有的beanDefenition

2.ConfigurationClassUtils類中checkConfigurationClassCandidate方法判斷是Full @Configuration還是lite @Bean mode

3.通過ConfigurationClassPostProcessor后置處理器遍歷所有的beanDefenition

4.將標記了Full @Configuration模式的beanDefenition,會對這個類進行cglib代理,生成一個代理類,并把這個類設置到BeanDefenition的Class屬性中

5.配置類會被CGLIB增強(生成代理對象),放進IoC容器內的是代理

6.對于內部類是沒有限制的:可以是Full模式或者Lite模式

7.配置類內部可以通過方法調用來處理依賴,并且能夠保證是同一個實例,都指向IoC內的那個單例

8.需要用這個Bean實例的時候,從這個Class屬性中拿到的Class對象進行反射,最終反射出來的是代理增強后的類

9.通過@Configuration標注類的Bean,Spring會先去容器中查看是否有這個Bean實例,如果有就返回已有的對象,沒有就創建一個,然后放到容器中

到此這篇關于Spring源碼解析之Configuration的文章就介紹到這了,更多相關Configuration源碼內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Spring
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产欧美丝祙| 人人爱人人干婷婷丁香亚洲| 久久精品xxxxx| 日韩av中文在线观看| 午夜天堂精品久久久久| 老牛国产精品一区的观看方式| 久久亚洲风情| 欧美日韩1区| 不卡专区在线| 性色一区二区| 国产精品极品| 日本在线高清| 日韩精品一二三区| 国产精品久久久久久久久免费高清 | 日韩中文字幕av电影| 中文字幕中文字幕精品| 国产日韩免费| 亚洲成人av观看| 日韩精品一级二级| 国产伦精品一区二区三区在线播放| 免费亚洲一区| 欧美精品一区二区三区精品| 日韩av一区二区在线影视| 久久一区亚洲| 亚洲在线免费| 97久久超碰| 给我免费播放日韩视频| 久久久久久免费视频| 综合激情网站| а√在线中文在线新版| 亚洲三级网站| 久久人人88| 久久精品国产福利| 亚洲精品国产日韩| 国产精品亚洲一区二区三区在线观看| 美女国产一区| 久久精品亚洲人成影院| 国产福利资源一区| 日韩精品一二三| 久久精品国语| 国产一区三区在线播放| 三级欧美在线一区| 日韩欧美自拍| 久久99精品久久久久久园产越南| 欧美在线资源| 91精品久久久久久久久久不卡| 国产欧美一区二区三区精品观看| 99精品99| 日韩中文视频| 成人片免费看| 精品资源在线| 国产精品一级在线观看| 免费欧美在线视频| 在线午夜精品| 日韩视频一区| 伊人久久大香线蕉av超碰演员| 狂野欧美性猛交xxxx| 欧美日韩一区自拍| 国产欧美亚洲一区| 国产探花在线精品| 日韩1区2区日韩1区2区| 国产丝袜一区| 麻豆国产精品一区二区三区| 美女久久久久久| 精品欧美视频| 欧美日韩中文一区二区| 久久久夜精品| 韩日一区二区| 91九色精品| 亚洲手机在线| 丝袜亚洲另类欧美| 狠狠操综合网| 日本免费一区二区视频| 国产福利亚洲| 欧美日韩视频免费观看| 亚洲激情五月| 国产日韩欧美三级| 97精品中文字幕| 在线综合视频| 国产精品一区二区av日韩在线| 国产精品啊v在线| 日本在线高清| 免费在线观看不卡| 牛牛精品成人免费视频| 欧美va亚洲va日韩∨a综合色| 亚洲免费观看高清完整版在线观| 亚洲一区二区三区无吗| 国产一区二区三区久久| 国产亚洲综合精品| 国产精品一区免费在线| 久久天堂精品| 国产精品一二| 国产麻豆综合| 天堂√中文最新版在线| 午夜电影一区| 激情婷婷亚洲| 国产成人免费av一区二区午夜| 中日韩男男gay无套| 精品视频在线观看网站| 蜜桃传媒麻豆第一区在线观看| 久久久久观看| 欧美综合二区| 日韩中文影院| 精品久久不卡| 欧美私人啪啪vps| 免费看日韩精品| 色婷婷精品视频| 精品国产美女a久久9999| 97精品国产99久久久久久免费| 宅男在线一区| 免费污视频在线一区| 久久中文在线| 国产精品久久久网站| 日韩一区精品| 热久久久久久久| 亚洲欧美日韩高清在线| 国产一区精品福利| 久久只有精品| 精品一二三区| 丁香婷婷久久| 欧美日韩在线观看首页| 正在播放日韩精品| 中文字幕色婷婷在线视频| 国产精品115| 欧美成人一二区| 日本久久精品| 性感美女一区二区在线观看| 日本蜜桃在线观看视频| 国产一区2区| zzzwww在线看片免费| 日本精品不卡| 婷婷激情一区| 亚洲一区日韩| 日韩在线观看中文字幕| 亚洲精品高潮| 国产激情久久| 日韩av免费| 日韩中文字幕麻豆| 国产欧美日韩在线一区二区| 欧美国产中文高清| 日韩国产在线| 日韩一区精品字幕| 国产日产一区| 国产91在线精品| 亚洲精品一区二区妖精| 亚洲精品高潮| 久久精品99国产精品| www在线观看黄色| 久热精品在线| 精品视频免费| 三级在线观看一区二区| 美女免费视频一区| 尤物tv在线精品| 国产毛片精品| 黄色精品网站| 国产成人精品一区二区三区在线| 不卡在线一区二区| 欧美三级第一页| 国产一区二区三区黄网站| 黄色精品网站| 国产一区调教| 久久亚洲电影| 午夜久久中文| 国产亚洲精品美女久久久久久久久久| 久久免费高清| 久久精品国产99国产精品| 亚洲综合日韩| 久久国产小视频| 精品三级在线| 日本亚洲最大的色成网站www| 久久久久久免费视频| 欧美国产中文高清| 亚洲五月综合| 午夜日韩av| 91精品精品| 91中文字幕精品永久在线| 国产综合精品| а√天堂8资源在线| 国产欧美日韩综合一区在线播放| 国产亚洲一级| 激情综合自拍| 99久久久久国产精品| 日本免费久久| 另类专区亚洲| 伊伊综合在线| 日韩av专区| 成人片免费看| 天堂а√在线最新版中文在线| 欧美激情三区| 麻豆成人91精品二区三区| 奇米色欧美一区二区三区| 亚洲一区中文| 免费在线看一区| 日韩高清电影免费| 欧美日本久久| 麻豆精品蜜桃视频网站| 精品亚洲a∨| 日韩欧美1区| 亚洲精华国产欧美| 美国三级日本三级久久99|