日韩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应用上下文生命周期的全部內容,希望文章能夠幫你解決所遇到的問題。

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

    亚洲区视频在线观看 | 看av在线| 日韩免费视频 | 成人免费大片黄在线播放 | 五月婷婷在线观看视频 | 久久成人一区二区 | 999久久久国产精品 高清av免费观看 | 久久视奸 | 国产尤物一区二区三区 | 国产精品久久久999 国产91九色视频 | 欧美精品久久久久a | 激情综合交 | 99国产在线 | 日韩中文字幕电影 | 久久综合电影 | 国产精品一区二区三区在线 | 在线观看av不卡 | 久久99深爱久久99精品 | 99视频免费看 | 亚洲最快最全在线视频 | 久久99亚洲精品久久久久 | 99久久99久久精品 | 97精品一区 | 久久精品伊人 | 亚州精品天堂中文字幕 | 日本久久久久 | 久久国产精品免费一区 | 日本在线视频一区二区三区 | 久久精品专区 | 激情婷婷综合网 | 日韩av电影国产 | 天天综合天天做 | 97成人资源站 | 欧美日韩国产二区三区 | 亚洲精品麻豆视频 | 97超碰香蕉 | 美国av大片 | 国产高清在线观看av | 综合久久久 | 99色视频 | 欧美日韩中文在线观看 | 欧美久久久一区二区三区 | 日本深夜福利视频 | 国产日韩欧美视频 | 亚洲老妇xxxxxx | 激情丁香综合 | 国产一区二区三区午夜 | 日本久久久久久久久久 | 亚洲a免费 | 欧美日韩久久不卡 | 久久综合中文字幕 | 成人免费一级片 | 亚洲精品99久久久久中文字幕 | 黄色大片日本免费大片 | 久久亚洲二区 | 91精品国自产在线偷拍蜜桃 | 国产精品99久久久久人中文网介绍 | 久久精品99国产精品日本 | 日韩国产精品久久 | 日韩一级片观看 | 最近日韩中文字幕中文 | 国产视频在线观看免费 | av免费高清观看 | 欧美成人亚洲成人 | 免费高清在线观看成人 | 国产美女免费视频 | 国产亚洲人成网站在线观看 | 国产福利久久 | 91毛片在线观看 | 99re6热在线精品视频 | 亚洲精品午夜久久久久久久久久久 | 国产精品手机看片 | 伊人超碰在线 | 女人18片毛片90分钟 | 91传媒在线看 | 高清av免费观看 | 国产一区二区久久精品 | 亚洲电影黄色 | 99久久精品久久久久久清纯 | 国产午夜精品一区 | 国产精品扒开做爽爽的视频 | 国产品久精国精产拍 | 99视频在线免费观看 | 天天玩天天干天天操 | 国产视频精品免费 | 天天干夜夜干 | 欧美性精品 | 日韩精品一区二区不卡 | 色com网 | 97福利社| 婷婷夜夜 | 国产精品一区二区三区99 | 欧美极品一区二区三区 | 99色免费视频 | 91麻豆精品91久久久久同性 | 成人av在线网 | 精品国产一区二区三区蜜臀 | 97电影院网 | 久久综合免费视频影院 | 久久不射电影院 | 在线 影视 一区 | 免费又黄又爽的视频 | 亚洲高清视频一区二区三区 | 97色婷婷人人爽人人 | 三上悠亚一区二区在线观看 | 久久在现视频 | 韩国精品一区二区三区六区色诱 | 91九色精品| 麻豆国产露脸在线观看 | 国产.精品.日韩.另类.中文.在线.播放 | 91传媒在线观看 | 免费精品 | 91xav| 精品久久国产 | 国产精品网站 | 一区二区三区三区在线 | 亚洲一区二区天堂 | 精品美女在线视频 | av不卡网站 | 97视频免费在线看 | 国产二区av | 久久福利小视频 | 亚洲视频999| 99在线国产| 日韩免费观看视频 | 奇米网444| 在线国产视频 | 精品国产一区二区三区免费 | 中文字幕在线视频免费播放 | 五月综合在线观看 | 美女视频免费精品 | 中文在线字幕观看电影 | 日本激情中文字幕 | 色噜噜日韩精品一区二区三区视频 | 久久久免费看 | 免费福利视频网 | 在线天堂中文在线资源网 | 国产黄色观看 | 国产手机在线视频 | 500部大龄熟乱视频 欧美日本三级 | 亚洲高清视频在线观看免费 | 亚洲男人天堂a | 色香蕉在线视频 | 欧美一级艳片视频免费观看 | 四虎影视国产精品免费久久 | 99久久er热在这里只有精品15 | 激情综合五月婷婷 | www.av免费| 日韩美女黄色片 | 欧美亚洲免费在线一区 | 福利一区在线 | 日本三级国产 | 91一区在线观看 | 日韩视频一 | 午夜视频99 | 国产精品99久久久久久武松影视 | 69av网| 一区二区三区精品在线视频 | 日本99热 | 日韩激情久久 | 人人插人人艹 | 天堂av官网 | 中文字幕在线免费 | 国产在线资源 | 日韩高清毛片 | 99久久爱| 96久久| 婷婷色网站 | 99看视频在线观看 | 久久精品3 | 亚洲精品播放 | 国产一级大片在线观看 | 黄色大片免费网站 | 欧美精品久久久久久久久久丰满 | 免费日韩一区二区三区 | 日韩在线观看三区 | 一区二区久久 | 亚洲精品视频二区 | 亚洲视频网站在线观看 | 91在线视频 | 成人免费观看视频大全 | 午夜精品av | 欧美 激情在线 | 色免费在线| 亚洲国产精品久久久久婷婷884 | 久久久久久亚洲精品 | 91热精品 | 欧美精品中文 | 国产黄免费看 | 国产在线视频资源 | 国产激情久久久 | 欧美日韩亚洲一 | 中文字幕美女免费在线 | 日韩色爱| 色五月情| 9ⅰ精品久久久久久久久中文字幕 | 99热在线国产精品 | h视频在线看 | 婷婷日日| 国产精品免费在线播放 | 国内精品久久久久影院日本资源 | 国产一级久久久 | av在线h | 一本一道久久a久久精品 | 国产欧美日韩视频 | 黄色av在 | 免费中文字幕在线观看 | www99精品 | 日本精品一区二区三区在线播放视频 | 国产成人一区二区三区电影 | 国产不卡免费 | 国产精品久久久久久久久久三级 | 91桃色免费视频 | 日韩av一区二区三区在线观看 | 午夜精品麻豆 | 午夜一级免费电影 | 欧美激情片在线观看 | 天天久久综合 | 天天操一操 | 天天天干天天射天天天操 | 91试看 | 国产精品二区三区 | 亚洲欧美日韩一区二区三区在线观看 | 日韩色在线观看 | 最近中文字幕久久 | 国产精品久久久久久久久久尿 | 午夜成人免费电影 | 丰满少妇在线观看网站 | 国产一区二区三区网站 | 五月综合| 成人av中文字幕在线观看 | 日日日网| 国产精品成人久久久 | 国产日韩精品在线观看 | 欧美在线观看小视频 | 高清有码中文字幕 | 久久久精品网站 | 免费在线日韩 | 在线免费性生活片 | 又黄又爽又湿又无遮挡的在线视频 | 国产乱视频 | 久久久久久久久久久网站 | 国产亚洲婷婷免费 | 国产视频二区三区 | 日韩福利在线观看 | 九九九视频精品 | 亚洲综合最新在线 | 国产午夜精品av一区二区 | 欧美日韩国产欧美 | 国产精品不卡 | 在线国产一区 | 91av在线免费视频 | 91av观看 | 91在线视频观看 | 国产成人免费观看 | 高清免费av在线 | 九九三级毛片 | 国产精品久久精品国产 | 91精彩视频在线观看 | 久久精品视频在线看 | 超碰97.com | 在线观看的黄色 | 国产精品涩涩屋www在线观看 | 国产精品久久久久久久久久久久久 | 激情网五月 | 成人在线一区二区三区 | a极黄色片 | 国产精品一区二 | 国产精品一区在线播放 | 欧美午夜久久 | 福利一区视频 | 狠狠躁夜夜躁人人爽超碰97香蕉 | 五月婷婷操 | 免费亚洲一区二区 | 四虎在线免费视频 | 男女视频国产 | 国产色爽 | 一区二区三区动漫 | 综合久久网 | 免费观看91视频大全 | 激情小说 五月 | 三级性生活视频 | 国产精品男女视频 | 日韩高清免费在线观看 | 日韩欧美不卡 | 香蕉影视 | 黄污在线看| 久久一视频 | 视频二区在线 | 国产精品成人一区二区 | 久久一区二区三区日韩 | 国产96在线观看 | 欧美午夜精品久久久久久浪潮 | 成人一级影视 | 久久久高清视频 | 91亚洲欧美激情 | 99色免费 | 久久久久亚洲精品男人的天堂 | 肉色欧美久久久久久久免费看 | 国产精品久久网 | 天天干夜夜爱 | 色婷婷激情综合 | 久久精品aaa | 欧美日韩三级在线观看 | 免费毛片一区二区三区久久久 | 91麻豆文化传媒在线观看 | 中文乱幕日产无线码1区 | 特级黄录像视频 | 日日碰狠狠躁久久躁综合网 | 日韩狠狠操 | 精品美女在线视频 | 丁香六月久久综合狠狠色 | 成人免费视频观看 | 欧美日韩一区二区三区不卡 | 色综合天天综合网国产成人网 | 亚洲专区 国产精品 | 午夜色影院 | 日韩精品免费一线在线观看 | 五月天色站| 日韩在线一二三区 | 亚洲成人二区 | 在线成人免费av | 中文字幕在线观看网 | 国产精品av电影 | 亚洲精品伦理在线 | 在线观看免费高清视频大全追剧 | 精品你懂的 | 18女毛片| 日韩久久影院 | 国产亚洲片 | 国产色在线,com | 超碰在线免费福利 | 日本在线视频一区二区三区 | 免费av在线播放 | 成人免费视频视频在线观看 免费 | 色欧美成人精品a∨在线观看 | 久久好看 | 国产亚洲一区二区三区 | www五月天| 国产精品成人免费精品自在线观看 | 九九精品视频在线观看 | 色噜噜日韩精品一区二区三区视频 | 精品久久久久久久 | 久久线视频 | 欧美国产高清 | 探花视频在线观看 | 91免费高清观看 | 最新日韩在线观看视频 | 在线观看亚洲国产 | 黄色av网站在线观看免费 | 国产手机视频在线观看 | 天天操天天摸天天干 | 国产精品久久久久久影院 | 亚洲综合一区二区精品导航 | 亚洲免费视频在线观看 | 免费日韩三级 | 久久高清国产 | 国产精品原创av片国产免费 | 国产日韩精品欧美 | 色噜噜在线观看视频 | 中文在线免费视频 | 99久久夜色精品国产亚洲 | a级国产乱理论片在线观看 伊人宗合网 | 91丨九色丨国产丨porny精品 | 亚洲男男gaygay无套 | 国产精品女教师 | 日韩 在线 | 婷婷色网站| 日韩毛片精品 | av在线看网站 | 国产日产高清dvd碟片 | 探花视频网站 | 国内久久精品 | 99av国产精品欲麻豆 | 四虎8848免费高清在线观看 | 久久精品国产久精国产 | 日日夜夜人人精品 | 久久久99久久 | 亚洲欧美激情精品一区二区 | 久草资源在线观看 | 天天曰视频 | 狠狠色网 | 97av在线视频 | 国产伦理久久精品久久久久_ | 久久久免费电影 | 亚洲mv大片欧洲mv大片免费 | 四虎永久精品在线 | av在线播放观看 | 天天鲁天天干天天射 | 综合在线亚洲 | 欧美孕妇视频 | 一区二区三区日韩精品 | 久久激情五月婷婷 | 国产高清不卡在线 | 久久乱码卡一卡2卡三卡四 五月婷婷久 | 亚洲午夜小视频 | 日韩午夜高清 | 国产精品一区二区你懂的 | 国产美腿白丝袜足在线av | 字幕网资源站中文字幕 | 国产免费成人 | 激情综合网五月激情 | 国产最新91| 婷婷六月天在线 | 日韩a级免费视频 | 日韩av高潮 | 欧美午夜视频在线 | 欧美专区国产专区 | 国产精品视频不卡 | 黄a在线 | 国产精品国产亚洲精品看不卡15 | 亚洲久草视频 | 美女视频黄的免费的 | 国产永久免费观看 | 成人天堂网 | 一级黄视频 | 97国产在线 | 精品乱码一区二区三四区 | 久久免费黄色大片 | 在线观看中文字幕2021 | 国产精品久久久久久久免费大片 | 九九国产精品视频 | 99视频这里只有 | 天天躁日日躁狠狠躁av麻豆 | 综合网在线视频 | 亚洲精品欧洲精品 | 亚洲综合成人在线 | 国产精品久久在线观看 | 国产99久 | 日本精品一区二区三区在线播放视频 | 久久成人国产 | av三级av| 成人黄色片免费 | 久久久久中文字幕 | av片子在线观看 | 精品无人国产偷自产在线 | 亚洲免费资源 | 久久婷婷丁香 | 在线观看日韩精品 | 久久久久久久久久久网站 | 在线91av| 国产99久久精品 | 丁香激情综合国产 | 一区二区欧美在线观看 | 日韩av免费一区 | 99久久精品免费看 | 亚洲黄色一级电影 | 天天爱天天色 | 日本黄区免费视频观看 | 激情久久综合 | 国产精品久久久久免费 | 日韩黄色在线电影 | 福利电影一区二区 | 日韩精品一区二区三区免费观看 | 国产精品成人在线 | av一级片在线观看 | 在线观看黄av | av黄色在线| 九九九九九九精品任你躁 | av播放在线 | 在线影院中文字幕 | 色橹橹欧美在线观看视频高清 | 国产精品久久久久高潮 | 亚洲午夜久久久影院 | 中国老女人日b | 日本一区二区免费在线观看 | 天天操天天操天天干 | 国产精品福利在线观看 | 亚洲狠狠婷婷综合久久久 | av中文字幕免费在线观看 | 999视频在线播放 | 97免费在线观看视频 | 亚洲a色 | 麻豆影视网站 | 久草免费看 | 久草视频99| 国内精品久久久久久久久久 | 玖玖在线精品 | 2018亚洲男人天堂 | 超碰九九 | 欧美日韩国产高清视频 | 狠狠狠综合 | 国产视频在线观看一区 | 色婷婷在线播放 | 99亚洲国产 | 亚洲成av人片在线观看www | 韩日电影在线免费看 | 久久国产精品99精国产 | 久久精品福利 | 久久精品站| 国产资源精品在线观看 | 亚洲综合色视频在线观看 | 日本中文字幕在线观看 | 久久综合九色综合久久久精品综合 | 成人国产精品一区 | 人人爽人人爽 | 国产91免费在线观看 | 欧美电影在线观看 | 日韩精品中文字幕有码 | 国产精品网红直播 | 久久人人爽人人爽人人片av免费 | 91人人射 | 99精品在线观看 | 69夜色精品国产69乱 | 最新成人在线 | 久久免费成人网 | 亚洲欧美国产精品va在线观看 | 天天骚夜夜操 | 九九综合久久 | 久久综合九色欧美综合狠狠 | 日韩久久精品一区二区 | 中文字幕 婷婷 | a资源在线| 99精品视频一区 | 国产永久免费高清在线观看视频 | 麻豆视屏 | 国产第一页在线观看 | 国产探花在线看 | 区一区二区三区中文字幕 | 91麻豆产精品久久久久久 | av动态图片| 中文字幕精品www乱入免费视频 | 在线三级av | 成人羞羞视频在线观看免费 | 黄色片毛片 | 狠狠精品 | 综合久久一本 | 91综合久久一区二区 | 五月婷婷一区二区三区 | 色婷婷国产在线 | 国产成人av电影在线观看 | 91精品国产一区 | 欧洲精品视频一区二区 | 国产精品av在线免费观看 | 天天干天天射天天爽 | 国产99久久久欧美黑人 | 久久综合综合久久综合 | 91视频在线免费观看 | 成人在线免费观看网站 | 精品视频久久 | 欧美精品亚洲精品 | 国产精品久久久久aaaa九色 | 久久99中文字幕 | 午夜10000 | 国产免费久久 | 夜夜狠狠| 97成人免费视频 | 日韩欧美大片免费观看 | 最新av中文字幕 | 99久热在线精品 | 在线91精品 | 亚洲成av人电影 | 日本韩国在线不卡 | 国产一区二区在线免费 | 精品国产一区二 | 久久午夜色播影院免费高清 | 少妇bbb好爽| 精品在线观看一区二区 | 香蕉视频免费看 | 久草精品视频在线观看 | 特级西西444www高清大视频 | 国产高清中文字幕 | 国产一区二区成人 | 国产黄色大片免费看 | 在线观看免费av网 | 亚洲1区 在线 | 99热这里只有精品在线观看 | 日韩中文在线播放 | 精品免费一区二区三区 | 天天婷婷 | 99久久婷婷国产一区二区三区 | 日韩在线观看不卡 | 91影视成人 | 久久国产欧美日韩精品 | 久久久这里有精品 | 国产精品久久久久久吹潮天美传媒 | 久久久精品网站 | 国产精品999久久久 久产久精国产品 | 成片免费 | 亚洲 中文 欧美 日韩vr 在线 | 免费视频91蜜桃 | 国产69精品久久久久9999apgf | 成人羞羞免费 | 91在线看视频| 午夜丁香网 | 超碰公开在线 | 日本护士撒尿xxxx18 | 久久99操| 韩国av三级 | 综合网天天色 | 国产三级精品三级在线观看 | 久久国产精品免费观看 | 国产亚洲日本 | 中文字幕制服丝袜av久久 | 亚洲国产精品视频 | 福利视频第一页 | 久久午夜国产 | 国产色爽 | 有码一区二区三区 | 亚洲精品在线免费看 | 美女激情影院 | 精品亚洲在线 | 又粗又长又大又爽又黄少妇毛片 | 国产网站在线免费观看 | 成人播放器 | 成人黄在线 | 在线观看a视频 | 久久精品人人做人人综合老师 | 美女视频又黄又免费 | 黄色特级片 | 日韩一级成人av | 天天躁日日躁狠狠躁 | h视频在线看 | 亚洲一级黄色片 | 日韩在线免费 | 一级片免费视频 | 丁香激情综合久久伊人久久 | 91丨九色丨国产在线 | 欧美另类网站 | 久久久国产精品电影 | 日韩在线观看视频网站 | 97成人啪啪网 | 99久久99久久免费精品蜜臀 | 国产精品久久久久久久毛片 | 日韩精品1区2区 | 国产99久久久国产精品 | 亚洲日本va午夜在线电影 | 97色婷婷人人爽人人 | 草久草久 | 国产视频精选 | 黄色av网站在线观看免费 | 亚洲激精日韩激精欧美精品 | 69国产精品视频免费观看 | 日韩中文字幕在线看 | 中文字幕在线不卡国产视频 | 片网址| 天无日天天操天天干 | 99情趣网视频| 青青河边草手机免费 | 欧美激情精品久久 | 一区二区伦理 | aav在线| 国产精品成人自拍 | 国产美女网站在线观看 | 狠狠色伊人亚洲综合网站野外 | 成片视频在线观看 | 国产麻豆精品95视频 | 国产精品永久在线 | 视频国产在线观看18 | 欧美精品网站 | 午夜精品成人一区二区三区 | 黄av在线| 亚洲精品久久久久999中文字幕 | 夜夜嗨av色一区二区不卡 | 日韩av高潮| av在线小说| 免费观看成年人视频 | 国产精品久久毛片 | 91日韩国产| 黄色视屏免费在线观看 | 最近中文字幕大全中文字幕免费 | 中文字幕 国产视频 | 激情综合五月天 | 精品uu| 亚洲综合网 | 手机看片久久 | 日韩中文字幕电影 | 成人a级免费视频 | 超碰九九 | 91成品人影院 | 香蕉影院在线 | 蜜桃av久久久亚洲精品 | 亚洲一区久久 | 精品福利视频在线观看 | 五月婷婷六月丁香 | 久久99热精品这里久久精品 | 亚洲欧美日韩精品一区二区 | 91xav| 国产精品18久久久久久不卡孕妇 | 国产精品99久久免费黑人 | 特级大胆西西4444www | 成人午夜在线观看 | 91久色蝌蚪 | 999精品| 国产高清区 | 国产123av | 国产高清不卡在线 | 成人毛片在线观看视频 | 久久久久久久久网站 | 国产成人精品999在线观看 | 一区二区三区四区五区在线视频 | 成人综合日日夜夜 | 91久色蝌蚪| 97人人模人人爽人人喊网 | 中文字幕成人在线 | 黄色网在线免费观看 | 中文字幕传媒 | www.黄色网.com | 久久最新网址 | a级片韩国 | 欧美精品你懂的 | 国产一区二区三区久久久 | 欧美看片| 亚洲欧美日韩一二三区 | 在线播放第一页 | 91在线影视 | 97精品国自产拍在线观看 | 色婷在线 | 国产va精品免费观看 | 综合久久久 | 国产日韩中文字幕 | 久久99婷婷| 欧美一级特黄aaaaaa大片在线观看 | 免费视频网 | 欧美久草网 | 午夜av色 | 97国产在线视频 | 日韩综合视频在线观看 | 亚洲一区美女视频在线观看免费 | 亚洲成av人片在线观看香蕉 | 中文字幕在线免费观看 | 婷婷99 | 久久精品亚洲一区二区三区观看模式 | 亚洲人人精品 | 亚洲国产精品一区二区久久hs | 黄色av网站在线观看免费 | 在线观看中文av | 三级动图| 国产精品成人av在线 | 免费视频成人 | 可以免费观看的av片 | 韩国av一区二区三区在线观看 | 久久久精品网站 | 国产在线播放一区 | 91大片网站| 少妇高潮冒白浆 | 欧洲精品码一区二区三区免费看 | 欧美a视频在线观看 | 免费观看黄 | 91成人网在线观看 | av免费电影网站 | 国产精品一区二区三区久久久 | 亚洲综合丁香 | 四虎影视成人精品国库在线观看 | 婷婷丁香激情五月 | 91精品毛片| 日韩免费b | 久久久网站 | 国产成人专区 | 夜夜骑首页 | 久久久久久久久久久久99 | 中文字幕在线观看亚洲 | 亚洲天天摸日日摸天天欢 | 久久伦理 | 天天做夜夜做 | 公与妇乱理三级xxx 在线观看视频在线观看 | 欧美日韩免费一区二区 | 91一区二区在线 | 午夜影院在线观看18 | 日韩激情精品 | 久久精品福利 | 色就是色综合 | 毛片视频电影 | 狠狠干 狠狠操 | 国产小视频在线播放 | 久久手机免费观看 | 国产亚洲精品美女久久 | 久久精品国产免费 | 精品九九久久 | 特级a毛片 | 久久久视频在线 | 日韩精品亚洲专区在线观看 | 国产精品1区2区 | 久久综合久久综合这里只有精品 | 亚洲欧美经典 | 特级西西人体444是什么意思 | 亚洲国产精品成人va在线观看 | 免费又黄又爽的视频 | 黄色成年网站 | 在线免费视频 你懂得 | 国产精品高清一区二区三区 | 日韩视频免费观看高清完整版在线 | 亚洲精品久久久久久中文传媒 | 久久精品国产精品亚洲精品 | 综合久久综合久久 | 天天干天天操天天操 | 狠狠干激情 | av观看免费在线 | av在线影片 | 免费看一及片 | 在线观看av免费 | 精品天堂av | 免费看一级黄色大全 | 久久久影片 | 欧美精品xxx | 一区二区影视 | 久久久久久久久久久免费av | 在线看片日韩 | 激情丁香婷婷 | 99精品久久精品一区二区 | 精品婷婷 | av亚洲产国偷v产偷v自拍小说 | 亚洲欧美日韩一区二区三区在线观看 | 免费h精品视频在线播放 | 最新色站 | 久久精品99国产精品日本 | 九九热在线免费观看 | 国产精品自产拍在线观看蜜 | 免费看一及片 | 涩涩成人在线 | 欧美精品一二 | 五月天欧美精品 | 97成人免费视频 | 国产亚洲免费的视频看 | 日韩av综合网站 | 97人人人人 | 欧美日韩视频在线播放 | 丁香婷婷久久久综合精品国产 | 久久综合电影 | 国产精品久久久久久999 | 日韩电影在线观看一区二区三区 | 成 人 黄 色视频免费播放 | 亚洲伊人av | 久日视频 | www.99av| av亚洲产国偷v产偷v自拍小说 | 国产精品va视频 | 久久乱码卡一卡2卡三卡四 五月婷婷久 | 久久久久这里只有精品 | 99久久日韩精品免费热麻豆美女 | 日本一区二区不卡高清 | 国产精品99久久久 | 超碰免费av | 日韩一级成人av | 欧美一级片在线观看视频 | 国产白浆视频 | 在线免费观看视频你懂的 | 国产一性一爱一乱一交 | 九九爱免费视频在线观看 | 国产成a人亚洲精v品在线观看 | 五月综合| 欧美日韩国产精品一区二区亚洲 | 久久久久久久久影视 | 成人国产精品一区二区 | 久久人91精品久久久久久不卡 | 日韩国产精品一区 | www.xxx.性狂虐 | 国产一区网址 | 手机在线中文字幕 | 国产成人无码AⅤ片在线观 日韩av不卡在线 | 久久精品视频网址 | 国产亚洲视频在线 | 亚洲国产日韩精品 | 国产精品久久久777 成人手机在线视频 | 国产精品福利久久久 | 精品久久91 | 成人日批视频 | aaa黄色毛片| 欧美精品久久久久久久 | 久久久国产电影 | 韩日精品在线观看 | 五月开心六月伊人色婷婷 | 人人插人人射 | 在线免费av网 | 天天看天天干天天操 | 免费高清影视 | 欧美a级在线播放 | 久久久久久久久亚洲精品 | 中文字幕在线观看第二页 | 午夜视频黄 | 色婷婷伊人 | 精品女同一区二区三区在线观看 | 亚洲成av人片 | 成人午夜精品久久久久久久3d | 91九色最新地址 | 国产精品美女视频 | 日韩视频免费在线观看 | 欧美成人精品欧美一级乱 | 国内外成人免费在线视频 | av电影免费在线看 | 亚洲女欲精品久久久久久久18 | 国产精品久久久久免费a∨ 欧美一级性生活片 | 成人国产精品久久久久久亚洲 | 亚洲国内精品 | 国产九色视频在线观看 | 国产一级淫片免费看 | 91成人在线视频 | 亚洲人成影院在线 | 国产99黄| 日韩免费在线观看视频 | 天天色天天操天天爽 | 久久免费中文视频 | 天天激情综合网 | 中文字幕国产 | 麻豆视频成人 | 日韩精品免费一区二区三区 | 国产日韩中文字幕 | 黄色免费网站大全 | 日日夜夜天天操 | 激情综合亚洲精品 | 天天干,天天射,天天操,天天摸 | 天堂av在线网站 | 国产精品福利小视频 | 亚洲精品久久久久久久不卡四虎 | 亚洲精品乱码久久久久久蜜桃动漫 | 天天插天天射 | 亚洲天天 | 91看片成人 | 日本激情视频中文字幕 | 91精品视频在线看 | 在线国产一区二区三区 | 中文字幕网址 | 亚洲精品在线观看中文字幕 | 欧美日韩国产一区二区三区在线观看 | 久草在线久 | 国产日产高清dvd碟片 | 五月婷婷六月丁香在线观看 | 国产黄色看片 | 欧洲一区二区三区精品 | 欧美最猛性xxxx | 999久久久久久久久6666 | 国产成人三级在线 | 成人精品一区二区三区电影免费 | 天堂成人在线 | 欧美日韩在线精品一区二区 | 久久久久欠精品国产毛片国产毛生 | 婷婷综合在线 | 91桃色国产在线播放 | 久久久久久久久久久久久9999 | 亚洲精品乱码久久久久久蜜桃欧美 | 中文字幕一区二区三区久久蜜桃 | 五月激情站 | 日韩中文字幕在线观看 | 丁香六月av | 午夜婷婷在线播放 | 欧美精品久久久久 | 91成熟丰满女人少妇 | 国产在线观看地址 | 中文字幕九九 | 中文字幕一二 | 丁香视频在线观看 | 亚洲天天 | 欧美日韩国产精品一区二区三区 | 国产一区二区在线免费播放 | 欧美日韩不卡在线观看 | 国产一级片网站 | 国产不卡视频在线播放 | 伊人黄 | 中文字幕免 | 99在线热播精品免费99热 | 免费www视频 | 成人黄大片视频在线观看 | 日韩欧美精品在线观看 | 成人a级大片| 在线观看av小说 | 色悠悠久久综合 | a久久免费视频 | 日日夜夜狠狠 | 日韩激情在线视频 | 日韩色一区二区三区 | 婷婷久久国产 | 日韩久久精品一区二区 | 亚洲综合五月 | 天天色综合天天 | 在线看av的网址 | 国产高清在线看 | 欧美日韩性视频在线 | 三级视频片 | 久久综合之合合综合久久 | 麻豆91小视频 | 久久久免费精品视频 | 日韩国产精品久久久久久亚洲 | 久久网址 | 好看av在线 | 激情久久综合网 | 国内精品久久久久久久久久清纯 | 1024在线看片 | 国产精品久久在线观看 | 在线 日韩 av| 人人爱人人爽 | 91自拍成人 | 亚洲专区视频在线观看 | 欧美精品久久久久久久亚洲调教 | 中文字幕乱视频 | 国产亚洲精品久久久久久移动网络 | 少妇搡bbbb搡bbb搡69 | 五月开心网 | 国产福利av在线 | 国产成人av免费在线观看 | 国产精品久久久久久久久久ktv | 欧美日韩视频在线观看一区二区 | 99这里只有| 日韩天天操 | 少妇bbw撒尿 | 成人片在线播放 | 免费电影一区二区三区 | 久久精品久久久久 | 欧美a免费|