日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

spring生命周期_理解Spring应用上下文生命周期

發布時間:2023/12/19 javascript 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 spring生命周期_理解Spring应用上下文生命周期 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
  • Spring應用上下文啟動準備階段
  • `BeanFactory`創建階段
  • `BeanFactory`準備階段
  • `BeanFactory`后置處理階段
    • `AnnotationConfigServletWebApplicationContext#postProcessBeanFactory`
    • `AbstractApplicationContext#invokeBeanFactoryPostProcessors`
  • `BeanFactory`注冊`BeanPostProcessor`階段
  • 初始化內建Bean: `MessageSource`
  • 初始化內建Bean : Spring事件廣播器
  • Spring應用上下文刷新階段
  • Spring事件監聽器注冊階段
    • `getApplicationEventMulticaster`
    • `AbstractApplicationEventMulticaster#addApplicationListener`
  • `BeanFactory`初始化完成階段
    • 凍結配置
    • 初始化非延遲單例 Bean
  • Spring應用上下文刷新完成階段
    • 清除ResourceLoader緩存
    • 初始化LifecycleProcessor對象
    • 調用LifecycleProcessor#onRefresh方法
    • 發布Spring應用上下文已刷新事件
    • 向MBeanServer 托管Live Beans(JMX)
  • Spring應用上下文啟動階段
  • Spring應用上下文停止階段
  • Spring應用上下文關閉階段
    • `AbstractApplicationContext#doClose`
    • `removeShutdownHook`
  • 面試題
    • Spring應用上下文生命周期有哪些階段
    • Environment完整的生命周期
    • Spring應用上下文生命周期執行動作

Spring應用上下文生命周期

AbstractApplicationContext#refresh是Spring應用上下文生命周期的入口方法 @Overridepublic void refresh() throws BeansException, IllegalStateException {synchronized (this.startupShutdownMonitor) {// Prepare this context for refreshing.// Spring應用上下文啟動準備階段prepareRefresh();// Tell the subclass to refresh the internal bean factory.ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();// Prepare the bean factory for use in this context.prepareBeanFactory(beanFactory);try {// Allows post-processing of the bean factory in context subclasses.postProcessBeanFactory(beanFactory);// Invoke factory processors registered as beans in the context.invokeBeanFactoryPostProcessors(beanFactory);// Register bean processors that intercept bean creation.registerBeanPostProcessors(beanFactory);// Initialize message source for this context.initMessageSource();// Initialize event multicaster for this context.initApplicationEventMulticaster();// Initialize other special beans in specific context subclasses.onRefresh();// Check for listener beans and register them.registerListeners();// Instantiate all remaining (non-lazy-init) singletons.finishBeanFactoryInitialization(beanFactory);// Last step: publish corresponding event.finishRefresh();}catch (BeansException ex) {if (logger.isWarnEnabled()) {logger.warn("Exception encountered during context initialization - " +"cancelling refresh attempt: " + ex);}// Destroy already created singletons to avoid dangling resources.destroyBeans();// Reset 'active' flag.cancelRefresh(ex);// Propagate exception to caller.throw ex;}finally {// Reset common introspection caches in Spring's core, since we// might not ever need metadata for singleton beans anymore...resetCommonCaches();}}}

Spring應用上下文啟動準備階段

AbstractApplicationContext#prepareRefresh
/**
* Prepare this context for refreshing, setting its startup date and
* active flag as well as performing any initialization of property sources.
*/
protected void prepareRefresh() {
// Switch to active.
this.startupDate = System.currentTimeMillis();
this.closed.set(false);
this.active.set(true);
if (logger.isDebugEnabled()) {
if (logger.isTraceEnabled()) {
logger.trace("Refreshing " + this);
}
else {
logger.debug("Refreshing " + getDisplayName());
}
}
// Initialize any placeholder property sources in the context environment.
// 默認是空實現,供子類實現
initPropertySources();
// Validate that all properties marked as required are resolvable:
// see ConfigurablePropertyResolver#setRequiredProperties
getEnvironment().validateRequiredProperties();
// Store pre-refresh ApplicationListeners...
if (this.earlyApplicationListeners == null) {
this.earlyApplicationListeners = new LinkedHashSet<>(this.applicationListeners);
}
else {
// Reset local application listeners to pre-refresh state.
this.applicationListeners.clear();
this.applicationListeners.addAll(this.earlyApplicationListeners);
}
// Allow for the collection of early ApplicationEvents,
// to be published once the multicaster is available...
this.earlyApplicationEvents = new LinkedHashSet<>();
}
  • 啟動時間 startupDate
  • 狀態標識
    this.closed.set(false); this.active.set(true);
  • 初始化PropertySources
    空方法,供子類實現,通常會提早創建Environment
  • 檢驗Environment中必須屬性
  • 初始化事件監聽器集合
  • 初始化早期Spring事件集合

BeanFactory創建階段

AbstractApplicationContext#obtainFreshBeanFactory/*** Tell the subclass to refresh the internal bean factory.* @return the fresh BeanFactory instance* @see #refreshBeanFactory()* @see #getBeanFactory()*/protected ConfigurableListableBeanFactory obtainFreshBeanFactory() {refreshBeanFactory();// 返回BeanFactoryreturn getBeanFactory();}

AbstractRefreshableApplicationContext#refreshBeanFactory

/*** This implementation performs an actual refresh of this context's underlying* bean factory, shutting down the previous bean factory (if any) and* initializing a fresh bean factory for the next phase of the context's lifecycle.*/@Overrideprotected final void refreshBeanFactory() throws BeansException {// 判斷是否創建了BeanFactory ,是的話 銷毀Bean,關閉BeanFactoryif (hasBeanFactory()) {destroyBeans();closeBeanFactory();}try {// 創建BeanFactoryDefaultListableBeanFactory beanFactory = createBeanFactory();// 設置idbeanFactory.setSerializationId(getId());// 設置是否允許BeanDefinition 重復定義 , 設置是否允許循環依賴customizeBeanFactory(beanFactory);// 加載beanDefinitionloadBeanDefinitions(beanFactory);synchronized (this.beanFactoryMonitor) {this.beanFactory = beanFactory;}}catch (IOException ex) {throw new ApplicationContextException("I/O error parsing bean definition source for " + getDisplayName(), ex);}}
  • AbstractApplicationContext#obtainFreshBeanFactory
    • AbstractRefreshableApplicationContext#refreshBeanFactory
      • 如果BeanFactory已經創建好了,就關閉或銷毀BeanFactory
      • createBeanFactory()
      • beanFactory.setSerializationId
      • customizeBeanFactory(beanFactory)
        protected void customizeBeanFactory(DefaultListableBeanFactory beanFactory) {
        // 設置是否允許BeanDefinition 重復定義
        if (this.allowBeanDefinitionOverriding != null) {
        beanFactory.setAllowBeanDefinitionOverriding(this.allowBeanDefinitionOverriding);
        }
        // 設置是否允許循環依賴
        if (this.allowCircularReferences != null) {
        beanFactory.setAllowCircularReferences(this.allowCircularReferences);
        }
        }
      • loadBeanDefinitions(beanFactory)
        xml 、注解驅動上下文 的具體實現不同
    • getBeanFactory();

BeanFactory準備階段

/*** Configure the factory's standard context characteristics,* such as the context's ClassLoader and post-processors.* @param beanFactory the BeanFactory to configure*/protected void prepareBeanFactory(ConfigurableListableBeanFactory beanFactory) {// Tell the internal bean factory to use the context's class loader etc.// 關聯ClassLoader (給予xml的上下文之前沒有加載到bean class)beanFactory.setBeanClassLoader(getClassLoader());// 設置Bean表達式處理器beanFactory.setBeanExpressionResolver(new StandardBeanExpressionResolver(beanFactory.getBeanClassLoader()));// 添加PropertyEditorRegistrar(類型轉換)實現: ResourceEditorRegistrarbeanFactory.addPropertyEditorRegistrar(new ResourceEditorRegistrar(this, getEnvironment()));// Configure the bean factory with context callbacks.// 添加Aware回調接口 BeanPostProcessor實現 :ApplicationContextAwareProcessorbeanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this));// 忽略Aware接口作為依賴注入接口beanFactory.ignoreDependencyInterface(EnvironmentAware.class);beanFactory.ignoreDependencyInterface(EmbeddedValueResolverAware.class);beanFactory.ignoreDependencyInterface(ResourceLoaderAware.class);beanFactory.ignoreDependencyInterface(ApplicationEventPublisherAware.class);beanFactory.ignoreDependencyInterface(MessageSourceAware.class);beanFactory.ignoreDependencyInterface(ApplicationContextAware.class);// BeanFactory interface not registered as resolvable type in a plain factory.// MessageSource registered (and found for autowiring) as a bean.// 注冊ResolvableDependency對象beanFactory.registerResolvableDependency(BeanFactory.class, beanFactory);beanFactory.registerResolvableDependency(ResourceLoader.class, this);beanFactory.registerResolvableDependency(ApplicationEventPublisher.class, this);beanFactory.registerResolvableDependency(ApplicationContext.class, this);// Register early post-processor for detecting inner beans as ApplicationListeners.beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(this));// Detect a LoadTimeWeaver and prepare for weaving, if found.if (beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)) {beanFactory.addBeanPostProcessor(new LoadTimeWeaverAwareProcessor(beanFactory));// Set a temporary ClassLoader for type matching.beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader()));}// Register default environment beans.// 注冊單例對象 (environment相關)if (!beanFactory.containsLocalBean(ENVIRONMENT_BEAN_NAME)) {beanFactory.registerSingleton(ENVIRONMENT_BEAN_NAME, getEnvironment());}if (!beanFactory.containsLocalBean(SYSTEM_PROPERTIES_BEAN_NAME)) {beanFactory.registerSingleton(SYSTEM_PROPERTIES_BEAN_NAME, getEnvironment().getSystemProperties());}if (!beanFactory.containsLocalBean(SYSTEM_ENVIRONMENT_BEAN_NAME)) {beanFactory.registerSingleton(SYSTEM_ENVIRONMENT_BEAN_NAME, getEnvironment().getSystemEnvironment());}}

BeanFactory后置處理階段

// Allows post-processing of the bean factory in context subclasses. // 由子類實現postProcessBeanFactory(beanFactory);// Invoke factory processors registered as beans in the context.invokeBeanFactoryPostProcessors(beanFactory); AbstractApplicationContext#refreshprotected void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) {}/*** Instantiate and invoke all registered BeanFactoryPostProcessor beans,* respecting explicit order if given.* <p>Must be called before singleton instantiation.*/protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory) {PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors());// Detect a LoadTimeWeaver and prepare for weaving, if found in the meantime// (e.g. through an @Bean method registered by ConfigurationClassPostProcessor)if (beanFactory.getTempClassLoader() == null && beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)) {beanFactory.addBeanPostProcessor(new LoadTimeWeaverAwareProcessor(beanFactory));beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader()));}}

AnnotationConfigServletWebApplicationContext#postProcessBeanFactory

Servlet Web 注解驅動上下文的實現@Overrideprotected void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) { // 調用父類super.postProcessBeanFactory(beanFactory);if (!ObjectUtils.isEmpty(this.basePackages)) {this.scanner.scan(this.basePackages);}if (!this.annotatedClasses.isEmpty()) {this.reader.register(ClassUtils.toClassArray(this.annotatedClasses));}}

1.GenericWebApplicationContext#postProcessBeanFactory

/*** Register ServletContextAwareProcessor.* @see ServletContextAwareProcessor*/@Overrideprotected void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) {if (this.servletContext != null) {beanFactory.addBeanPostProcessor(new ServletContextAwareProcessor(this.servletContext));beanFactory.ignoreDependencyInterface(ServletContextAware.class);}WebApplicationContextUtils.registerWebApplicationScopes(beanFactory, this.servletContext);WebApplicationContextUtils.registerEnvironmentBeans(beanFactory, this.servletContext);}

WebApplicationContextUtils#registerWebApplicationScopes(org.springframework.beans.factory.config.ConfigurableListableBeanFactory, javax.servlet.ServletContext)

public static void registerWebApplicationScopes(ConfigurableListableBeanFactory beanFactory,@Nullable ServletContext sc) {// 注冊Scope// requestbeanFactory.registerScope(WebApplicationContext.SCOPE_REQUEST, new RequestScope());// sessionbeanFactory.registerScope(WebApplicationContext.SCOPE_SESSION, new SessionScope());if (sc != null) {// applicationServletContextScope appScope = new ServletContextScope(sc);beanFactory.registerScope(WebApplicationContext.SCOPE_APPLICATION, appScope);// Register as ServletContext attribute, for ContextCleanupListener to detect it. // 設置ServletContext Attributesc.setAttribute(ServletContextScope.class.getName(), appScope);}// 注冊ResolvableDependencybeanFactory.registerResolvableDependency(ServletRequest.class, new RequestObjectFactory());beanFactory.registerResolvableDependency(ServletResponse.class, new ResponseObjectFactory());beanFactory.registerResolvableDependency(HttpSession.class, new SessionObjectFactory());beanFactory.registerResolvableDependency(WebRequest.class, new WebRequestObjectFactory());if (jsfPresent) {FacesDependencyRegistrar.registerFacesDependencies(beanFactory);}}

WebApplicationContextUtils.registerEnvironmentBeans

注冊Servlet相關的Bean/*** Register web-specific environment beans ("contextParameters", "contextAttributes")* with the given BeanFactory, as used by the WebApplicationContext.* @param bf the BeanFactory to configure* @param sc the ServletContext that we're running within*/public static void registerEnvironmentBeans(ConfigurableListableBeanFactory bf, @Nullable ServletContext sc) {registerEnvironmentBeans(bf, sc, null);}public static void registerEnvironmentBeans(ConfigurableListableBeanFactory bf,@Nullable ServletContext servletContext, @Nullable ServletConfig servletConfig) {if (servletContext != null && !bf.containsBean(WebApplicationContext.SERVLET_CONTEXT_BEAN_NAME)) {bf.registerSingleton(WebApplicationContext.SERVLET_CONTEXT_BEAN_NAME, servletContext);}// servletConfig=nullif (servletConfig != null && !bf.containsBean(ConfigurableWebApplicationContext.SERVLET_CONFIG_BEAN_NAME)) {bf.registerSingleton(ConfigurableWebApplicationContext.SERVLET_CONFIG_BEAN_NAME, servletConfig);}if (!bf.containsBean(WebApplicationContext.CONTEXT_PARAMETERS_BEAN_NAME)) {Map<String, String> parameterMap = new HashMap<>();if (servletContext != null) {Enumeration<?> paramNameEnum = servletContext.getInitParameterNames();while (paramNameEnum.hasMoreElements()) {String paramName = (String) paramNameEnum.nextElement();parameterMap.put(paramName, servletContext.getInitParameter(paramName));}}if (servletConfig != null) {Enumeration<?> paramNameEnum = servletConfig.getInitParameterNames();while (paramNameEnum.hasMoreElements()) {String paramName = (String) paramNameEnum.nextElement();parameterMap.put(paramName, servletConfig.getInitParameter(paramName));}}bf.registerSingleton(WebApplicationContext.CONTEXT_PARAMETERS_BEAN_NAME,Collections.unmodifiableMap(parameterMap));}if (!bf.containsBean(WebApplicationContext.CONTEXT_ATTRIBUTES_BEAN_NAME)) {Map<String, Object> attributeMap = new HashMap<>();if (servletContext != null) {Enumeration<?> attrNameEnum = servletContext.getAttributeNames();while (attrNameEnum.hasMoreElements()) {String attrName = (String) attrNameEnum.nextElement();attributeMap.put(attrName, servletContext.getAttribute(attrName));}}bf.registerSingleton(WebApplicationContext.CONTEXT_ATTRIBUTES_BEAN_NAME,Collections.unmodifiableMap(attributeMap));}}

2.ClassPathBeanDefinitionScanner#scan

根據basePackages的內容加載、注冊BeanDefinitionpublic int scan(String... basePackages) {int beanCountAtScanStart = this.registry.getBeanDefinitionCount();doScan(basePackages);// Register annotation config processors, if necessary.if (this.includeAnnotationConfig) {AnnotationConfigUtils.registerAnnotationConfigProcessors(this.registry);}return (this.registry.getBeanDefinitionCount() - beanCountAtScanStart); }

AbstractApplicationContext#invokeBeanFactoryPostProcessors

protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory) {PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors());// Detect a LoadTimeWeaver and prepare for weaving, if found in the meantime// (e.g. through an @Bean method registered by ConfigurationClassPostProcessor)if (beanFactory.getTempClassLoader() == null && beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)) {beanFactory.addBeanPostProcessor(new LoadTimeWeaverAwareProcessor(beanFactory));beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader()));}}

PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors())

BeanFactoryPostProcessor回調public static void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory, List<BeanFactoryPostProcessor> beanFactoryPostProcessors) {// Invoke BeanDefinitionRegistryPostProcessors first, if any.Set<String> processedBeans = new HashSet<>();if (beanFactory instanceof BeanDefinitionRegistry) {BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory;List<BeanFactoryPostProcessor> regularPostProcessors = new ArrayList<>();List<BeanDefinitionRegistryPostProcessor> registryProcessors = new ArrayList<>();for (BeanFactoryPostProcessor postProcessor : beanFactoryPostProcessors) {// 先處理BeanDefinitionRegistryPostProcessorif (postProcessor instanceof BeanDefinitionRegistryPostProcessor) {BeanDefinitionRegistryPostProcessor registryProcessor =(BeanDefinitionRegistryPostProcessor) postProcessor;// 回調 registryProcessor.postProcessBeanDefinitionRegistry(registry);registryProcessors.add(registryProcessor);}else {regularPostProcessors.add(postProcessor);}}// Do not initialize FactoryBeans here: We need to leave all regular beans// uninitialized to let the bean factory post-processors apply to them!// Separate between BeanDefinitionRegistryPostProcessors that implement// PriorityOrdered, Ordered, and the rest.List<BeanDefinitionRegistryPostProcessor> currentRegistryProcessors = new ArrayList<>();// First, invoke the BeanDefinitionRegistryPostProcessors that implement PriorityOrdered.String[] postProcessorNames =beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);for (String ppName : postProcessorNames) {// BeanDefinitionRegistryPostProcessor PriorityOrderedif (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();// Next, invoke the BeanDefinitionRegistryPostProcessors that implement Ordered.postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);for (String ppName : postProcessorNames) {if (!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.invokeBeanFactoryPostProcessors(registryProcessors, beanFactory);invokeBeanFactoryPostProcessors(regularPostProcessors, beanFactory);}else {// Invoke factory processors registered with the context instance.invokeBeanFactoryPostProcessors(beanFactoryPostProcessors, beanFactory);}// 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);// 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)) {priorityOrderedPostProcessors.add(beanFactory.getBean(ppName, BeanFactoryPostProcessor.class));}else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {orderedPostProcessorNames.add(ppName);}else {nonOrderedPostProcessorNames.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<>(orderedPostProcessorNames.size());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<>(nonOrderedPostProcessorNames.size());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();}

BeanFactory注冊BeanPostProcessor階段

AbstractApplicationContext#registerBeanPostProcessors
主要涉及如下邏輯:
  • 注冊PriorityOrdered類型的BeanPostProcessorBeans
  • 注冊Ordered類型的BeanPostProcessorBeans
  • 注冊普通的BeanPostProcessor Beans
  • 注冊MergedBeanDefinitionPostProcessor Beanss
  • 注冊ApplicationListenerDetector對象
  • protected void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory) {PostProcessorRegistrationDelegate.registerBeanPostProcessors(beanFactory, this);}public static void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory, AbstractApplicationContext applicationContext) {// 獲取BeanPostProcessor Bean Name ListString[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false);// Register BeanPostProcessorChecker that logs an info message when// a bean is created during BeanPostProcessor instantiation, i.e. when// a bean is not eligible for getting processed by all BeanPostProcessors.int beanProcessorTargetCount = beanFactory.getBeanPostProcessorCount() + 1 + postProcessorNames.length;beanFactory.addBeanPostProcessor(new BeanPostProcessorChecker(beanFactory, beanProcessorTargetCount));// Separate between BeanPostProcessors that implement PriorityOrdered,// Ordered, and the rest.List<BeanPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();List<BeanPostProcessor> internalPostProcessors = new ArrayList<>();List<String> orderedPostProcessorNames = new ArrayList<>();List<String> nonOrderedPostProcessorNames = new ArrayList<>();for (String ppName : postProcessorNames) {if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {// 提前初始化BeanPostProcessor BeanBeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);priorityOrderedPostProcessors.add(pp);if (pp instanceof MergedBeanDefinitionPostProcessor) {internalPostProcessors.add(pp);}}else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {orderedPostProcessorNames.add(ppName);}else {nonOrderedPostProcessorNames.add(ppName);}}// First, register the BeanPostProcessors that implement PriorityOrdered.sortPostProcessors(priorityOrderedPostProcessors, beanFactory);registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors);// Next, register the BeanPostProcessors that implement Ordered.List<BeanPostProcessor> orderedPostProcessors = new ArrayList<>(orderedPostProcessorNames.size());for (String ppName : orderedPostProcessorNames) {BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);orderedPostProcessors.add(pp);if (pp instanceof MergedBeanDefinitionPostProcessor) {internalPostProcessors.add(pp);}}sortPostProcessors(orderedPostProcessors, beanFactory);registerBeanPostProcessors(beanFactory, orderedPostProcessors);// Now, register all regular BeanPostProcessors.List<BeanPostProcessor> nonOrderedPostProcessors = new ArrayList<>(nonOrderedPostProcessorNames.size());for (String ppName : nonOrderedPostProcessorNames) {BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);nonOrderedPostProcessors.add(pp);if (pp instanceof MergedBeanDefinitionPostProcessor) {internalPostProcessors.add(pp);}}registerBeanPostProcessors(beanFactory, nonOrderedPostProcessors);// Finally, re-register all internal BeanPostProcessors.sortPostProcessors(internalPostProcessors, beanFactory);registerBeanPostProcessors(beanFactory, internalPostProcessors);// Re-register post-processor for detecting inner beans as ApplicationListeners,// moving it to the end of the processor chain (for picking up proxies etc).beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext));}

    初始化內建Bean: MessageSource

    AbstractApplicationContext#initMessageSource protected void initMessageSource() {ConfigurableListableBeanFactory beanFactory = getBeanFactory();if (beanFactory.containsLocalBean(MESSAGE_SOURCE_BEAN_NAME)) {this.messageSource = beanFactory.getBean(MESSAGE_SOURCE_BEAN_NAME, MessageSource.class);// Make MessageSource aware of parent MessageSource.if (this.parent != null && this.messageSource instanceof HierarchicalMessageSource) {HierarchicalMessageSource hms = (HierarchicalMessageSource) this.messageSource;if (hms.getParentMessageSource() == null) {// Only set parent context as parent MessageSource if no parent MessageSource// registered already.hms.setParentMessageSource(getInternalParentMessageSource());}}if (logger.isTraceEnabled()) {logger.trace("Using MessageSource [" + this.messageSource + "]");}}else {// Use empty MessageSource to be able to accept getMessage calls.DelegatingMessageSource dms = new DelegatingMessageSource();dms.setParentMessageSource(getInternalParentMessageSource());this.messageSource = dms;beanFactory.registerSingleton(MESSAGE_SOURCE_BEAN_NAME, this.messageSource);if (logger.isTraceEnabled()) {logger.trace("No '" + MESSAGE_SOURCE_BEAN_NAME + "' bean, using [" + this.messageSource + "]");}}} 默認情況下會注冊一個DelegatingMessageSource 類型的MessageSource(國際化) singleton Bean

    初始化內建Bean : Spring事件廣播器

    ApplicationEventMulticaster在Spring應用上下文中必須存在

    protected void initApplicationEventMulticaster() {ConfigurableListableBeanFactory beanFactory = getBeanFactory();if (beanFactory.containsLocalBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME)) {this.applicationEventMulticaster =beanFactory.getBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, ApplicationEventMulticaster.class);if (logger.isTraceEnabled()) {logger.trace("Using ApplicationEventMulticaster [" + this.applicationEventMulticaster + "]");}}else {// 默認注冊SimpleApplicationEventMulticaster Beanthis.applicationEventMulticaster = new SimpleApplicationEventMulticaster Bean(beanFactory);beanFactory.registerSingleton(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, this.applicationEventMulticaster);if (logger.isTraceEnabled()) {logger.trace("No '" + APPLICATION_EVENT_MULTICASTER_BEAN_NAME + "' bean, using " +"[" + this.applicationEventMulticaster.getClass().getSimpleName() + "]");}}}

    Spring應用上下文刷新階段

    AbstractApplicationContext#onRefresh默認是空方法,供具體的上下文(Web應用)進行自定義擴展

    protected void onRefresh() throws BeansException {// For subclasses: do nothing by default.}

    Spring事件監聽器注冊階段

    protected void registerListeners() {// Register statically specified listeners first.// 1.添加當前Spring應用上下文關聯的ApplicationListener對象集合for (ApplicationListener<?> listener : getApplicationListeners()) {getApplicationEventMulticaster().addApplicationListener(listener);}// Do not initialize FactoryBeans here: We need to leave all regular beans// uninitialized to let post-processors apply to them!// 2. 添加 BeanFactory所注冊的ApplicationListener Beans// 這里不初始化Bean,延遲初始化String[] listenerBeanNames = getBeanNamesForType(ApplicationListener.class, true, false);for (String listenerBeanName : listenerBeanNames) {getApplicationEventMulticaster().addApplicationListenerBean(listenerBeanName);}// Publish early application events now that we finally have a multicaster...// 廣播早期Spring事件Set<ApplicationEvent> earlyEventsToProcess = this.earlyApplicationEvents;this.earlyApplicationEvents = null;if (earlyEventsToProcess != null) {for (ApplicationEvent earlyEvent : earlyEventsToProcess) {getApplicationEventMulticaster().multicastEvent(earlyEvent);}}}

    getApplicationEventMulticaster

    /*** Return the internal ApplicationEventMulticaster used by the context.* @return the internal ApplicationEventMulticaster (never {@code null})* @throws IllegalStateException if the context has not been initialized yet*/ApplicationEventMulticaster getApplicationEventMulticaster() throws IllegalStateException {if (this.applicationEventMulticaster == null) {throw new IllegalStateException("ApplicationEventMulticaster not initialized - " +"call 'refresh' before multicasting events via the context: " + this);}return this.applicationEventMulticaster;}

    AbstractApplicationEventMulticaster#addApplicationListener

    @Overridepublic void addApplicationListener(ApplicationListener<?> listener) {// 加鎖 保證多線程操作的原子性synchronized (this.retrievalMutex) {// Explicitly remove target for a proxy, if registered already,// in order to avoid double invocations of the same listener.Object singletonTarget = AopProxyUtils.getSingletonTarget(listener);if (singletonTarget instanceof ApplicationListener) {this.defaultRetriever.applicationListeners.remove(singletonTarget);}this.defaultRetriever.applicationListeners.add(listener);this.retrieverCache.clear();}}

    BeanFactory初始化完成階段

    /*** Finish the initialization of this context's bean factory,* initializing all remaining singleton beans.*/protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory) {// Initialize conversion service for this context.// BeanFactory 關聯 ConversionService Bean(如果存在)if (beanFactory.containsBean(CONVERSION_SERVICE_BEAN_NAME) &&beanFactory.isTypeMatch(CONVERSION_SERVICE_BEAN_NAME, ConversionService.class)) {beanFactory.setConversionService(beanFactory.getBean(CONVERSION_SERVICE_BEAN_NAME, ConversionService.class));}// Register a default embedded value resolver if no bean post-processor// (such as a PropertyPlaceholderConfigurer bean) registered any before:// at this point, primarily for resolution in annotation attribute values.// BeanFactory添加StringValueResolver對象if (!beanFactory.hasEmbeddedValueResolver()) {beanFactory.addEmbeddedValueResolver(strVal -> getEnvironment().resolvePlaceholders(strVal));}// Initialize LoadTimeWeaverAware beans early to allow for registering their transformers early.String[] weaverAwareNames = beanFactory.getBeanNamesForType(LoadTimeWeaverAware.class, false, false);for (String weaverAwareName : weaverAwareNames) {// 依賴查找LoadTimeWeaverAware BeangetBean(weaverAwareName);}// Stop using the temporary ClassLoader for type matching.// 將BeanFactory的臨時ClassLoader置為空beanFactory.setTempClassLoader(null);// Allow for caching all bean definition metadata, not expecting further changes.// BeanFactory凍結配置beanFactory.freezeConfiguration();// Instantiate all remaining (non-lazy-init) singletons.// 初始化非延遲單例 BeanbeanFactory.preInstantiateSingletons();}

    凍結配置

    DefaultListableBeanFactory@Overridepublic void freezeConfiguration() {this.configurationFrozen = true;// 凍結 不讓修改的beanDefinition 名稱this.frozenBeanDefinitionNames = StringUtils.toStringArray(this.beanDefinitionNames);}

    初始化非延遲單例 Bean

    @Overridepublic void preInstantiateSingletons() throws BeansException {if (logger.isTraceEnabled()) {logger.trace("Pre-instantiating singletons in " + this);}// Iterate over a copy to allow for init methods which in turn register new bean definitions.// While this may not be part of the regular factory bootstrap, it does otherwise work fine.List<String> beanNames = new ArrayList<>(this.beanDefinitionNames);// Trigger initialization of all non-lazy singleton beans...for (String beanName : beanNames) {// merged BeanDefinitonRootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) {if (isFactoryBean(beanName)) {Object bean = getBean(FACTORY_BEAN_PREFIX + beanName);if (bean instanceof FactoryBean) {final FactoryBean<?> factory = (FactoryBean<?>) bean;boolean isEagerInit;if (System.getSecurityManager() != null && factory instanceof SmartFactoryBean) {isEagerInit = AccessController.doPrivileged((PrivilegedAction<Boolean>)((SmartFactoryBean<?>) factory)::isEagerInit,getAccessControlContext());}else {isEagerInit = (factory instanceof SmartFactoryBean &&((SmartFactoryBean<?>) factory).isEagerInit());}if (isEagerInit) {getBean(beanName);}}}else {getBean(beanName);}}}// Trigger post-initialization callback for all applicable beans...for (String beanName : beanNames) {Object singletonInstance = getSingleton(beanName);if (singletonInstance instanceof SmartInitializingSingleton) {final SmartInitializingSingleton smartSingleton = (SmartInitializingSingleton) singletonInstance;if (System.getSecurityManager() != null) {AccessController.doPrivileged((PrivilegedAction<Object>) () -> {smartSingleton.afterSingletonsInstantiated();return null;}, getAccessControlContext());}else {smartSingleton.afterSingletonsInstantiated();}}}}

    SmartInitializingSingleton#afterSingletonsInstantiated

    回調

    Spring應用上下文刷新完成階段

    finishorg.springframework.context.support.AbstractApplicationContext#finishRefresh/*** Finish the refresh of this context, invoking the LifecycleProcessor's* onRefresh() method and publishing the* {@link org.springframework.context.event.ContextRefreshedEvent}.*/protected void finishRefresh() {// Clear context-level resource caches (such as ASM metadata from scanning).// 清除ResourceLoader緩存clearResourceCaches();// Initialize lifecycle processor for this context.// 初始化LifecycleProcessor對象initLifecycleProcessor();// Propagate refresh to lifecycle processor first.// 調用LifecycleProcessor.onrefresh方法getLifecycleProcessor().onRefresh();// Publish the final event.// 發布Spring應用上下文已刷新事件publishEvent(new ContextRefreshedEvent(this));// Participate in LiveBeansView MBean, if active.// 向MBeanServer 托管Live BeansLiveBeansView.registerApplicationContext(this);}

    清除ResourceLoader緩存

    private final Map<Class<?>, Map<Resource, ?>> resourceCaches = new ConcurrentHashMap<>(4);/*** Clear all resource caches in this resource loader.* @since 5.0* @see #getResourceCache*/public void clearResourceCaches() {this.resourceCaches.clear();}

    初始化LifecycleProcessor對象

    protected void initLifecycleProcessor() {ConfigurableListableBeanFactory beanFactory = getBeanFactory();if (beanFactory.containsLocalBean(LIFECYCLE_PROCESSOR_BEAN_NAME)) {this.lifecycleProcessor =beanFactory.getBean(LIFECYCLE_PROCESSOR_BEAN_NAME, LifecycleProcessor.class);if (logger.isTraceEnabled()) {logger.trace("Using LifecycleProcessor [" + this.lifecycleProcessor + "]");}}else {// 默認實現DefaultLifecycleProcessor defaultProcessor = new DefaultLifecycleProcessor();defaultProcessor.setBeanFactory(beanFactory);this.lifecycleProcessor = defaultProcessor;beanFactory.registerSingleton(LIFECYCLE_PROCESSOR_BEAN_NAME, this.lifecycleProcessor);if (logger.isTraceEnabled()) {logger.trace("No '" + LIFECYCLE_PROCESSOR_BEAN_NAME + "' bean, using " +"[" + this.lifecycleProcessor.getClass().getSimpleName() + "]");}}}

    調用LifecycleProcessor#onRefresh方法

    DefaultLifecycleProcessor#onRefresh@Overridepublic void onRefresh() {startBeans(true);this.running = true;} private void startBeans(boolean autoStartupOnly) {// 獲取Lifecycle BeansMap<String, Lifecycle> lifecycleBeans = getLifecycleBeans();Map<Integer, LifecycleGroup> phases = new HashMap<>();// 遍歷lifecycleBeans.forEach((beanName, bean) -> {// 不滿足條件if (!autoStartupOnly || (bean instanceof SmartLifecycle && ((SmartLifecycle) bean).isAutoStartup())) {int phase = getPhase(bean);LifecycleGroup group = phases.get(phase);if (group == null) {group = new LifecycleGroup(phase, this.timeoutPerShutdownPhase, lifecycleBeans, autoStartupOnly);phases.put(phase, group);}group.add(beanName, bean);}});if (!phases.isEmpty()) {List<Integer> keys = new ArrayList<>(phases.keySet());Collections.sort(keys);for (Integer key : keys) {phases.get(key).start();}}}

    發布Spring應用上下文已刷新事件

    廣播ContextRefreshedEvent事件AbstractApplicationContext#publishEvent
    下面的源碼就是之前說的ApplicationEventMulticaster給ApplicationEventPublisher(一般為Spring應用上下文)打工的故事protected void publishEvent(Object event, @Nullable ResolvableType eventType) {Assert.notNull(event, "Event must not be null");// Decorate event as an ApplicationEvent if necessaryApplicationEvent applicationEvent;if (event instanceof ApplicationEvent) {applicationEvent = (ApplicationEvent) event;}else {applicationEvent = new PayloadApplicationEvent<>(this, event);if (eventType == null) {eventType = ((PayloadApplicationEvent<?>) applicationEvent).getResolvableType();}}// Multicast right now if possible - or lazily once the multicaster is initializedif (this.earlyApplicationEvents != null) {this.earlyApplicationEvents.add(applicationEvent);}else {getApplicationEventMulticaster().multicastEvent(applicationEvent, eventType);}// Publish event via parent context as well...if (this.parent != null) {if (this.parent instanceof AbstractApplicationContext) {((AbstractApplicationContext) this.parent).publishEvent(event, eventType);}else {this.parent.publishEvent(event);}}}

    向MBeanServer 托管Live Beans(JMX)

    // LiveBeansView.registerApplicationContext static void registerApplicationContext(ConfigurableApplicationContext applicationContext) {// 獲取配置的mbeanDomainString mbeanDomain = applicationContext.getEnvironment().getProperty(MBEAN_DOMAIN_PROPERTY_NAME);if (mbeanDomain != null) {synchronized (applicationContexts) {if (applicationContexts.isEmpty()) {try {// MBeanServerMBeanServer server = ManagementFactory.getPlatformMBeanServer();applicationName = applicationContext.getApplicationName();server.registerMBean(new LiveBeansView(),new ObjectName(mbeanDomain, MBEAN_APPLICATION_KEY, applicationName));}catch (Throwable ex) {throw new ApplicationContextException("Failed to register LiveBeansView MBean", ex);}}applicationContexts.add(applicationContext);}}}

    Spring應用上下文啟動階段

    start 手動觸發 @Overridepublic void start() {getLifecycleProcessor().start();// 發布ContextStartedEvent事件publishEvent(new ContextStartedEvent ContextStartedEvent(this));}

    Spring應用上下文停止階段

    stop 手動觸發@Overridepublic void stop() {getLifecycleProcessor().stop();publishEvent(new ContextStoppedEvent(this));}

    當我們的Bean實現了LifeCycle接口時,調用Spring應用上下文的start/stop方法,Bean 的start方法和stop方法會隨之調用,這是對Spring上下文生命周期的補充,定義了一種全新的生命周期。

    public interface Lifecycle {void start();void stop();boolean isRunning(); }

    Spring應用上下文關閉階段

    close /** Synchronization monitor for the "refresh" and "destroy". */private final Object startupShutdownMonitor = new Object();@Overridepublic void close() {synchronized (this.startupShutdownMonitor) {doClose();// If we registered a JVM shutdown hook, we don't need it anymore now:// We've already explicitly closed the context.if (this.shutdownHook != null) {try {Runtime.getRuntime().removeShutdownHook(this.shutdownHook);}catch (IllegalStateException ex) {// ignore - VM is already shutting down}}}}

    AbstractApplicationContext#doClose

    /** Flag that indicates whether this context is currently active. */ private final AtomicBoolean active = new AtomicBoolean();/** Flag that indicates whether this context has been closed already. */ private final AtomicBoolean closed = new AtomicBoolean();protected void doClose() {// Check whether an actual close attempt is necessary...if (this.active.get() && this.closed.compareAndSet(false, true)) {// 撤銷JMX對Spring Bean的托管LiveBeansView.unregisterApplicationContext(this);try {// Publish shutdown event.// 發布ContextClosedEvent事件publishEvent(new ContextClosedEvent(this));}catch (Throwable ex) {...}// Stop all Lifecycle beans, to avoid delays during individual destruction.if (this.lifecycleProcessor != null) {try {this.lifecycleProcessor.onClose();}catch (Throwable ex) {...}}// Destroy all cached singletons in the context's BeanFactory.destroyBeans();// Close the state of this context itself.closeBeanFactory();// Let subclasses do some final clean-up if they wish...onClose();// Reset local application listeners to pre-refresh state.if (this.earlyApplicationListeners != null) {this.applicationListeners.clear();this.applicationListeners.addAll(this.earlyApplicationListeners);}// Switch to inactive.this.active.set(false);}}

    destroyBeans

    protected void destroyBeans() {getBeanFactory().destroySingletons(); }

    closeBeanFactory

    removeShutdownHook

    優雅宕機

    總結

    以上是生活随笔為你收集整理的spring生命周期_理解Spring应用上下文生命周期的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    国产视频在线观看一区 | 国产流白浆高潮在线观看 | 久久综合桃花 | 久久夜色精品国产欧美乱极品 | 天天爽综合网 | 久爱综合 | 亚洲欧美一区二区三区孕妇写真 | 久二影院 | 国产亚洲精品精品精品 | 久草精品视频在线看网站免费 | 精品亚洲va在线va天堂资源站 | 国产九色91 | 五月天色综合 | 在线观看亚洲电影 | www.精选视频.com | 国产精品午夜在线 | 久久免费视频3 | 久久经典国产视频 | 日韩专区在线播放 | 午夜性盈盈 | 福利网址在线观看 | 国产精品色在线 | 欧美孕妇视频 | 精品视频网站 | 亚洲国产最新 | 欧美日韩国产一二 | 亚洲一区二区高潮无套美女 | 在线观看免费黄视频 | 中文字幕亚洲欧美日韩2019 | 激情五月婷婷综合网 | 97超碰资源 | 亚洲片在线 | 久久久久久97三级 | 日韩特黄一级欧美毛片特黄 | 99亚洲精品视频 | 国产精品久久久久久五月尺 | 精品美女久久 | 开心丁香婷婷深爱五月 | 国产福利在线免费 | 天天射天天 | 激情五月婷婷激情 | 国产尤物在线观看 | 99产精品成人啪免费网站 | 欧美日韩中字 | 欧美在线视频a | 狠狠综合网 | 91漂亮少妇露脸在线播放 | 手机在线黄色网址 | 中文字幕av免费在线观看 | 成人久久毛片 | 91大神精品视频 | 国产精品 日韩 欧美 | 手机在线看a | 国产a视频免费观看 | 胖bbbb搡bbbb擦bbbb | 亚洲精品国产品国语在线 | 国产福利小视频在线 | 蜜臀aⅴ国产精品久久久国产 | 久久精品视频网 | 国产小视频在线看 | 免费成人在线观看视频 | 九九99 | 成人国产精品久久久春色 | 国产精品精品国产婷婷这里av | 日韩午夜高清 | 91免费观看视频网站 | 国产成人精品网站 | 久久精品亚洲国产 | 丰满少妇麻豆av | 91九色在线视频 | 91看片在线播放 | 91传媒激情理伦片 | 国产91av视频在线观看 | 国产无套一区二区三区久久 | 国产日韩一区在线 | 国内精品美女在线观看 | 免费的黄色av | 国产亚洲欧美日韩高清 | 国产男男gay做爰 | 99热最新在线 | 丁香在线视频 | 日韩在线观看一区二区三区 | 欧美日韩在线看 | av免费黄色 | 日韩最新在线视频 | 天天狠狠 | 日韩电影在线观看中文字幕 | 草樱av| 国产午夜精品福利视频 | 国产日女人| 成人教育av | 伊人天天干 | 黄a在线观看 | 国产又粗又猛又黄 | 久久99国产综合精品免费 | 国产日韩精品久久 | 天天天天天天天操 | 欧美日韩首页 | 久久九九精品 | 亚洲国产精品日韩 | 成年人三级网站 | 高清有码中文字幕 | 国产白浆在线观看 | 国产国语在线 | www国产亚洲| 在线观看麻豆av | 国产伦精品一区二区三区无广告 | 久久精品国产免费看久久精品 | 黄色片视频在线观看 | 久久免费视频1 | 中文字幕高清有码 | 日韩免费不卡av | 久久久av电影 | 不卡中文字幕在线 | 成人免费视频视频在线观看 免费 | 国产理论免费 | 欧美一级片在线免费观看 | av大片网址 | 国产又粗又猛又黄又爽 | 在线国产欧美 | 国产精品k频道 | 精品96久久久久久中文字幕无 | 国产中文字幕精品 | 日韩免费电影一区二区 | 天天色视频 | 欧美成人理伦片 | 国产精品1区2区3区在线观看 | 97超碰在 | 国产精品xxxx18a99 | 国产精品18久久久久久久久 | 日韩av黄 | 国产精品福利一区 | 久久66热这里只有精品 | 最近中文字幕免费大全 | 99精品热视频只有精品10 | 中文在线最新版天堂 | a色视频 | 国产九色在线播放九色 | 韩国av在线播放 | 99精品在线视频观看 | av片一区| 99爱在线 | 日韩精品在线观看视频 | 免费亚洲黄色 | 日韩在线国产 | 国产精品一区二区久久精品 | 美女免费视频一区 | 日韩电影在线观看一区二区三区 | 狠狠色丁香九九婷婷综合五月 | 久草在线网址 | 日韩免费电影一区二区 | 久久久久久久久久免费视频 | 69视频永久免费观看 | 日韩精品免费一区二区 | 欧美日韩在线免费观看视频 | 日韩精品一区二区三区第95 | 黄色一级性片 | 在线观看亚洲精品视频 | 久久久久久免费网 | 夜夜躁日日躁狠狠久久88av | 91在线观看欧美日韩 | 岛国片在线 | 日韩中文字幕一区 | 国产一区二区三区免费观看视频 | 狠狠干美女 | 狠狠操.com| 国产黄色视 | 精品国产一区二区三区四区vr | 一本一道久久a久久精品蜜桃 | 日日干天天射 | 超碰97国产在线 | 四虎影视成人 | 一区二区三区免费网站 | 91亚洲在线观看 | 久久九九视频 | 免费看污在线观看 | 色在线亚洲 | 亚洲精品中文在线 | 中文成人字幕 | 一区二区视频在线免费观看 | 黄色av电影在线 | 视频一区二区精品 | 99视频在线免费观看 | 国产97视频在线 | 草莓视频在线观看免费观看 | 国内精品久久久久影院一蜜桃 | 精品视频在线看 | 精品国产1区2区3区 国产欧美精品在线观看 | 国产精品手机在线播放 | 天无日天天操天天干 | 青青久草在线视频 | 久久久久电影网站 | 超碰最新网址 | 中文字幕婷婷 | 五月婷网 | 四虎影视成人永久免费观看视频 | 日本黄色大片免费 | 99免费在线视频 | 久久经典国产 | 玖玖在线播放 | 中文字幕免费久久 | 国产精品一区二区美女视频免费看 | 中文字幕色在线视频 | 少妇高潮流白浆在线观看 | 国产精品日韩欧美 | 中文字幕av电影下载 | 精品视频免费 | 国产成人精品免高潮在线观看 | 黄色精品一区二区 | 毛片一区二区 | 亚洲精品1区2区3区 超碰成人网 | 国产一区二区精品久久 | 国产福利91精品一区二区三区 | 91网站在线视频 | 欧美久久影院 | 在线播放 日韩专区 | 六月婷操 | 久久av网址| 一区二区电影在线观看 | 国产资源免费在线观看 | 日韩综合一区二区 | 激情影音先锋 | 日韩精品中文字幕在线观看 | 中文字幕网站视频在线 | 日韩一区在线免费观看 | 久艹视频在线免费观看 | 激情久久综合网 | 国产在线视频导航 | www.com操| 久久久久这里只有精品 | 国产成人一区二区三区 | 久草在| 99久久999久久久精玫瑰 | 精品国产一区二区三区久久久蜜臀 | 欧美人人 | 成人av在线资源 | 国产96精品 | 国产精品午夜av | 伊色综合久久之综合久久 | 免费看黄的视频 | 精品久久久影院 | 国产免费视频一区二区裸体 | 国产在线无 | 日韩精品视频免费专区在线播放 | 日韩视频一二三区 | a视频在线看 | 国产一区二区高清 | 91午夜精品 | 精品欧美乱码久久久久久 | 黄色av免费在线 | 91精品国产99久久久久久久 | 狠狠狠狠狠狠狠狠干 | 精品资源在线 | 日韩视频一区二区三区 | 国产精品mv在线观看 | 欧美日韩国产一二 | 毛片网站免费 | 99久久久国产精品免费观看 | 999精品网| 在线电影 一区 | www.久久爱.cn| 五月婷婷在线观看 | 免费黄色在线网址 | 成人国产精品久久久久久亚洲 | 免费在线观看a v | 夜夜操天天摸 | 中文av资源站| 久久综合九色综合久99 | 午夜成人免费电影 | 97理论电影 | 久久精品二区 | 麻豆视频一区二区 | 日韩av一区二区在线播放 | 国内精品久久影院 | www.av免费 | 色 免费观看 | 99re国产| 丁香久久综合 | 久久一区二区三区日韩 | 高清国产午夜精品久久久久久 | 日韩精品视频免费专区在线播放 | 91色国产在线 | 国产美女免费观看 | 国产一区免费观看 | 区一区二在线 | 在线观看 亚洲 | 黄在线 | 久久精品九色 | 在线看成人 | 中文字幕在线不卡国产视频 | 福利电影一区二区 | 999在线观看视频 | 天天射天天操天天色 | 精品黄色在线 | 亚洲精品综合一二三区在线观看 | 欧美日韩精品在线观看 | 国产欧美综合在线观看 | 2024av| a级国产乱理论片在线观看 特级毛片在线观看 | 五月天久久精品 | 久久久精品欧美 | 国产中文字幕在线观看 | 99精品在线视频播放 | 91看毛片| 国产日产精品一区二区三区四区 | 又湿又紧又大又爽a视频国产 | 久久成人视屏 | 日韩中文免费视频 | 免费三级网 | 久久九九久久 | 人人要人人澡人人爽人人dvd | 国产一区二区三区 在线 | bayu135国产精品视频 | 国产录像在线观看 | 综合网成人 | 99九九99九九九视频精品 | 精品久久久久久亚洲综合网 | 久久久亚洲精品 | 精品一区久久 | 国产一区在线视频观看 | av电影一区二区三区 | 亚洲婷婷综合色高清在线 | 五月天婷亚洲天综合网鲁鲁鲁 | 91精品啪啪 | 亚洲精品99久久久久中文字幕 | 国产99久久九九精品免费 | 国产精品成人国产乱 | 国内免费久久久久久久久久久 | 久草视频免费播放 | 精品国产成人在线影院 | 日韩a级黄色片 | 香蕉视频18| 日韩av免费在线电影 | 国产99中文字幕 | www视频在线播放 | 97天天干| 五月婷网 | 天天天干天天射天天天操 | 久久综合九色综合网站 | 欧美日韩一区二区久久 | 黄网站www| 久久99精品国产99久久 | 欧美性性网 | www.午夜视频| 成人a在线观看高清电影 | 成人免费在线视频 | 久久久受www免费人成 | 91高清免费| 亚洲国产精品久久久久久 | 国产原创av在线 | 婷婷久操| 中文字幕亚洲在线观看 | 成人一级| 激情久久一区二区三区 | 91插插插网站 | 国产精品久久久久久久久久妇女 | 中文在线www | 欧美在线视频一区二区三区 | 国产成人精品av久久 | 欧洲一区二区三区精品 | 亚洲成a人片77777kkkk1在线观看 | 亚洲欧美国产精品久久久久 | 国产 在线观看 | 久久久午夜精品福利内容 | 日韩欧美一区二区三区视频 | 精品视频97 | 亚洲精品美女久久久久网站 | 婷婷久草 | 午夜精品一区二区三区可下载 | 色之综合网 | 99久久婷婷国产综合亚洲 | 四虎影视www | 欧美日韩一区二区在线观看 | 成人动漫一区二区三区 | 日本护士三级少妇三级999 | 激情影音先锋 | 久久国产精品免费 | 久久国语 | 99精品乱码国产在线观看 | 日韩国产精品久久久久久亚洲 | 韩国av免费在线 | 91热爆在线观看 | 久久96国产精品久久99软件 | 国产资源中文字幕 | 日韩视频免费观看高清完整版在线 | 精品国产一二三 | www一起操 | 成人夜晚看av | 天堂av在线7 | 国产不卡av在线 | 日韩成人免费电影 | 又大又硬又黄又爽视频在线观看 | 一区二区三区 中文字幕 | 伊人五月天.com | 亚洲欧美国产精品18p | 国产精品女主播一区二区三区 | 国产网红在线 | 色婷婷久久| 欧美日韩国产在线观看 | 国产在线a免费观看 | 高清视频一区二区三区 | 色婷婷www | 免费av在线网站 | 国产成人福利在线观看 | 国产免费观看久久黄 | 国产1区2区3区在线 亚洲自拍偷拍色图 | 国产成a人亚洲精v品在线观看 | 国产在线资源 | 一个色综合网站 | 色在线亚洲| 玖玖在线观看视频 | 五月婷婷综合网 | 天天操人 | 成人网444ppp | 在线国产专区 | 久久久久亚洲最大xxxx | 天天草综合 | 五月天综合色激情 | 一区二区中文字幕在线播放 | 久久夜色精品国产欧美乱 | av在线播放快速免费阴 | 一区二区三区电影大全 | 在线亚洲小视频 | 中文在线 | 国产丝袜高跟 | 久久精国产 | 911久久| 亚洲va欧美va人人爽 | 99 色| 欧美一级艳片视频免费观看 | 久久视频一区二区 | 久草久热| 国产在线观看a | 国产精品久久久久久久午夜片 | 免费色视频网址 | 粉嫩aⅴ一区二区三区 | 国产中文字幕在线免费观看 | 91福利社在线观看 | 综合色久 | 成人一级视频在线观看 | 狠狠色综合网站久久久久久久 | 香蕉视频在线网站 | 色婷婷亚洲 | 久久久久久久久久网站 | 狠狠干2018 | 美女免费电影 | 日韩高清一区在线 | 操一草 | 婷婷综合久久 | 日本三级中文字幕在线观看 | 国产特级毛片aaaaaa | 欧美三级免费 | 99福利片 | 久久精久久精 | 成年人免费看的视频 | 欧美一级性生活 | 国产精品第10页 | 日韩中文字幕视频在线观看 | 91精品老司机久久一区啪 | 最近能播放的中文字幕 | 69精品在线 | 日韩大片在线播放 | 99re在线视频观看 | 国产视频二区三区 | 国产视频亚洲视频 | 天天干天天搞天天射 | 69国产盗摄一区二区三区五区 | 伊人伊成久久人综合网小说 | 免费日韩 精品中文字幕视频在线 | 天天摸天天干天天操天天射 | 18岁免费看片 | 久久爱资源网 | 激情图片久久 | 国产精品国产三级国产 | 99在线热播精品免费 | 91在线视频观看免费 | 麻豆传媒视频在线播放 | 高清av影院| 亚洲视频免费在线看 | 国产精品理论片在线观看 | 午夜精品久久久久久久久久 | 成人免费观看大片 | 中文字幕亚洲欧美日韩2019 | 欧美大片大全 | aaa毛片视频 | 亚洲精品日韩av | 97人人爽人人 | 网站在线观看日韩 | 黄网站色视频 | 亚洲欧洲xxxx | 亚洲精品大全 | 亚洲精品国产免费 | 日韩在线视频播放 | 四虎成人免费影院 | 国产亚洲va综合人人澡精品 | 亚洲精品国产精品久久99热 | 免费在线观看av片 | 久久天| 日日爱夜夜爱 | 五月开心综合 | 激情五月婷婷综合网 | 国产欧美精品xxxx另类 | 免费观看的av | 91片黄在线观看动漫 | 一本—道久久a久久精品蜜桃 | 免费av一级电影 | 91在线www| 日黄网站| 五月婷婷色播 | 亚洲欧洲成人 | 久久国产一区二区三区 | 91精品一区国产高清在线gif | 日韩精品视频免费专区在线播放 | 中文字幕在线久一本久 | 99久久精品午夜一区二区小说 | 天天爽天天爽夜夜爽 | 亚洲精品免费在线视频 | 免费在线一区二区三区 | 国产又粗又猛又色又黄视频 | 97精品国自产拍在线观看 | 国产精品久久一区二区无卡 | 在线91观看| 欧美精品一二三 | 亚洲精品1区2区3区 超碰成人网 | 国产成人一区二区三区在线观看 | 韩日av一区二区 | 亚洲va在线va天堂va偷拍 | 国产精品久久久久aaaa | www.色午夜| 国产一区视频在线观看免费 | 女人高潮特级毛片 | 天天曰天天 | 91av在线免费 | 亚洲精品视频一 | 亚洲aⅴ久久精品 | 91精品国产自产91精品 | 99精品国产成人一区二区 | 久精品在线观看 | 免费看色视频 | 国产私拍在线 | 国产精品国内免费一区二区三区 | 亚洲最大在线视频 | 五月天狠狠操 | 九九综合久久 | 日本少妇视频 | 国产亚洲久久 | 天天看天天操 | 国产亚洲视频系列 | 日本中文字幕网 | 国产成人免费在线观看 | 免费高清在线视频一区· | 丁香花在线观看视频在线 | 色婷婷导航 | 成人国产电影在线观看 | 国产在线精 | 2020天天干天天操 | 天天色图 | 日韩精品视 | 美女网站在线 | 久久成人人人人精品欧 | 日本视频高清 | 99热都是精品 | 五月婷婷免费 | 欧美午夜精品久久久久久孕妇 | 国产剧情一区二区 | 欧美男同视频网站 | 国产精品毛片一区视频播不卡 | 狠狠色伊人亚洲综合网站野外 | 香蕉精品在线观看 | 日韩av美女 | 国产精品一区欧美 | 九九在线高清精品视频 | 久久精品一二三 | 丁香婷婷电影 | 成人影视免费 | 国产91成人| 精品一区二区三区四区在线 | 狠狠婷婷 | 黄色免费在线视频 | 亚洲最新av在线网址 | 韩日在线一区 | 500部大龄熟乱视频 欧美日本三级 | 五月天综合网 | 日韩精品一区二区三区免费视频观看 | 久久五月网 | 国产在线第三页 | 日韩成人看片 | 亚洲综合五月 | 国产原创在线 | 91久草视频 | 五月婷婷六月丁香在线观看 | 日韩视频在线观看免费 | 天天色婷婷 | 久久少妇av| 一级黄色片在线播放 | www久久精品 | 欧美视频在线观看免费网址 | 色五月成人 | 人人干网站| 久视频在线播放 | 91大神dom调教在线观看 | 免费大片黄在线 | 国产精品视频最多的网站 | 国产精品一区久久久久 | 在线观看网站你懂的 | 国产精品网站 | 亚洲精品在线观看网站 | 最新日韩在线观看视频 | 国产伦精品一区二区三区无广告 | 综合色亚洲| 国产午夜一区二区 | 久久日韩精品 | 国产免费又粗又猛又爽 | 91精品伦理| 日日久视频| 国产女人18毛片水真多18精品 | 色婷婷99| 国产精品免费不卡 | 成人动漫视频在线 | 久久精品观看 | 亚洲综合在线观看视频 | 国产精品美女久久久久久网站 | 97精品久久人人爽人人爽 | 亚洲日韩欧美一区二区在线 | 久久天天拍 | 美女视频久久黄 | 欧美一级免费片 | 成人毛片在线视频 | 天天草天天摸 | 又长又大又黑又粗欧美 | 亚洲热久久 | 91在线视频观看免费 | 免费在线电影网址大全 | 91香蕉久久 | 五月婷婷.com | 免费日韩视 | 国产网红在线观看 | 91黄色在线视频 | 在线观看黄色av | 亚洲综合黄色 | 97电影在线看视频 | 黄色成年片 | 国产做aⅴ在线视频播放 | 香蕉视频在线免费看 | 最新av中文字幕 | 中文字幕在线高清 | 色婷婷激情网 | 香蕉视频在线网站 | 国产在线不卡精品 | 亚洲成人软件 | 国产成人精品aaa | 国产成人久久精品77777综合 | 在线 你懂 | 婷婷视频在线播放 | 又黄又刺激视频 | 日本中文不卡 | 日本久久久影视 | 在线免费观看黄色av | 91在线一区二区 | 久久夜色电影 | 美女精品在线 | 日韩一区二区三区在线观看 | 人人射人人插 | 永久免费的av电影 | 亚洲一区二区视频在线播放 | 色99网 | 欧美日韩国产精品一区二区 | 免费高清在线观看成人 | 在线观看中文字幕av | 91欧美国产 | 国产亚州精品视频 | 韩国精品在线 | 久草视频在线新免费 | 精品国产成人在线 | 国产成人一区二区三区影院在线 | 91视频久久久久久 | 精品久操| 99久久夜色精品国产亚洲 | 成年人免费在线看 | 不卡视频在线 | 成人福利在线观看 | 国产精品久久久网站 | 免费能看的av | 91九色成人蝌蚪首页 | 日韩一区正在播放 | 欧美一级性 | 亚洲 中文 欧美 日韩vr 在线 | 国产精品中文字幕在线观看 | av韩国在线 | 97色国产| 国产91精品一区二区麻豆亚洲 | 一级黄色a视频 | 三级av网| av在线免费在线 | 国产精品爽爽爽 | 91精品国产九九九久久久亚洲 | 91麻豆精品国产91久久久久久久久 | 国产一区精品在线观看 | 中国一级特黄毛片大片久久 | 国产免费又爽又刺激在线观看 | 午夜精品久久久久久久99 | 国产高清视频色在线www | 国产 日韩 中文字幕 | 欧美日韩不卡在线观看 | 粉嫩av一区二区三区四区在线观看 | 国产一区二区高清不卡 | 中文字幕日韩一区二区三区不卡 | 精品uu| 天天干天天操天天做 | 国产男女爽爽爽免费视频 | 国产美女在线免费观看 | 成人理论电影 | 五月综合激情婷婷 | 久久精品看片 | 成人久久18免费网站麻豆 | 水蜜桃亚洲一二三四在线 | 麻豆国产精品va在线观看不卡 | 999久久久久 | 国产在线精品福利 | 精品美女久久久久久免费 | 一区二区视频免费在线观看 | 97超碰香蕉 | 久久久亚洲电影 | 91伊人久久大香线蕉蜜芽人口 | 欧美黄色高清 | 麻豆传媒电影在线观看 | 欧美日韩亚洲在线观看 | 午夜av影院 | 久草在线播放视频 | 欧美精品久久久久久久久老牛影院 | 欧美a性 | 一级欧美黄 | 日韩av不卡在线播放 | 六月丁香久久 | 在线韩国电影免费观影完整版 | 国产欧美精品一区aⅴ影院 99视频国产精品免费观看 | 欧美一级日韩免费不卡 | 天天干天天天天 | 黄色aaa级片 | 中文字幕一区二区三区四区久久 | 国产精品久久久久久久久大全 | 99在线免费视频观看 | 成人在线免费av | 99久久99视频| 国产精品第十页 | 500部大龄熟乱视频 欧美日本三级 | 日日干美女 | 日日夜夜人人精品 | www.久久色.com| 日韩免费视频观看 | 99在线免费观看视频 | 国产精品自拍在线 | 国产精品 亚洲精品 | av片在线看 | 91九色蝌蚪视频 | 91av在线播放 | 黄色软件在线观看免费 | 97国产大学生情侣酒店的特点 | 91一区二区三区久久久久国产乱 | 国产一区精品在线观看 | 99精品国产兔费观看久久99 | 中日韩三级视频 | 五月天久久综合 | 久草在线免费资源 | 国产aaa免费视频 | 久久久黄视频 | 亚洲精品男人的天堂 | 五月天天天操 | 国产精品国产亚洲精品看不卡 | 99r在线播放| 97操操| 日韩一二区在线 | www日韩在线观看 | 涩涩网站在线播放 | 又黄又爽的视频在线观看网站 | 日韩精品在线看 | 成人国产一区二区 | 天天干天天拍天天操 | 国产精品一区二区视频 | 在线成人一区 | 二区中文字幕 | 国产视频亚洲精品 | 天堂视频中文在线 | 国产在线观看免 | 麻豆视频国产 | 96久久欧美麻豆网站 | 成人黄色短片 | 亚洲国产精品人久久电影 | 精品日韩在线一区 | 久久这里只有精品视频99 | 国产h在线观看 | 久久免费视频在线观看6 | 91精选在线观看 | 美女网站视频免费黄 | 中文字幕传媒 | 成人毛片a | 国产一区久久 | 久久福利剧场 | 一区二区三区在线视频观看58 | 亚洲精品国偷自产在线99热 | 99视频在线 | 99视频精品 | 中文字幕4 | 在线免费av网 | 日韩影视在线 | 日韩av在线免费播放 | 久久丁香网 | 久久久久久久久电影 | 国内成人精品2018免费看 | 国产黄色一级大片 | 黄色av在 | 成人三级黄色 | 一级欧美黄 | 天天干天天射天天操 | 制服丝袜欧美 | 丁香五月亚洲综合在线 | av久久在线| 亚洲综合精品在线 | 国产精品久久久久9999 | 午夜精品久久久久久久久久久久 | 日韩高清不卡在线 | 在线观看av免费观看 | 国产黄色成人av | 国产视频一级 | 亚洲人xxx | 国产高清不卡一区二区三区 | 00av视频 | 99免费在线观看视频 | 99re6热在线精品视频 | 国产精品日韩在线观看 | 在线观看 国产 | 永久免费毛片在线观看 | 成人免费一级 | 午夜.dj高清免费观看视频 | 免费亚洲视频 | 国产精品久久久久久久毛片 | 精品91视频 | 国产999视频在线观看 | 在线观看 亚洲 | 国产精品理论在线观看 | 九九热精品视频在线观看 | 国产精品毛片一区 | 国产黄色片免费观看 | 麻豆91在线播放 | 国产日产精品一区二区三区四区的观看方式 | 91.dizhi永久地址最新 | 国产手机在线观看视频 | 日本xxxxav| 成人久久18免费网站 | 久99久在线视频 | 国产群p视频| 久久国产精品色av免费看 | 色噜噜日韩精品欧美一区二区 | 免费一级片在线 | 91mv.cool在线观看 | 亚洲午夜电影网 | 欧美日韩国产精品一区二区亚洲 | 亚洲视屏一区 | 在线 视频 一区二区 | 日韩经典一区二区三区 | 99精品国产在热久久下载 | 国产精品孕妇 | 国产又粗又猛又色 | 免费色网站 | 日韩成人免费在线 | 成人中文字幕av | 黄色精品视频 | 亚洲综合欧美日韩狠狠色 | 国产精品欧美一区二区三区不卡 | 91麻豆精品国产91久久久更新时间 | 中文字幕日本电影 | 国产午夜精品久久久久久久久久 | 久久久视频在线 | 国产精品手机在线 | 中文字幕日韩在线播放 | 国产亚洲视频在线免费观看 | 亚洲免费观看视频 | 亚洲精品综合在线 | 国产精品一区二区久久精品 | 国产99久久久久久免费看 | 波多野结衣视频网址 | 亚洲精品综合一区二区 | a久久免费视频 | 国产午夜精品久久久久久久久久 | 久久国产精品99精国产 | 91精品国产高清自在线观看 | 色99中文字幕 | 91九色蝌蚪在线 | 少妇bbbb| 日日干影院 | 国产精品久久久久免费观看 | 激情五月***国产精品 | 日韩中文在线观看 | 欧美在线日韩在线 | 中文字幕影片免费在线观看 | 亚洲国产日本 | 国产一区免费看 | 成片免费观看视频大全 | 精品99在线视频 | av丝袜美腿 | 久久人操| 久久一区二区三区国产精品 | 91亚洲视频在线观看 | 亚洲天堂网视频在线观看 | 五月激情电影 | 视频在线观看91 | 免费高清在线一区 | 国产精品扒开做爽爽的视频 | 国产精品久久久久一区二区 | 亚洲aⅴ在线 | 九九热免费在线观看 | 人人干人人添 | 国产手机视频精品 | 五月婷在线 | 久久精品国产免费看久久精品 | 在线看小早川怜子av | 久热电影 | 欧美一区中文字幕 | 色婷婷激情四射 | 天天色天天操综合网 | 日韩欧美视频免费在线观看 | 天天综合天天综合 | 黄色成年网站 | 美女福利视频网 | 日本黄色大片儿 | 国产精品网站一区二区三区 | 成人黄性视频 | 国产亚洲免费的视频看 | 欧洲一区精品 | 久久成人福利 | 天天干,狠狠干 | 在线看成人 | 操碰av| 久久黄色片子 | 欧美精品日韩 | 91精品国产自产在线观看 | 色五丁香| 国产一区二区三区四区大秀 | 久久久久久看片 | av中文字幕日韩 | 精品国产免费看 | av高清免费 | 国产麻豆视频免费观看 | 国产精品av在线免费观看 | 一区二区三区韩国免费中文网站 | 日日干,天天干 | 久久精品视频在线观看 | 久久久久久久免费观看 | 久久调教视频 | 激情网色 | 婷婷在线不卡 | 99看视频在线观看 | 天天综合人人 | 久久精品一区 | 91高清视频 | 91理论电影| 亚洲电影久久 | 国产在线观看a | 99爱国产精品 | 久久综合给合久久狠狠色 | 中文高清av | 婷婷色网视频在线播放 | 中文字幕在线视频网站 | 99这里只有精品99 | 日韩大片在线免费观看 | 九九热在线视频免费观看 | 亚洲精品在线免费观看视频 | 久久久久久久久久久久久久免费看 | 国产成人三级三级三级97 | 欧美a√大片 | 黄色软件视频网站 | 久久精品国产美女 | 亚洲国产激情 | 91麻豆精品国产自产在线 | 日本高清xxxx | 91麻豆精品国产91久久久无需广告 | 色无五月 | 韩日精品在线 | 97在线成人| 中文字幕婷婷 | 亚洲精品国产成人av在线 | 亚洲精品在线免费观看视频 | 粉嫩av一区二区三区免费 | 亚洲视频 中文字幕 | 97视频在线免费观看 | 精品99在线视频 | 国产乱对白刺激视频不卡 | 福利视频 | 狠狠色丁香婷婷综合久久片 | 91在线看 | 国产精品免费观看国产网曝瓜 | 91网站在线视频 | 91最新视频| 日韩在线高清免费视频 | 4438全国亚洲精品在线观看视频 | 精品免费观看 | 中文免费在线观看 | 国产va在线观看免费 |