3atv精品不卡视频,97人人超碰国产精品最新,中文字幕av一区二区三区人妻少妇,久久久精品波多野结衣,日韩一区二区三区精品

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

AnnotationConfigApplicationContext容器初始化

發(fā)布時間:2024/4/13 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 AnnotationConfigApplicationContext容器初始化 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

AnnotationConfigApplicationContext容器初始化目錄
(Spring源碼分析)AnnotationConfigApplicationContext容器初始化 this() && register()
(Spring源碼分析)AnnotationConfigApplicationContext容器初始化 refresh()#invokeBeanFactoryPostProcessors
(Spring源碼分析)AnnotationConfigApplicationContext容器初始化 refresh()#registerBeanPostProcessors
(Spring源碼分析)AnnotationConfigApplicationContext容器初始化 refresh()#finishBeanFactoryInitialization
?

使用AnnotationConfigApplicationContext容器

public static void main(String[] args) {AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);TestService testService = applicationContext.getBean(TestService.class);System.out.println(testService.sout()); }

AppConfig配置類

@Configuration @ComponentScan("com.leon.learning.build.applicationcontext") public class AppConfig { }

AnnotationConfigApplicationContext容器方法

AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);

這段代碼會調(diào)用AnnotationConfigApplicationContext類的無參構(gòu)造方法
?

AnnotationConfigApplicationContext容器方法

AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);

這段代碼會調(diào)用AnnotationConfigApplicationContext類的無參構(gòu)造方法

/*** 這個構(gòu)造方法需要傳入一個javaconfig注解了的配置類* 然后會把這個被注解了javaconfig的類通過注解讀取器讀取后繼而解析*/ public AnnotationConfigApplicationContext(Class<?>... annotatedClasses) {// 這里由于他有父類,故而會先調(diào)用父類的無參構(gòu)造方法,然后才會調(diào)用自己的無參構(gòu)造方法// 在自己構(gòu)造方法中初始一個讀取器和掃描器this();register(annotatedClasses); // 這里僅僅只是將annotatedClasses作為bean放入beanDefinitionMap中refresh(); // AnnotationConfigApplicationContext容器中最重要的方法,將annotatedClasses中 掃描的bean加入beanDefinitionMap中 }

1、this()

this()方法主要是初始化BeanFactory容器

在AnnotationConfigApplicationContext父類GenericApplicationContext的無參構(gòu)造方法中

/*** 初始化BeanFactory*/ public GenericApplicationContext() {this.beanFactory = new DefaultListableBeanFactory(); }

然后執(zhí)行AnnotationConfigApplicationContext自己的無參構(gòu)造方法

/*** 初始化注解讀取器和掃描器*/ public AnnotationConfigApplicationContext() {this.reader = new AnnotatedBeanDefinitionReader(this);this.scanner = new ClassPathBeanDefinitionScanner(this); }

2、register(annotatedClasses)

register(annotatedClasses)方法主要是將傳入的配置類加入到BeanDefinitionMap中,但是配置類中配置 的包掃描路徑下的bean并沒有添加到BeanDefinitionMap中 /*** 判斷annotatedClasses不為空,并調(diào)用AnnotatedBeanDefinitionReader注解讀取器去讀取配置類 annotatedClasses中的配置*/ public void register(Class<?>... annotatedClasses) {Assert.notEmpty(annotatedClasses, "At least one annotated class must be specified");this.reader.register(annotatedClasses); // 調(diào)用AnnotatedBeanDefinitionReader注解讀取器去讀 取配置類annotatedClasses中的配置 }

2.1、this.reader.register(annotatedClasses)

/*** 循環(huán)調(diào)用AnnotatedBeanDefinitionReader注解讀取器去讀取配置類*/ public void register(Class<?>... annotatedClasses) {for (Class<?> annotatedClass : annotatedClasses) {registerBean(annotatedClass);} }

2.1.1、registerBean(annotatedClass)

public void registerBean(Class<?> annotatedClass) {doRegisterBean(annotatedClass, null, null, null); }

2.1.1.1、doRegisterBean(annotatedClass, null, null, null)

<T> void doRegisterBean(Class<T> annotatedClass, @Nullable Supplier<T> instanceSupplier, @Nullable String name,@Nullable Class<? extends Annotation>[] qualifiers, BeanDefinitionCustomizer... definitionCustomizers) {// 這里的這個AnnotatedGenericBeanDefinition對象僅僅只是在new AnnotationConfigApplicationContext(傳入的配置類)AnnotatedGenericBeanDefinition abd = new AnnotatedGenericBeanDefinition(annotatedClass); // 將Bean的配置信息轉(zhuǎn)換成AnnotatedGenericBeanDefinition,它繼承了BeanDefinition接口,包含bean的屬性// @Conditional裝配條件判斷是否需要跳過注冊if (this.conditionEvaluator.shouldSkip(abd.getMetadata())) {return;}abd.setInstanceSupplier(instanceSupplier);ScopeMetadata scopeMetadata = this.scopeMetadataResolver.resolveScopeMetadata(abd); // 解析bean作用域,如果使有@Scope注解指定了bean的作用域?qū)⒃O(shè)置成指定的作用域,否則默認(rèn)為singleton(單例)abd.setScope(scopeMetadata.getScopeName()); // 為AnnotatedGenericBeanDefinition對象設(shè)置scope(作用域)屬性String beanName = (name != null ? name : this.beanNameGenerator.generateBeanName(abd, this.registry)); // 生成beanNameAnnotationConfigUtils.processCommonDefinitionAnnotations(abd); // 解析AnnotatedGenericBeanDefinition對象中l(wèi)azy、Primary、DependsOn、Role、Description屬性if (qualifiers != null) { // @Qualifier特殊限定符處理for (Class<? extends Annotation> qualifier : qualifiers) {if (Primary.class == qualifier) {abd.setPrimary(true);}else if (Lazy.class == qualifier) {abd.setLazyInit(true);}else {abd.addQualifier(new AutowireCandidateQualifier(qualifier));}}}// 處理applicationcontext容器加載完成后手動registerBeanfor (BeanDefinitionCustomizer customizer : definitionCustomizers) {customizer.customize(abd);}BeanDefinitionHolder definitionHolder = new BeanDefinitionHolder(abd, beanName); // 將beanName和AnnotatedGenericBeanDefinition封裝在BeanDefinitionHolder中definitionHolder = AnnotationConfigUtils.applyScopedProxyMode(scopeMetadata, definitionHolder, this.registry); // 創(chuàng)建代理對象BeanDefinitionReaderUtils.registerBeanDefinition(definitionHolder, this.registry); // 將BeanDefinition注冊到BeanDefinitionMap中 }

2.1.1.1.1、BeanDefinitionReaderUtils.registerBeanDefinition(definitionHolder, this.registry)

public static void registerBeanDefinition(BeanDefinitionHolder definitionHolder, BeanDefinitionRegistry registry)throws BeanDefinitionStoreException {// Register bean definition under primary name.String beanName = definitionHolder.getBeanName();registry.registerBeanDefinition(beanName, definitionHolder.getBeanDefinition()); // 調(diào)用BeanDefinitionRegistry方法對BeanDefinition注冊到ConCurrentHashMap中// Register aliases for bean name, if any.String[] aliases = definitionHolder.getAliases();if (aliases != null) {for (String alias : aliases) {registry.registerAlias(beanName, alias); // 注冊別名}} }

2.1.1.1.1.1、registry.registerBeanDefinition(beanName, definitionHolder.getBeanDefinition())

/*** 對BeanDefinition注冊到ConCurrentHashMap中*/ @Override public void registerBeanDefinition(String beanName, BeanDefinition beanDefinition)throws BeanDefinitionStoreException {// 校驗beanName和beanDefinition不能為空Assert.hasText(beanName, "Bean name must not be empty");Assert.notNull(beanDefinition, "BeanDefinition must not be null");// beanDefinition校驗if (beanDefinition instanceof AbstractBeanDefinition) {try {((AbstractBeanDefinition) beanDefinition).validate();}catch (BeanDefinitionValidationException ex) {throw new BeanDefinitionStoreException(beanDefinition.getResourceDescription(), beanName,"Validation of bean definition failed", ex);}}BeanDefinition existingDefinition = this.beanDefinitionMap.get(beanName); // 判斷beanDefinitionMap中是否含有相同beanName的BeanDefinition// 如果beanDefinitionMap中存在相同beanName的BeanDefinitionif (existingDefinition != null) {// 判斷是否允許含有同樣的beanName對BeanDefinition進(jìn)行覆蓋if (!isAllowBeanDefinitionOverriding()) {throw new BeanDefinitionStoreException(beanDefinition.getResourceDescription(), beanName,"Cannot register bean definition [" + beanDefinition + "] for bean '" + beanName +"': There is already [" + existingDefinition + "] bound.");}// 參數(shù)校驗else if (existingDefinition.getRole() < beanDefinition.getRole()) {// e.g. was ROLE_APPLICATION, now overriding with ROLE_SUPPORT or ROLE_INFRASTRUCTUREif (logger.isWarnEnabled()) {logger.warn("Overriding user-defined bean definition for bean '" + beanName +"' with a framework-generated bean definition: replacing [" +existingDefinition + "] with [" + beanDefinition + "]");}}else if (!beanDefinition.equals(existingDefinition)) {if (logger.isInfoEnabled()) {logger.info("Overriding bean definition for bean '" + beanName +"' with a different definition: replacing [" + existingDefinition +"] with [" + beanDefinition + "]");}}else {if (logger.isDebugEnabled()) {logger.debug("Overriding bean definition for bean '" + beanName +"' with an equivalent definition: replacing [" + existingDefinition +"] with [" + beanDefinition + "]");}}this.beanDefinitionMap.put(beanName, beanDefinition); // 將beanName和beanDefinition存到beanDefinitionMap中}// 如果beanDefinitionMap中不存在相同beanName的BeanDefinitionelse {if (hasBeanCreationStarted()) {// Cannot modify startup-time collection elements anymore (for stable iteration)synchronized (this.beanDefinitionMap) { // 同步代碼塊this.beanDefinitionMap.put(beanName, beanDefinition); // 將beanName和beanDefinition存到beanDefinitionMap中List<String> updatedDefinitions = new ArrayList<>(this.beanDefinitionNames.size() + 1);updatedDefinitions.addAll(this.beanDefinitionNames);updatedDefinitions.add(beanName);this.beanDefinitionNames = updatedDefinitions;if (this.manualSingletonNames.contains(beanName)) {Set<String> updatedSingletons = new LinkedHashSet<>(this.manualSingletonNames);updatedSingletons.remove(beanName);this.manualSingletonNames = updatedSingletons;}}}else {// Still in startup registration phasethis.beanDefinitionMap.put(beanName, beanDefinition);this.beanDefinitionNames.add(beanName);this.manualSingletonNames.remove(beanName);}this.frozenBeanDefinitionNames = null;}if (existingDefinition != null || containsSingleton(beanName)) {resetBeanDefinition(beanName);} }

refresh()

在refresh()中,主要有12個方法,下面主要對invokeBeanFactoryPostProcessors(beanFactory)、 registerBeanPostProcessors(beanFactory)、finishBeanFactoryInitialization(beanFactory)方法進(jìn) 行分析 @Override public void refresh() throws BeansException, IllegalStateException {synchronized (this.startupShutdownMonitor) {// 準(zhǔn)備工作包括設(shè)置啟動時間,是否激活標(biāo)識位// 1.刷新預(yù)處理的前期準(zhǔn)備prepareRefresh();// 2.獲取內(nèi)部的Bean工廠ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();// 3.準(zhǔn)備需要刷新后的工廠,為beanFactory屬性設(shè)置初始值prepareBeanFactory(beanFactory);try {// 4.這個方法在當(dāng)前版本的Spring是沒用,留著給擴(kuò)展使用postProcessBeanFactory(beanFactory);// 5.在Spring的環(huán)境中去執(zhí)行已經(jīng)被注冊的factory processors// 設(shè)置執(zhí)行自定的ProcessBeanFactory和Spring內(nèi)部自己定義的// 把類給掃描出來、處理@Import、@ImportSource導(dǎo)入資源文件,處理MapperScan// scan -- put beanDefinitionMapinvokeBeanFactoryPostProcessors(beanFactory);// 6.注冊beanPostProcessorregisterBeanPostProcessors(beanFactory);// 7.初始化MessageSourceinitMessageSource();// 8.初始化應(yīng)用實踐廣播器initApplicationEventMulticaster();// 9.這個方法在當(dāng)前版本的Spring是沒用,留著給擴(kuò)展使用onRefresh();// 10.Check for listener beans and register them.registerListeners();// 11.new對象,單例,將beanFactory中的beanDefinitionMap中的bean進(jìn)行初始化,然后放到單例池singletonObjects中finishBeanFactoryInitialization(beanFactory);// 12.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();}} }

invokeBeanFactoryPostProcessors(beanFactory)

invokeBeanFactoryPostProcessors(beanFactory)主要是作用如下:

在Spring的環(huán)境中去執(zhí)行已經(jīng)被注冊的BeanFactoryPostProcessors 設(shè)置執(zhí)行Spring內(nèi)部自己定義的BeanFactoryPostProcessors 將配置類中的bean掃描出來,添加到BeanDefinitionMap中 處理@Import、@ImportSource導(dǎo)入資源文件 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()));} }

invokeBeanFactoryPostProcessors(beanFactory, beanFactoryPostProcessors)

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<>(); // 用來存放實現(xiàn)BeanFactoryPostProcessor接口的類List<BeanDefinitionRegistryPostProcessor> registryProcessors = new ArrayList<>(); // 用來存放實現(xiàn)BeanDefinitionRegistryPostProcessor接口的類// 遍歷beanFactoryPostProcessors,如果是實現(xiàn)BeanDefinitionRegistryPostProcessor的,直接執(zhí)行實現(xiàn)類中實現(xiàn)的postProcessBeanDefinitionRegistry方法for (BeanFactoryPostProcessor postProcessor : beanFactoryPostProcessors) {if (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<>(); // 用來存放beanDefinitionMap中繼承了BeanDefinitionRegistryPostProcessor接口的bean// First, invoke the BeanDefinitionRegistryPostProcessors that implement PriorityOrdered.// 查找beanDefinitionMap中繼承了BeanDefinitionRegistryPostProcessor接口的beanString[] postProcessorNames =beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);for (String ppName : postProcessorNames) {if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));processedBeans.add(ppName);}}sortPostProcessors(currentRegistryProcessors, beanFactory);registryProcessors.addAll(currentRegistryProcessors); // 將beanDefinitionMap中繼承了BeanDefinitionRegistryPostProcessor接口的bean添加到registryProcessors以便后面執(zhí)行postProcessBeanFactory方法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.// 執(zhí)行實現(xiàn)了BeanDefinitionRegistryPostProcessor和BeanFactoryPostProcessor接口實現(xiàn)的postProcessBeanFactory方法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<>();for (String postProcessorName : orderedPostProcessorNames) {orderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));}sortPostProcessors(orderedPostProcessors, beanFactory);invokeBeanFactoryPostProcessors(orderedPostProcessors, beanFactory);// Finally, invoke all other BeanFactoryPostProcessors.List<BeanFactoryPostProcessor> nonOrderedPostProcessors = new ArrayList<>();for (String postProcessorName : nonOrderedPostProcessorNames) {nonOrderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));}invokeBeanFactoryPostProcessors(nonOrderedPostProcessors, beanFactory);// Clear cached merged bean definitions since the post-processors might have// modified the original metadata, e.g. replacing placeholders in values...beanFactory.clearMetadataCache(); }

invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry)

private static void invokeBeanDefinitionRegistryPostProcessors(Collection<? extends BeanDefinitionRegistryPostProcessor> postProcessors, BeanDefinitionRegistry registry) {// 執(zhí)行postProcessors中實現(xiàn)了BeanFactoryPostProcessor接口中的postProcessBeanDefinitionRegistry方法for (BeanDefinitionRegistryPostProcessor postProcessor : postProcessors) {postProcessor.postProcessBeanDefinitionRegistry(registry);} }

postProcessor.postProcessBeanDefinitionRegistry(registry)

@Override public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) {int registryId = System.identityHashCode(registry); // 獲取registryIdif (this.registriesPostProcessed.contains(registryId)) {throw new IllegalStateException("postProcessBeanDefinitionRegistry already called on this post-processor against " + registry);}if (this.factoriesPostProcessed.contains(registryId)) {throw new IllegalStateException("postProcessBeanFactory already called on this post-processor against " + registry);}this.registriesPostProcessed.add(registryId);processConfigBeanDefinitions(registry); }

processConfigBeanDefinitions(registry)

public void processConfigBeanDefinitions(BeanDefinitionRegistry registry) {List<BeanDefinitionHolder> configCandidates = new ArrayList<>();String[] candidateNames = registry.getBeanDefinitionNames(); // 取出beanDefinition的className數(shù)組// 遍歷beanDefinition的className數(shù)組for (String beanName : candidateNames) {BeanDefinition beanDef = registry.getBeanDefinition(beanName); // 取出BeanDefinitionif (ConfigurationClassUtils.isFullConfigurationClass(beanDef) ||ConfigurationClassUtils.isLiteConfigurationClass(beanDef)) {if (logger.isDebugEnabled()) {logger.debug("Bean definition has already been processed as a configuration class: " + beanDef);}}else if (ConfigurationClassUtils.checkConfigurationClassCandidate(beanDef, this.metadataReaderFactory)) { // 檢查該BeanDefinition對象是否被@Configuration注解標(biāo)識configCandidates.add(new BeanDefinitionHolder(beanDef, beanName));}}// Return immediately if no @Configuration classes were foundif (configCandidates.isEmpty()) {return;}// Sort by previously determined @Order value, if applicableconfigCandidates.sort((bd1, bd2) -> {int i1 = ConfigurationClassUtils.getOrder(bd1.getBeanDefinition());int i2 = ConfigurationClassUtils.getOrder(bd2.getBeanDefinition());return Integer.compare(i1, i2);});// Detect any custom bean name generation strategy supplied through the enclosing application contextSingletonBeanRegistry sbr = null;if (registry instanceof SingletonBeanRegistry) {sbr = (SingletonBeanRegistry) registry;if (!this.localBeanNameGeneratorSet) {BeanNameGenerator generator = (BeanNameGenerator) sbr.getSingleton(CONFIGURATION_BEAN_NAME_GENERATOR);if (generator != null) {this.componentScanBeanNameGenerator = generator;this.importBeanNameGenerator = generator;}}}if (this.environment == null) {this.environment = new StandardEnvironment();}// Parse each @Configuration classConfigurationClassParser parser = new ConfigurationClassParser(this.metadataReaderFactory, this.problemReporter, this.environment,this.resourceLoader, this.componentScanBeanNameGenerator, registry); // 創(chuàng)建Configuration配置解析器Set<BeanDefinitionHolder> candidates = new LinkedHashSet<>(configCandidates);Set<ConfigurationClass> alreadyParsed = new HashSet<>(configCandidates.size());do {parser.parse(candidates); // 解析帶有@Configuration標(biāo)識的配置beanparser.validate();Set<ConfigurationClass> configClasses = new LinkedHashSet<>(parser.getConfigurationClasses());configClasses.removeAll(alreadyParsed);// Read the model and create bean definitions based on its contentif (this.reader == null) {this.reader = new ConfigurationClassBeanDefinitionReader(registry, this.sourceExtractor, this.resourceLoader, this.environment,this.importBeanNameGenerator, parser.getImportRegistry());}this.reader.loadBeanDefinitions(configClasses);alreadyParsed.addAll(configClasses);candidates.clear();if (registry.getBeanDefinitionCount() > candidateNames.length) {String[] newCandidateNames = registry.getBeanDefinitionNames();Set<String> oldCandidateNames = new HashSet<>(Arrays.asList(candidateNames));Set<String> alreadyParsedClasses = new HashSet<>();for (ConfigurationClass configurationClass : alreadyParsed) {alreadyParsedClasses.add(configurationClass.getMetadata().getClassName());}for (String candidateName : newCandidateNames) {if (!oldCandidateNames.contains(candidateName)) {BeanDefinition bd = registry.getBeanDefinition(candidateName);if (ConfigurationClassUtils.checkConfigurationClassCandidate(bd, this.metadataReaderFactory) &&!alreadyParsedClasses.contains(bd.getBeanClassName())) {candidates.add(new BeanDefinitionHolder(bd, candidateName));}}}candidateNames = newCandidateNames;}}while (!candidates.isEmpty());// Register the ImportRegistry as a bean in order to support ImportAware @Configuration classesif (sbr != null && !sbr.containsSingleton(IMPORT_REGISTRY_BEAN_NAME)) {sbr.registerSingleton(IMPORT_REGISTRY_BEAN_NAME, parser.getImportRegistry());}if (this.metadataReaderFactory instanceof CachingMetadataReaderFactory) {// Clear cache in externally provided MetadataReaderFactory; this is a no-op// for a shared cache since it'll be cleared by the ApplicationContext.((CachingMetadataReaderFactory) this.metadataReaderFactory).clearCache();} }

parser.parse(candidates)

public void parse(Set<BeanDefinitionHolder> configCandidates) {this.deferredImportSelectors = new LinkedList<>();for (BeanDefinitionHolder holder : configCandidates) {BeanDefinition bd = holder.getBeanDefinition();try {if (bd instanceof AnnotatedBeanDefinition) { // 該BeanDefinition的實現(xiàn)類是AnnotatedBeanDefinitionparse(((AnnotatedBeanDefinition) bd).getMetadata(), holder.getBeanName()); // getMetadata()是獲取該AnnotatedBeanDefinition對象中的所有的注解}else if (bd instanceof AbstractBeanDefinition && ((AbstractBeanDefinition) bd).hasBeanClass()) {parse(((AbstractBeanDefinition) bd).getBeanClass(), holder.getBeanName());}else {parse(bd.getBeanClassName(), holder.getBeanName());}}catch (BeanDefinitionStoreException ex) {throw ex;}catch (Throwable ex) {throw new BeanDefinitionStoreException("Failed to parse configuration class [" + bd.getBeanClassName() + "]", ex);}}processDeferredImportSelectors(); }

processConfigurationClass(new ConfigurationClass(metadata, beanName))

protected void processConfigurationClass(ConfigurationClass configClass) throws IOException {if (this.conditionEvaluator.shouldSkip(configClass.getMetadata(), ConfigurationPhase.PARSE_CONFIGURATION)) {return;}ConfigurationClass existingClass = this.configurationClasses.get(configClass);if (existingClass != null) {if (configClass.isImported()) {if (existingClass.isImported()) {existingClass.mergeImportedBy(configClass);}// Otherwise ignore new imported config class; existing non-imported class overrides it.return;}else {// Explicit bean definition found, probably replacing an import.// Let's remove the old one and go with the new one.this.configurationClasses.remove(configClass);this.knownSuperclasses.values().removeIf(configClass::equals);}}// Recursively process the configuration class and its superclass hierarchy.// 遞歸處理配置類和它的父類SourceClass sourceClass = asSourceClass(configClass);do {sourceClass = doProcessConfigurationClass(configClass, sourceClass);}while (sourceClass != null);this.configurationClasses.put(configClass, configClass); }

doProcessConfigurationClass(configClass, sourceClass)

@Nullable protected final SourceClass doProcessConfigurationClass(ConfigurationClass configClass, SourceClass sourceClass)throws IOException {// Recursively process any member (nested) classes firstprocessMemberClasses(configClass, sourceClass);// Process any @PropertySource annotations// 判斷sourceClass的注解中是否有@PropertySource注解for (AnnotationAttributes propertySource : AnnotationConfigUtils.attributesForRepeatable(sourceClass.getMetadata(), PropertySources.class,org.springframework.context.annotation.PropertySource.class)) {if (this.environment instanceof ConfigurableEnvironment) {processPropertySource(propertySource);}else {logger.warn("Ignoring @PropertySource annotation on [" + sourceClass.getMetadata().getClassName() +"]. Reason: Environment must implement ConfigurableEnvironment");}}// Process any @ComponentScan annotations// 判斷sourceClass的注解中是否有@ComponentScan注解Set<AnnotationAttributes> componentScans = AnnotationConfigUtils.attributesForRepeatable(sourceClass.getMetadata(), ComponentScans.class, ComponentScan.class);if (!componentScans.isEmpty() &&!this.conditionEvaluator.shouldSkip(sourceClass.getMetadata(), ConfigurationPhase.REGISTER_BEAN)) { // @ComponentScan注解可以在同一個配置類中使用多次for (AnnotationAttributes componentScan : componentScans) {// The config class is annotated with @ComponentScan -> perform the scan immediatelySet<BeanDefinitionHolder> scannedBeanDefinitions =this.componentScanParser.parse(componentScan, sourceClass.getMetadata().getClassName()); // 使用ComponentScanAnnotationParser解析器去掃描并注冊該bean// Check the set of scanned definitions for any further config classes and parse recursively if neededfor (BeanDefinitionHolder holder : scannedBeanDefinitions) {BeanDefinition bdCand = holder.getBeanDefinition().getOriginatingBeanDefinition();if (bdCand == null) {bdCand = holder.getBeanDefinition();}if (ConfigurationClassUtils.checkConfigurationClassCandidate(bdCand, this.metadataReaderFactory)) {parse(bdCand.getBeanClassName(), holder.getBeanName());}}}}// Process any @Import annotationsprocessImports(configClass, sourceClass, getImports(sourceClass), true);// Process any @ImportResource annotationsAnnotationAttributes importResource =AnnotationConfigUtils.attributesFor(sourceClass.getMetadata(), ImportResource.class);if (importResource != null) {String[] resources = importResource.getStringArray("locations");Class<? extends BeanDefinitionReader> readerClass = importResource.getClass("reader");for (String resource : resources) {String resolvedResource = this.environment.resolveRequiredPlaceholders(resource);configClass.addImportedResource(resolvedResource, readerClass);}}// Process individual @Bean methodsSet<MethodMetadata> beanMethods = retrieveBeanMethodMetadata(sourceClass);for (MethodMetadata methodMetadata : beanMethods) {configClass.addBeanMethod(new BeanMethod(methodMetadata, configClass));}// Process default methods on interfacesprocessInterfaces(configClass, sourceClass);// Process superclass, if anyif (sourceClass.getMetadata().hasSuperClass()) {String superclass = sourceClass.getMetadata().getSuperClassName();if (superclass != null && !superclass.startsWith("java") &&!this.knownSuperclasses.containsKey(superclass)) {this.knownSuperclasses.put(superclass, configClass);// Superclass found, return its annotation metadata and recursereturn sourceClass.getSuperClass();}}// No superclass -> processing is completereturn null; }

this.componentScanParser.parse(componentScan, sourceClass.getMetadata().getClassName())

/*** 得到basePackages*/ public Set<BeanDefinitionHolder> parse(AnnotationAttributes componentScan, final String declaringClass) {ClassPathBeanDefinitionScanner scanner = new ClassPathBeanDefinitionScanner(this.registry,componentScan.getBoolean("useDefaultFilters"), this.environment, this.resourceLoader);Class<? extends BeanNameGenerator> generatorClass = componentScan.getClass("nameGenerator");boolean useInheritedGenerator = (BeanNameGenerator.class == generatorClass);scanner.setBeanNameGenerator(useInheritedGenerator ? this.beanNameGenerator :BeanUtils.instantiateClass(generatorClass));ScopedProxyMode scopedProxyMode = componentScan.getEnum("scopedProxy");if (scopedProxyMode != ScopedProxyMode.DEFAULT) {scanner.setScopedProxyMode(scopedProxyMode);}else {Class<? extends ScopeMetadataResolver> resolverClass = componentScan.getClass("scopeResolver");scanner.setScopeMetadataResolver(BeanUtils.instantiateClass(resolverClass));}scanner.setResourcePattern(componentScan.getString("resourcePattern"));for (AnnotationAttributes filter : componentScan.getAnnotationArray("includeFilters")) {for (TypeFilter typeFilter : typeFiltersFor(filter)) {scanner.addIncludeFilter(typeFilter);}}for (AnnotationAttributes filter : componentScan.getAnnotationArray("excludeFilters")) {for (TypeFilter typeFilter : typeFiltersFor(filter)) {scanner.addExcludeFilter(typeFilter);}}boolean lazyInit = componentScan.getBoolean("lazyInit");if (lazyInit) {scanner.getBeanDefinitionDefaults().setLazyInit(true);}Set<String> basePackages = new LinkedHashSet<>();String[] basePackagesArray = componentScan.getStringArray("basePackages");for (String pkg : basePackagesArray) {String[] tokenized = StringUtils.tokenizeToStringArray(this.environment.resolvePlaceholders(pkg),ConfigurableApplicationContext.CONFIG_LOCATION_DELIMITERS);Collections.addAll(basePackages, tokenized);}for (Class<?> clazz : componentScan.getClassArray("basePackageClasses")) {basePackages.add(ClassUtils.getPackageName(clazz));}if (basePackages.isEmpty()) {basePackages.add(ClassUtils.getPackageName(declaringClass));}scanner.addExcludeFilter(new AbstractTypeHierarchyTraversingFilter(false, false) {@Overrideprotected boolean matchClassName(String className) {return declaringClass.equals(className);}});return scanner.doScan(StringUtils.toStringArray(basePackages)); // 掃描指定路徑下的bean }

scanner.doScan(StringUtils.toStringArray(basePackages))

protected Set<BeanDefinitionHolder> doScan(String... basePackages) {Assert.notEmpty(basePackages, "At least one base package must be specified");Set<BeanDefinitionHolder> beanDefinitions = new LinkedHashSet<>();// 循環(huán)basePackagefor (String basePackage : basePackages) {Set<BeanDefinition> candidates = findCandidateComponents(basePackage); // 掃描basePackage路徑下所有的bean,返回BeanDefinition對象Set集合for (BeanDefinition candidate : candidates) {ScopeMetadata scopeMetadata = this.scopeMetadataResolver.resolveScopeMetadata(candidate);candidate.setScope(scopeMetadata.getScopeName());String beanName = this.beanNameGenerator.generateBeanName(candidate, this.registry);if (candidate instanceof AbstractBeanDefinition) {postProcessBeanDefinition((AbstractBeanDefinition) candidate, beanName);}if (candidate instanceof AnnotatedBeanDefinition) {AnnotationConfigUtils.processCommonDefinitionAnnotations((AnnotatedBeanDefinition) candidate);}if (checkCandidate(beanName, candidate)) {BeanDefinitionHolder definitionHolder = new BeanDefinitionHolder(candidate, beanName);definitionHolder =AnnotationConfigUtils.applyScopedProxyMode(scopeMetadata, definitionHolder, this.registry);beanDefinitions.add(definitionHolder);registerBeanDefinition(definitionHolder, this.registry); // 注冊bean到beanDefinitionMap中}}}return beanDefinitions; }

registerBeanDefinition(definitionHolder, this.registry)

看到BeanDefinitionReaderUtils.registerBeanDefinition(definitionHolder, registry)這個方法調(diào) 用,其實就是在上一節(jié)已經(jīng)講過了,就是將bean注冊到BeanDefinitionMap中 protected void registerBeanDefinition(BeanDefinitionHolder definitionHolder, BeanDefinitionRegistry registry) {BeanDefinitionReaderUtils.registerBeanDefinition(definitionHolder, registry); }

registerBeanPostProcessors(beanFactory)

protected void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory) {PostProcessorRegistrationDelegate.registerBeanPostProcessors(beanFactory, this); }

?

PostProcessorRegistrationDelegate.registerBeanPostProcessors(beanFactory, this)

public static void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory, AbstractApplicationContext applicationContext) {// 查詢beanDefinitionMap中所有實現(xiàn)了BeanPostProcessor接口的類名稱數(shù)組String[] 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.// 將beanFactory作為BeanPostProcessors作為后置處理器添加到的beanPostProcessors中int beanProcessorTargetCount = beanFactory.getBeanPostProcessorCount() + 1 + postProcessorNames.length;beanFactory.addBeanPostProcessor(new BeanPostProcessorChecker(beanFactory, beanProcessorTargetCount));// Separate between BeanPostProcessors that implement PriorityOrdered,// Ordered, and the rest.// 對實現(xiàn)了不同接口的后置處理器進(jìn)行分類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 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);}}// 注冊實現(xiàn)了PriorityOrdered接口的處理器// First, register the BeanPostProcessors that implement PriorityOrdered.sortPostProcessors(priorityOrderedPostProcessors, beanFactory);registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors);// Next, register the BeanPostProcessors that implement Ordered.// 注冊實現(xiàn)了Ordered接口的處理器List<BeanPostProcessor> orderedPostProcessors = new ArrayList<>();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.// 注冊既沒有實現(xiàn)PriorityOrdered接口的也沒有實現(xiàn)Ordered接口的處理器List<BeanPostProcessor> nonOrderedPostProcessors = new ArrayList<>();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)); }

registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors)

private static void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory, List<BeanPostProcessor> postProcessors) {for (BeanPostProcessor postProcessor : postProcessors) {beanFactory.addBeanPostProcessor(postProcessor);} }

beanFactory.addBeanPostProcessor(postProcessor)

@Override public void addBeanPostProcessor(BeanPostProcessor beanPostProcessor) {Assert.notNull(beanPostProcessor, "BeanPostProcessor must not be null");// Remove from old position, if anythis.beanPostProcessors.remove(beanPostProcessor);// Track whether it is instantiation/destruction awareif (beanPostProcessor instanceof InstantiationAwareBeanPostProcessor) {this.hasInstantiationAwareBeanPostProcessors = true;}if (beanPostProcessor instanceof DestructionAwareBeanPostProcessor) {this.hasDestructionAwareBeanPostProcessors = true;}// Add to end of listthis.beanPostProcessors.add(beanPostProcessor); }

finishBeanFactoryInitialization(beanFactory)

protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory) {// Initialize conversion service for this context.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.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) {getBean(weaverAwareName);}// Stop using the temporary ClassLoader for type matching.beanFactory.setTempClassLoader(null);// Allow for caching all bean definition metadata, not expecting further changes.beanFactory.freezeConfiguration();// Instantiate all remaining (non-lazy-init) singletons.// 初始化非懶加載的beanbeanFactory.preInstantiateSingletons(); }

beanFactory.preInstantiateSingletons()

@Override public void preInstantiateSingletons() throws BeansException {if (logger.isDebugEnabled()) {logger.debug("Pre-instantiating singletons in " + this);}// 所有bean的beanName// 可能需要實例化的class(lazy、scope):懶加載的不實例化,非單例的不實例化List<String> beanNames = new ArrayList<>(this.beanDefinitionNames);// 觸發(fā)所有非延遲加載單例beans的初始化,主要步驟為調(diào)用getBean()方法來對bean進(jìn)行初始化for (String beanName : beanNames) {RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) { // 當(dāng)BeanDefinition是抽象的,并且不是單例的,并且是懶加載的就不實例化beanif (isFactoryBean(beanName)) { // 當(dāng)該bean繼承了FactoryBean時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); // 初始化該bean}}}// 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();}}} }

getBean(beanName)

@Override public Object getBean(String name) throws BeansException {return doGetBean(name, null, null, false); }

doGetBean(name, null, null, false)

protected <T> T doGetBean(final String name, @Nullable final Class<T> requiredType,@Nullable final Object[] args, boolean typeCheckOnly) throws BeansException {// 這里不直接name主要是因為alias和FactoryBean的原因// 1、別名需要轉(zhuǎn)換成真正的beanName// 2、如果傳入的name是實現(xiàn)了FactoryBean接口的話,那么傳入的name是以&開頭的,需要將首字母&移除final String beanName = transformedBeanName(name); // 獲取beanNameObject bean;// 這個方法在初始化的時候會調(diào)用,在getBean的時候也會調(diào)用,原因://// 嘗試從三級緩存中獲取bean實例//// Spring循環(huán)依賴的原理:// 在創(chuàng)建單例bean的時候會存在依賴注入的情況,為了避免循環(huán)依賴,Spring在創(chuàng)建bean的原則是不等bean創(chuàng)建完成就會將創(chuàng)建bean的ObjectFactory提早曝光,添加到singletonFactories中// 將ObjectFactory加入到緩存中,一旦下一個bean創(chuàng)建的時候需要依賴注入上個bean則直接從緩存中獲取ObjectFactoryObject sharedInstance = getSingleton(beanName); // 根據(jù)beanName嘗試從三級緩存中獲取bean實例// 當(dāng)三級緩存中存在此bean,表示當(dāng)前該bean已創(chuàng)建完成 || 正在創(chuàng)建if (sharedInstance != null && args == null) {if (logger.isDebugEnabled()) {// 該bean在singletonFactories,但是還未初始化,因為此bean存在循環(huán)依賴if (isSingletonCurrentlyInCreation(beanName)) {logger.debug("Returning eagerly caFFched instance of singleton bean '" + beanName +"' that is not fully initialized yet - a consequence of a circular reference");}else {logger.debug("Returning cached instance of singleton bean '" + beanName + "'");}}// 返回對應(yīng)的實例,有時候存在諸如BeanFactory的情況并不是直接返回實例本身而是返回指定方法返回的實例// 如果sharedInstance是普通的單例bean,下面的方法會直接返回,但如果sharedInstance是FactoryBean類型的,// 則需要調(diào)用getObject工廠方法獲取bean實例,如果用戶想獲取FactoryBean本身,這里也不會做特別的處理bean = getObjectForBeanInstance(sharedInstance, name, beanName, null);}// 當(dāng)bean還未創(chuàng)建else {// Fail if we're already creating this bean instance:// We're assumably within a circular reference.// 如果該bean的scope是原型(phototype)不應(yīng)該在初始化的時候創(chuàng)建if (isPrototypeCurrentlyInCreation(beanName)) {throw new BeanCurrentlyInCreationException(beanName);}// Check if bean definition exists in this factory.// 檢查當(dāng)前容器是否有父容器BeanFactory parentBeanFactory = getParentBeanFactory();// 如果父容器中存在此bean的實例,直接從父容器中獲取bean的實例并返回// 父子容器:Spring和SpringMVC都是一個容器,Spring容器是父容器,SpringMVC是子容器// controller的bean放在SpringMVC的子容器中,service、mapper放在Spring父容器中// 子容器可以訪問父容器中的bean實例,父容器不可以訪問子容器中的實例// controller中可以注入service的依賴,但是service不能注入controller的依賴if (parentBeanFactory != null && !containsBeanDefinition(beanName)) {// Not found -> check parent.String nameToLookup = originalBeanName(name);if (parentBeanFactory instanceof AbstractBeanFactory) {return ((AbstractBeanFactory) parentBeanFactory).doGetBean(nameToLookup, requiredType, args, typeCheckOnly);}else if (args != null) {// Delegation to parent with explicit args.return (T) parentBeanFactory.getBean(nameToLookup, args);}else {// No args -> delegate to standard getBean method.return parentBeanFactory.getBean(nameToLookup, requiredType);}}if (!typeCheckOnly) {// 添加到alreadyCreated set集合當(dāng)中,表示他已經(jīng)創(chuàng)建過了markBeanAsCreated(beanName);}try {// 從父容器中的BeanDefinitionMap和子容器中的BeanDefinitionMap合并的BeanDefinitionMap中獲取BeanDefinition對象final RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);checkMergedBeanDefinition(mbd, beanName, args);// Guarantee initialization of beans that the current bean depends on.// 獲取當(dāng)前bean依賴注入的的屬性,bean的初始化之前里面依賴的屬性必須先初始化String[] dependsOn = mbd.getDependsOn();if (dependsOn != null) {for (String dep : dependsOn) {if (isDependent(beanName, dep)) {throw new BeanCreationException(mbd.getResourceDescription(), beanName,"Circular depends-on relationship between '" + beanName + "' and '" + dep + "'");}registerDependentBean(dep, beanName);try {getBean(dep);}catch (NoSuchBeanDefinitionException ex) {throw new BeanCreationException(mbd.getResourceDescription(), beanName,"'" + beanName + "' depends on missing bean '" + dep + "'", ex);}}}// Create bean instance.// 正式開始創(chuàng)建bean實例if (mbd.isSingleton()) { // 當(dāng)該bean的scope為singleton或者為空時sharedInstance = getSingleton(beanName, () -> { // 從三級緩存中獲取bean實例try {return createBean(beanName, mbd, args); // 真正創(chuàng)建bean}catch (BeansException ex) {// Explicitly remove instance from singleton cache: It might have been put there// eagerly by the creation process, to allow for circular reference resolution.// Also remove any beans that received a temporary reference to the bean.destroySingleton(beanName);throw ex;}});bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);}// 創(chuàng)建 prototype 類型的 bean 實例else if (mbd.isPrototype()) {// It's a prototype -> create a new instance.Object prototypeInstance = null;try {beforePrototypeCreation(beanName);prototypeInstance = createBean(beanName, mbd, args);}finally {afterPrototypeCreation(beanName);}bean = getObjectForBeanInstance(prototypeInstance, name, beanName, mbd);}// 創(chuàng)建其他類型的bean實例else {String scopeName = mbd.getScope();final Scope scope = this.scopes.get(scopeName);if (scope == null) {throw new IllegalStateException("No Scope registered for scope name '" + scopeName + "'");}try {Object scopedInstance = scope.get(beanName, () -> {beforePrototypeCreation(beanName);try {return createBean(beanName, mbd, args);}finally {afterPrototypeCreation(beanName);}});bean = getObjectForBeanInstance(scopedInstance, name, beanName, mbd);}catch (IllegalStateException ex) {throw new BeanCreationException(beanName,"Scope '" + scopeName + "' is not active for the current thread; consider " +"defining a scoped proxy for this bean if you intend to refer to it from a singleton",ex);}}}catch (BeansException ex) {cleanupAfterBeanCreationFailure(beanName);throw ex;}}// Check if required type matches the type of the actual bean instance.// 類型轉(zhuǎn)換if (requiredType != null && !requiredType.isInstance(bean)) {try {T convertedBean = getTypeConverter().convertIfNecessary(bean, requiredType);if (convertedBean == null) {throw new BeanNotOfRequiredTypeException(name, requiredType, bean.getClass());}return convertedBean;}catch (TypeMismatchException ex) {if (logger.isDebugEnabled()) {logger.debug("Failed to convert bean '" + name + "' to required type '" +ClassUtils.getQualifiedName(requiredType) + "'", ex);}throw new BeanNotOfRequiredTypeException(name, requiredType, bean.getClass());}}return (T) bean; }

getSingleton(beanName)

@Override @Nullable public Object getSingleton(String beanName) {return getSingleton(beanName, true); }

getSingleton(beanName, true)

@Nullable protected Object getSingleton(String beanName, boolean allowEarlyReference) { // allowEarlyReference表示是否允許從singletonFactories中通過getObject拿到對象// 嘗試從三級緩存中獲取bean實例Object singletonObject = this.singletonObjects.get(beanName); // 從一級緩存中獲取bean// 如果一級緩存中不存在該bean實例 && 該bean正在創(chuàng)建中if (singletonObject == null && isSingletonCurrentlyInCreation(beanName)) { // isSingletonCurrentlyInCreation(beanName)判斷這個bean是否在創(chuàng)建過程中,對象是否有循環(huán)依賴synchronized (this.singletonObjects) {singletonObject = this.earlySingletonObjects.get(beanName); // 嘗試從二級緩存中獲取bean實例// 如果二級緩存中不存在giantbean實例 && 允許從singletonFactories從獲取bean實例if (singletonObject == null && allowEarlyReference) {ObjectFactory<?> singletonFactory = this.singletonFactories.get(beanName); // 從三級緩存中獲取bean實例// 如果bean存在,將該bean實例從三級緩存升級到二級緩存中,并且從三級緩存中刪除if (singletonFactory != null) {singletonObject = singletonFactory.getObject();this.earlySingletonObjects.put(beanName, singletonObject);this.singletonFactories.remove(beanName);}}}}return singletonObject; }

createBean(beanName, mbd, args)

@Override protected Object createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)throws BeanCreationException {if (logger.isDebugEnabled()) {logger.debug("Creating instance of bean '" + beanName + "'");}RootBeanDefinition mbdToUse = mbd;// Make sure bean class is actually resolved at this point, and// clone the bean definition in case of a dynamically resolved Class// which cannot be stored in the shared merged bean definition.// 確認(rèn)bean真實加載進(jìn)行來了Class<?> resolvedClass = resolveBeanClass(mbd, beanName);if (resolvedClass != null && !mbd.hasBeanClass() && mbd.getBeanClassName() != null) {mbdToUse = new RootBeanDefinition(mbd);mbdToUse.setBeanClass(resolvedClass);}// Prepare method overrides.try {mbdToUse.prepareMethodOverrides();}catch (BeanDefinitionValidationException ex) {throw new BeanDefinitionStoreException(mbdToUse.getResourceDescription(),beanName, "Validation of method overrides failed", ex);}try {// Give BeanPostProcessors a chance to return a proxy instead of the target bean instance.// 主要是來執(zhí)行實現(xiàn)了InstantiationAwareBeanPostProcessor接口的BeanPostProcesser,但是返回的bean始終為null// AOP核心方法,用來處理使用@Aspect注解標(biāo)識的bean,以便后面生成動態(tài)代理Object bean = resolveBeforeInstantiation(beanName, mbdToUse);// 生成的bean實例存在就返回if (bean != null) {return bean;}}catch (Throwable ex) {throw new BeanCreationException(mbdToUse.getResourceDescription(), beanName,"BeanPostProcessor before instantiation of bean failed", ex);}try {// 實例化beanObject beanInstance = doCreateBean(beanName, mbdToUse, args);if (logger.isDebugEnabled()) {logger.debug("Finished creating instance of bean '" + beanName + "'");}return beanInstance;}catch (BeanCreationException | ImplicitlyAppearedSingletonException ex) {// A previously detected exception with proper bean creation context already,// or illegal singleton state to be communicated up to DefaultSingletonBeanRegistry.throw ex;}catch (Throwable ex) {throw new BeanCreationException(mbdToUse.getResourceDescription(), beanName, "Unexpected exception during bean creation", ex);} }

resolveBeforeInstantiation(beanName, mbdToUse)

@Nullable protected Object resolveBeforeInstantiation(String beanName, RootBeanDefinition mbd) {Object bean = null;// 檢測是否被解析過if (!Boolean.FALSE.equals(mbd.beforeInstantiationResolved)) {// Make sure bean class is actually resolved at this point.// hasInstantiationAwareBeanPostProcessors()是來判斷容器中是否有InstantiationAwareBeanPostProcessor的實現(xiàn)beanif (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {Class<?> targetType = determineTargetType(beanName, mbd); // 獲取bean的目標(biāo)類型if (targetType != null) {// 執(zhí)行實現(xiàn)了InstantiationAwareBeanPostProcessor接口的BeanPostProcessor中的前置處理方法postProcessBeforeInstantiation方法bean = applyBeanPostProcessorsBeforeInstantiation(targetType, beanName);if (bean != null) {// 執(zhí)行實現(xiàn)了InstantiationAwareBeanPostProcessor接口的BeanPostProcessor中的后置處理方法postProcessAfterInitialization方法bean = applyBeanPostProcessorsAfterInitialization(bean, beanName);}}}mbd.beforeInstantiationResolved = (bean != null);}return bean; }

applyBeanPostProcessorsBeforeInstantiation(targetType, beanName)

@Nullable protected Object applyBeanPostProcessorsBeforeInstantiation(Class<?> beanClass, String beanName) {for (BeanPostProcessor bp : getBeanPostProcessors()) {if (bp instanceof InstantiationAwareBeanPostProcessor) {InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;Object result = ibp.postProcessBeforeInstantiation(beanClass, beanName);if (result != null) {return result;}}}return null; }

applyBeanPostProcessorsAfterInitialization(bean, beanName)

@Override public Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName)throws BeansException {Object result = existingBean;for (BeanPostProcessor processor : getBeanPostProcessors()) {Object current = processor.postProcessAfterInitialization(result, beanName);if (current == null) {return result;}result = current;}return result; }

doCreateBean(beanName, mbdToUse, args)

/*** 初始化bean實例(解決循環(huán)依賴問題)*/ protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args)throws BeanCreationException {// Instantiate the bean.BeanWrapper instanceWrapper = null;if (mbd.isSingleton()) {// 調(diào)用bean的構(gòu)造方法進(jìn)行初始化,經(jīng)過這一步,bean屬性并沒有被賦值,只是一個空殼,這是bean初始化的【早期對象】instanceWrapper = this.factoryBeanInstanceCache.remove(beanName);}// 創(chuàng)建bean實例轉(zhuǎn)化成BeanWrapper對象if (instanceWrapper == null) {instanceWrapper = createBeanInstance(beanName, mbd, args);}final Object bean = instanceWrapper.getWrappedInstance();Class<?> beanType = instanceWrapper.getWrappedClass();if (beanType != NullBean.class) {mbd.resolvedTargetType = beanType;}// Allow post-processors to modify the merged bean definition.synchronized (mbd.postProcessingLock) {if (!mbd.postProcessed) {try {// 處理bean中實現(xiàn)了MergedBeanDefinitionPostProcessor后置處理器的類中的postProcessMergedBeanDefinition方法applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);}catch (Throwable ex) {throw new BeanCreationException(mbd.getResourceDescription(), beanName,"Post-processing of merged bean definition failed", ex);}mbd.postProcessed = true;}}// Eagerly cache singletons to be able to resolve circular references// even when triggered by lifecycle interfaces like BeanFactoryAware.// 判斷bean是否存在循環(huán)依賴// 如果當(dāng)前bean是單例,且支持循環(huán)依賴,且當(dāng)前bean正在創(chuàng)建,通過往singletonFactories添加一個objectFactory,這樣后期如果有其他bean依賴該bean 可以從singletonFactories獲取到beanboolean earlySingletonExposure = (mbd.isSingleton() && this.allowCircularReferences && isSingletonCurrentlyInCreation(beanName));if (earlySingletonExposure) {if (logger.isDebugEnabled()) {logger.debug("Eagerly caching bean '" + beanName +"' to allow for resolving potential circular references");}// 解決Spring循環(huán)依賴問題// 添加工廠對象到singletonFactories緩存中【提前暴露早期對象】addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean));}// Initialize the bean instance.// 初始化bean實例Object exposedObject = bean;try {// 給已經(jīng)已經(jīng)初始化的屬性賦值,包括完成bean的依賴注入populateBean(beanName, mbd, instanceWrapper);// 初始化bean實例exposedObject = initializeBean(beanName, exposedObject, mbd);}catch (Throwable ex) {if (ex instanceof BeanCreationException && beanName.equals(((BeanCreationException) ex).getBeanName())) {throw (BeanCreationException) ex;}else {throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Initialization of bean failed", ex);}}// 解決循環(huán)依賴if (earlySingletonExposure) {Object earlySingletonReference = getSingleton(beanName, false);if (earlySingletonReference != null) {if (exposedObject == bean) {exposedObject = earlySingletonReference;}else if (!this.allowRawInjectionDespiteWrapping && hasDependentBean(beanName)) {String[] dependentBeans = getDependentBeans(beanName);Set<String> actualDependentBeans = new LinkedHashSet<>(dependentBeans.length);for (String dependentBean : dependentBeans) {if (!removeSingletonIfCreatedForTypeCheckOnly(dependentBean)) {actualDependentBeans.add(dependentBean);}}if (!actualDependentBeans.isEmpty()) {throw new BeanCurrentlyInCreationException(beanName,"Bean with name '" + beanName + "' has been injected into other beans [" +StringUtils.collectionToCommaDelimitedString(actualDependentBeans) +"] in its raw version as part of a circular reference, but has eventually been " +"wrapped. This means that said other beans do not use the final version of the " +"bean. This is often the result of over-eager type matching - consider using " +"'getBeanNamesOfType' with the 'allowEagerInit' flag turned off, for example.");}}}}// Register bean as disposable.// 銷毀try {registerDisposableBeanIfNecessary(beanName, bean, mbd);}catch (BeanDefinitionValidationException ex) {throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Invalid destruction signature", ex);}return exposedObject; }

applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName)

protected void applyMergedBeanDefinitionPostProcessors(RootBeanDefinition mbd, Class<?> beanType, String beanName) {for (BeanPostProcessor bp : getBeanPostProcessors()) {if (bp instanceof MergedBeanDefinitionPostProcessor) {MergedBeanDefinitionPostProcessor bdp = (MergedBeanDefinitionPostProcessor) bp;bdp.postProcessMergedBeanDefinition(mbd, beanType, beanName);}} }

bdp.postProcessMergedBeanDefinition(mbd, beanType, beanName)
MergedBeanDefinitionPostProcessor的實現(xiàn)類可以用來處理@Autowired、@Value、@PostConstruct、@PreDestroy、@Scheduled等Spring提供的注解

下面以實現(xiàn)類AutowiredAnnotationBeanPostProcessor用來處理@Autowired、@Value注解舉例

當(dāng)bdp的實現(xiàn)類是AutowiredAnnotationBeanPostProcessor時,將調(diào)用AutowiredAnnotationBeanPostProcessor重寫的postProcessMergedBeanDefinition方法

@Override public void postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, Class<?> beanType, String beanName) {InjectionMetadata metadata = findAutowiringMetadata(beanName, beanType, null);metadata.checkConfigMembers(beanDefinition); }

findAutowiringMetadata(beanName, beanType, null)

private InjectionMetadata findAutowiringMetadata(String beanName, Class<?> clazz, @Nullable PropertyValues pvs) {// Fall back to class name as cache key, for backwards compatibility with custom callers.String cacheKey = (StringUtils.hasLength(beanName) ? beanName : clazz.getName());// Quick check on the concurrent map first, with minimal locking.InjectionMetadata metadata = this.injectionMetadataCache.get(cacheKey);if (InjectionMetadata.needsRefresh(metadata, clazz)) {synchronized (this.injectionMetadataCache) {metadata = this.injectionMetadataCache.get(cacheKey);if (InjectionMetadata.needsRefresh(metadata, clazz)) {if (metadata != null) {metadata.clear(pvs);}// 解析等待依賴注入類的所有屬性,構(gòu)建InjectionMetadata對象,它是通過分析類中所有屬性和所有方法中是否有該注解metadata = buildAutowiringMetadata(clazz);this.injectionMetadataCache.put(cacheKey, metadata);}}}return metadata; }

buildAutowiringMetadata(clazz)

private InjectionMetadata buildAutowiringMetadata(final Class<?> clazz) {List<InjectionMetadata.InjectedElement> elements = new ArrayList<>();Class<?> targetClass = clazz;do {final List<InjectionMetadata.InjectedElement> currElements = new ArrayList<>();// 掃描所有屬性ReflectionUtils.doWithLocalFields(targetClass, field -> {// 通過分析屬于一個字段的所有注解來查找@Autowired注解AnnotationAttributes ann = findAutowiredAnnotation(field);if (ann != null) {if (Modifier.isStatic(field.getModifiers())) {if (logger.isWarnEnabled()) {logger.warn("Autowired annotation is not supported on static fields: " + field);}return;}boolean required = determineRequiredStatus(ann);currElements.add(new AutowiredFieldElement(field, required));}});// 掃描所有方法ReflectionUtils.doWithLocalMethods(targetClass, method -> {Method bridgedMethod = BridgeMethodResolver.findBridgedMethod(method);if (!BridgeMethodResolver.isVisibilityBridgeMethodPair(method, bridgedMethod)) {return;}// 通過分析屬于一個方法的所有注解來查找@Autowired注解AnnotationAttributes ann = findAutowiredAnnotation(bridgedMethod);if (ann != null && method.equals(ClassUtils.getMostSpecificMethod(method, clazz))) {if (Modifier.isStatic(method.getModifiers())) {if (logger.isWarnEnabled()) {logger.warn("Autowired annotation is not supported on static methods: " + method);}return;}if (method.getParameterCount() == 0) {if (logger.isWarnEnabled()) {logger.warn("Autowired annotation should only be used on methods with parameters: " +method);}}boolean required = determineRequiredStatus(ann);PropertyDescriptor pd = BeanUtils.findPropertyForMethod(bridgedMethod, clazz);currElements.add(new AutowiredMethodElement(method, required, pd));}});elements.addAll(0, currElements);targetClass = targetClass.getSuperclass();}while (targetClass != null && targetClass != Object.class);return new InjectionMetadata(clazz, elements); }

populateBean(beanName, mbd, instanceWrapper)

/*** 給已經(jīng)已經(jīng)初始化的屬性賦值,包括完成bean的依賴注入* 這個方法最重要就是最后一個方法applyPropertyValues(beanName, mbd, bw, pvs):為屬性賦值*/ protected void populateBean(String beanName, RootBeanDefinition mbd, @Nullable BeanWrapper bw) {// 這一大段代碼省略......// 為屬性賦值if (pvs != null) {applyPropertyValues(beanName, mbd, bw, pvs);} }

applyPropertyValues(beanName, mbd, bw, pvs)

protected void applyPropertyValues(String beanName, BeanDefinition mbd, BeanWrapper bw, PropertyValues pvs) {// 這一大段代碼省略......// 為當(dāng)前bean中屬性賦值,包括依賴注入的屬性O(shè)bject resolvedValue = valueResolver.resolveValueIfNecessary(pv, originalValue);// 這一大段代碼省略...... }

valueResolver.resolveValueIfNecessary(pv, originalValue)

/*** 如果當(dāng)前初始化的bean有屬性需要注入的,將會調(diào)用resolveReference(argName, ref)來返回需要注入的bean*/ public Object resolveValueIfNecessary(Object argName, @Nullable Object value) {// 獲取需要依賴注入屬性的值if (value instanceof RuntimeBeanReference) {RuntimeBeanReference ref = (RuntimeBeanReference) value;return resolveReference(argName, ref);}// 這一大段代碼省略...... }

resolveReference(argName, ref)

private Object resolveReference(Object argName, RuntimeBeanReference ref) {try {Object bean;String refName = ref.getBeanName();refName = String.valueOf(doEvaluate(refName));if (ref.isToParent()) {if (this.beanFactory.getParentBeanFactory() == null) {throw new BeanCreationException(this.beanDefinition.getResourceDescription(), this.beanName,"Can't resolve reference to bean '" + refName +"' in parent factory: no parent factory available");}bean = this.beanFactory.getParentBeanFactory().getBean(refName);}else {// 當(dāng)前初始化bean主要為屬性注入另外一個bean,調(diào)用getBean()方法獲取需要注入的bean,最終注入到屬性中bean = this.beanFactory.getBean(refName);this.beanFactory.registerDependentBean(refName, this.beanName);}if (bean instanceof NullBean) {bean = null;}return bean;}catch (BeansException ex) {throw new BeanCreationException(this.beanDefinition.getResourceDescription(), this.beanName,"Cannot resolve reference to bean '" + ref.getBeanName() + "' while setting " + argName, ex);} }

getSingleton(beanName, singletonFactory)

public Object getSingleton(String beanName, ObjectFactory<?> singletonFactory) {Assert.notNull(beanName, "Bean name must not be null");synchronized (this.singletonObjects) {// 嘗試從一級緩存中獲取bean實例Object singletonObject = this.singletonObjects.get(beanName);if (singletonObject == null) {if (this.singletonsCurrentlyInDestruction) {throw new BeanCreationNotAllowedException(beanName,"Singleton bean creation not allowed while singletons of this factory are in destruction " +"(Do not request a bean from a BeanFactory in a destroy method implementation!)");}if (logger.isDebugEnabled()) {logger.debug("Creating shared instance of singleton bean '" + beanName + "'");}// 將beanName添加到singletonsCurrentlyInCreation集合中,// 用于表明beanName對應(yīng)的bean正在創(chuàng)建中beforeSingletonCreation(beanName);boolean newSingleton = false;boolean recordSuppressedExceptions = (this.suppressedExceptions == null);if (recordSuppressedExceptions) {this.suppressedExceptions = new LinkedHashSet<>();}try {// 調(diào)用FactoryBean接口中的getObject()方法獲取bean實例singletonObject = singletonFactory.getObject();newSingleton = true;}catch (IllegalStateException ex) {// Has the singleton object implicitly appeared in the meantime ->// if yes, proceed with it since the exception indicates that state.singletonObject = this.singletonObjects.get(beanName);if (singletonObject == null) {throw ex;}}catch (BeanCreationException ex) {if (recordSuppressedExceptions) {for (Exception suppressedException : this.suppressedExceptions) {ex.addRelatedCause(suppressedException);}}throw ex;}finally {if (recordSuppressedExceptions) {this.suppressedExceptions = null;}// 從singletonsCurrentlyInCreation實現(xiàn)FactoryBean接口中的bean,表明實現(xiàn)了FactoryBean接口的bean獲取完畢afterSingletonCreation(beanName);}if (newSingleton) {// 最后將singletonObject添加到singletonObjects一級緩存中,同時將二級、三級緩存中的bean刪除addSingleton(beanName, singletonObject);}}return singletonObject;} }

addSingleton(beanName, singletonObject)

/*** 將singletonObject添加到singletonObjects一級緩存中,同時將二級、三級緩存中的bean刪除*/ protected void addSingleton(String beanName, Object singletonObject) {synchronized (this.singletonObjects) {this.singletonObjects.put(beanName, singletonObject);this.singletonFactories.remove(beanName);this.earlySingletonObjects.remove(beanName);this.registeredSingletons.add(beanName);} }

?

總結(jié)

以上是生活随笔為你收集整理的AnnotationConfigApplicationContext容器初始化的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

亚洲精品一区二区三区在线 | v一区无码内射国产 | 日韩成人一区二区三区在线观看 | 久久精品人人做人人综合试看 | 性欧美牲交在线视频 | 乱人伦人妻中文字幕无码 | 精品午夜福利在线观看 | 亚洲欧美日韩成人高清在线一区 | 欧美一区二区三区 | 未满小14洗澡无码视频网站 | 嫩b人妻精品一区二区三区 | 国产乱码精品一品二品 | 88国产精品欧美一区二区三区 | 青青青爽视频在线观看 | 亚洲s码欧洲m码国产av | 九月婷婷人人澡人人添人人爽 | 久久久中文字幕日本无吗 | 久久熟妇人妻午夜寂寞影院 | 久久国产精品精品国产色婷婷 | 国产亚洲精品久久久久久大师 | 亚洲春色在线视频 | 久久天天躁狠狠躁夜夜免费观看 | 免费观看激色视频网站 | 中文无码成人免费视频在线观看 | 无遮无挡爽爽免费视频 | 中文字幕精品av一区二区五区 | 少妇人妻大乳在线视频 | 久久久国产精品无码免费专区 | 午夜无码区在线观看 | 亚洲国产成人av在线观看 | 夜精品a片一区二区三区无码白浆 | 搡女人真爽免费视频大全 | 亚洲欧美日韩成人高清在线一区 | 久久婷婷五月综合色国产香蕉 | 亚洲爆乳无码专区 | 最新国产乱人伦偷精品免费网站 | 亚洲精品久久久久avwww潮水 | 又大又紧又粉嫩18p少妇 | 激情国产av做激情国产爱 | 久久久婷婷五月亚洲97号色 | 久久无码中文字幕免费影院蜜桃 | 亚洲国产欧美国产综合一区 | 国产精华av午夜在线观看 | 性色欲网站人妻丰满中文久久不卡 | 欧美丰满熟妇xxxx | 亚洲欧美精品aaaaaa片 | 亚洲国产精品一区二区美利坚 | 青青青手机频在线观看 | 欧美丰满熟妇xxxx性ppx人交 | 亚洲七七久久桃花影院 | 国产av无码专区亚洲awww | 欧美 丝袜 自拍 制服 另类 | 未满小14洗澡无码视频网站 | 日韩人妻少妇一区二区三区 | 欧美丰满熟妇xxxx性ppx人交 | 国产性生交xxxxx无码 | 久久五月精品中文字幕 | 无码人妻出轨黑人中文字幕 | 亚洲春色在线视频 | 亚洲综合伊人久久大杳蕉 | 国产精品手机免费 | 夫妻免费无码v看片 | 日本精品人妻无码免费大全 | 中文字幕无码av激情不卡 | 久久无码人妻影院 | 国产在线一区二区三区四区五区 | 樱花草在线社区www | 国产麻豆精品精东影业av网站 | 免费无码的av片在线观看 | 亚洲色欲色欲天天天www | 天天综合网天天综合色 | 亚洲精品国产精品乱码视色 | 精品乱码久久久久久久 | 永久免费观看美女裸体的网站 | 波多野结衣乳巨码无在线观看 | 欧美丰满少妇xxxx性 | 亚洲小说春色综合另类 | 内射爽无广熟女亚洲 | 动漫av网站免费观看 | 久久久久久久久蜜桃 | 亚洲日本一区二区三区在线 | 99久久精品国产一区二区蜜芽 | 亚洲国精产品一二二线 | 男女猛烈xx00免费视频试看 | 欧美精品免费观看二区 | 亚洲国产欧美国产综合一区 | 久久久久久久久蜜桃 | 日韩少妇白浆无码系列 | 欧美熟妇另类久久久久久不卡 | 国产亚洲欧美在线专区 | 人妻体内射精一区二区三四 | 大乳丰满人妻中文字幕日本 | 色五月丁香五月综合五月 | 亚洲日韩精品欧美一区二区 | 综合人妻久久一区二区精品 | 精品国产福利一区二区 | 亚洲中文字幕无码中字 | 久久综合给合久久狠狠狠97色 | 2019nv天堂香蕉在线观看 | 久久伊人色av天堂九九小黄鸭 | 亚洲精品国偷拍自产在线观看蜜桃 | 夜精品a片一区二区三区无码白浆 | 欧美激情综合亚洲一二区 | 无码人中文字幕 | 日本乱偷人妻中文字幕 | 天堂亚洲免费视频 | 98国产精品综合一区二区三区 | 国产精品亚洲综合色区韩国 | 精品国产福利一区二区 | 免费无码一区二区三区蜜桃大 | 日本www一道久久久免费榴莲 | 曰本女人与公拘交酡免费视频 | 国产亚洲欧美在线专区 | 成人免费视频视频在线观看 免费 | 荫蒂被男人添的好舒服爽免费视频 | 国产成人一区二区三区在线观看 | 婷婷丁香五月天综合东京热 | 欧美老妇与禽交 | 99久久人妻精品免费二区 | 国产免费无码一区二区视频 | 亚洲欧洲日本无在线码 | 扒开双腿疯狂进出爽爽爽视频 | 亚洲精品国产品国语在线观看 | 国产艳妇av在线观看果冻传媒 | 国产色精品久久人妻 | 久久久久国色av免费观看性色 | 红桃av一区二区三区在线无码av | 野狼第一精品社区 | 少妇性l交大片欧洲热妇乱xxx | 国产激情无码一区二区 | 亚洲狠狠婷婷综合久久 | 国产三级久久久精品麻豆三级 | 亚洲人亚洲人成电影网站色 | 亚洲乱码中文字幕在线 | 色婷婷av一区二区三区之红樱桃 | 天天躁夜夜躁狠狠是什么心态 | 国产亚洲美女精品久久久2020 | 97se亚洲精品一区 | 无套内射视频囯产 | 亚洲综合伊人久久大杳蕉 | 捆绑白丝粉色jk震动捧喷白浆 | 在线播放亚洲第一字幕 | 丰满岳乱妇在线观看中字无码 | 国产精品无码久久av | 一本久久伊人热热精品中文字幕 | 亚洲熟妇色xxxxx欧美老妇 | 女人被爽到呻吟gif动态图视看 | 搡女人真爽免费视频大全 | 强伦人妻一区二区三区视频18 | 丁香花在线影院观看在线播放 | 国产疯狂伦交大片 | 精品久久久无码中文字幕 | 日韩av无码一区二区三区不卡 | 麻豆md0077饥渴少妇 | 一个人免费观看的www视频 | 在线天堂新版最新版在线8 | 国产舌乚八伦偷品w中 | 国产成人久久精品流白浆 | 国产精品久久久久影院嫩草 | 两性色午夜视频免费播放 | 少妇性荡欲午夜性开放视频剧场 | 狂野欧美激情性xxxx | 国产午夜视频在线观看 | 国产办公室秘书无码精品99 | 六月丁香婷婷色狠狠久久 | 天堂在线观看www | 日本精品高清一区二区 | 女人被男人爽到呻吟的视频 | 无遮挡啪啪摇乳动态图 | 亚洲国产欧美在线成人 | 成人性做爰aaa片免费看 | 亚洲成a人片在线观看无码 | 日韩精品久久久肉伦网站 | 欧美 丝袜 自拍 制服 另类 | 高清不卡一区二区三区 | 亚洲欧美日韩国产精品一区二区 | 精品成在人线av无码免费看 | 久久久无码中文字幕久... | 国产偷自视频区视频 | 日日夜夜撸啊撸 | 激情人妻另类人妻伦 | 色婷婷欧美在线播放内射 | 爆乳一区二区三区无码 | 国产精品高潮呻吟av久久 | 色狠狠av一区二区三区 | 永久免费观看美女裸体的网站 | 精品乱子伦一区二区三区 | 男人和女人高潮免费网站 | 成人无码视频在线观看网站 | 亚洲精品一区二区三区大桥未久 | 久久99热只有频精品8 | 国产亚洲精品久久久久久国模美 | 精品成人av一区二区三区 | 奇米影视7777久久精品 | 国内揄拍国内精品少妇国语 | 激情综合激情五月俺也去 | 日本精品少妇一区二区三区 | 国产一精品一av一免费 | 国产成人精品一区二区在线小狼 | 国产av久久久久精东av | 在线观看国产一区二区三区 | 清纯唯美经典一区二区 | 国产成人精品优优av | 亚无码乱人伦一区二区 | 国产偷自视频区视频 | 激情综合激情五月俺也去 | 妺妺窝人体色www婷婷 | 色欲综合久久中文字幕网 | 18禁止看的免费污网站 | 人妻天天爽夜夜爽一区二区 | 自拍偷自拍亚洲精品10p | 激情国产av做激情国产爱 | 亚洲 欧美 激情 小说 另类 | 熟女体下毛毛黑森林 | √天堂资源地址中文在线 | 图片区 小说区 区 亚洲五月 | 蜜桃av抽搐高潮一区二区 | 在线精品亚洲一区二区 | 无码国内精品人妻少妇 | 亚洲中文字幕无码中文字在线 | 人妻与老人中文字幕 | 中文字幕乱码中文乱码51精品 | 狠狠cao日日穞夜夜穞av | 欧美激情内射喷水高潮 | 国内精品人妻无码久久久影院 | 亚洲熟妇色xxxxx欧美老妇y | 国产成人精品必看 | 国产在线精品一区二区高清不卡 | 人人妻人人澡人人爽人人精品浪潮 | 男人扒开女人内裤强吻桶进去 | 久久aⅴ免费观看 | 国产精品福利视频导航 | 精品国产国产综合精品 | 久久精品一区二区三区四区 | 天天摸天天碰天天添 | 天堂在线观看www | 亚洲日本在线电影 | 一本久久a久久精品亚洲 | 精品人人妻人人澡人人爽人人 | 丰满少妇弄高潮了www | 日本一区二区更新不卡 | 日本精品高清一区二区 | 麻豆国产人妻欲求不满 | 熟女体下毛毛黑森林 | 国产免费观看黄av片 | 又大又硬又黄的免费视频 | 99久久久国产精品无码免费 | 精品无码一区二区三区的天堂 | 中文字幕无码免费久久9一区9 | 国产精品久久国产精品99 | 女人被男人爽到呻吟的视频 | 丰满人妻被黑人猛烈进入 | 在线观看免费人成视频 | 久久国产劲爆∧v内射 | 色噜噜亚洲男人的天堂 | 六月丁香婷婷色狠狠久久 | 国产精品国产三级国产专播 | 国产99久久精品一区二区 | 日韩精品无码一本二本三本色 | 日日摸夜夜摸狠狠摸婷婷 | 妺妺窝人体色www在线小说 | 欧美人与物videos另类 | 国产做国产爱免费视频 | ass日本丰满熟妇pics | 黑人粗大猛烈进出高潮视频 | 牲交欧美兽交欧美 | 久久97精品久久久久久久不卡 | 99久久人妻精品免费一区 | 国产精品自产拍在线观看 | 97精品国产97久久久久久免费 | 荫蒂添的好舒服视频囗交 | 野狼第一精品社区 | a国产一区二区免费入口 | 午夜精品久久久内射近拍高清 | 女高中生第一次破苞av | 荫蒂被男人添的好舒服爽免费视频 | 偷窥村妇洗澡毛毛多 | 国产亚洲美女精品久久久2020 | 1000部啪啪未满十八勿入下载 | 东京一本一道一二三区 | 99精品久久毛片a片 | 牲交欧美兽交欧美 | 成人无码精品一区二区三区 | 99国产欧美久久久精品 | 荫蒂被男人添的好舒服爽免费视频 | 久久zyz资源站无码中文动漫 | 久久久精品国产sm最大网站 | 人妻中文无码久热丝袜 | 国产成人无码专区 | 对白脏话肉麻粗话av | 亚洲欧美日韩成人高清在线一区 | 精品无码国产自产拍在线观看蜜 | 国产午夜视频在线观看 | 欧美丰满熟妇xxxx性ppx人交 | 黑人玩弄人妻中文在线 | 领导边摸边吃奶边做爽在线观看 | 亚洲精品久久久久avwww潮水 | 国产成人精品视频ⅴa片软件竹菊 | 中文字幕人妻无码一夲道 | 国产精品无码一区二区桃花视频 | 女高中生第一次破苞av | 国产午夜亚洲精品不卡 | 亚洲人成无码网www | 国内精品久久毛片一区二区 | а√天堂www在线天堂小说 | 亚洲精品一区二区三区四区五区 | av香港经典三级级 在线 | 欧美xxxxx精品 | www一区二区www免费 | 天干天干啦夜天干天2017 | 国产av无码专区亚洲a∨毛片 | 大地资源网第二页免费观看 | 国产熟妇高潮叫床视频播放 | 丰满诱人的人妻3 | 亚洲国产日韩a在线播放 | 亚洲伊人久久精品影院 | 性色欲情网站iwww九文堂 | 国精品人妻无码一区二区三区蜜柚 | 高清国产亚洲精品自在久久 | 99精品无人区乱码1区2区3区 | 亚洲国产一区二区三区在线观看 | 国产偷抇久久精品a片69 | 国产肉丝袜在线观看 | 中国女人内谢69xxxxxa片 | 国产极品视觉盛宴 | 免费网站看v片在线18禁无码 | 精品一区二区不卡无码av | 嫩b人妻精品一区二区三区 | 久久天天躁狠狠躁夜夜免费观看 | 色婷婷香蕉在线一区二区 | 人妻少妇精品久久 | 午夜精品一区二区三区在线观看 | 乌克兰少妇性做爰 | 丰满少妇人妻久久久久久 | 精品国产麻豆免费人成网站 | 日日摸夜夜摸狠狠摸婷婷 | 日韩欧美成人免费观看 | 亚洲精品一区二区三区在线观看 | 理论片87福利理论电影 | 性欧美videos高清精品 | 少妇人妻偷人精品无码视频 | 漂亮人妻洗澡被公强 日日躁 | 内射老妇bbwx0c0ck | 国产福利视频一区二区 | 国产精品永久免费视频 | 性色欲情网站iwww九文堂 | 色综合久久88色综合天天 | 国产人成高清在线视频99最全资源 | 俺去俺来也在线www色官网 | 精品一区二区三区波多野结衣 | 精品无码一区二区三区的天堂 | 国产精品办公室沙发 | 色老头在线一区二区三区 | 国产精品内射视频免费 | 18禁黄网站男男禁片免费观看 | 18黄暴禁片在线观看 | 成 人 免费观看网站 | 国产高潮视频在线观看 | 久久精品女人的天堂av | 丰满少妇人妻久久久久久 | 欧美激情一区二区三区成人 | 精品国产av色一区二区深夜久久 | 免费播放一区二区三区 | 久久综合激激的五月天 | 在线精品国产一区二区三区 | 岛国片人妻三上悠亚 | 日韩无码专区 | 一本久道久久综合婷婷五月 | 国产午夜福利100集发布 | 亚洲一区二区三区国产精华液 | 少妇无码吹潮 | 国产色视频一区二区三区 | 久久国产精品二国产精品 | 国产性猛交╳xxx乱大交 国产精品久久久久久无码 欧洲欧美人成视频在线 | 18无码粉嫩小泬无套在线观看 | 色老头在线一区二区三区 | 18无码粉嫩小泬无套在线观看 | 女人被爽到呻吟gif动态图视看 | 日韩av无码中文无码电影 | 午夜福利电影 | 亚洲日韩精品欧美一区二区 | 国产成人无码区免费内射一片色欲 | 日本精品人妻无码免费大全 | 国产另类ts人妖一区二区 | 国产欧美精品一区二区三区 | 窝窝午夜理论片影院 | 成人无码视频在线观看网站 | 无码午夜成人1000部免费视频 | 久久精品国产亚洲精品 | 成人无码视频在线观看网站 | 亚洲一区二区三区含羞草 | 亚洲成av人影院在线观看 | √天堂资源地址中文在线 | 一本色道久久综合狠狠躁 | 少妇无套内谢久久久久 | 久久亚洲a片com人成 | 国产精品a成v人在线播放 | 婷婷五月综合缴情在线视频 | 国产97人人超碰caoprom | 久久zyz资源站无码中文动漫 | 成人无码精品一区二区三区 | 国产乱人无码伦av在线a | 国产亚洲精品精品国产亚洲综合 | 亚洲精品美女久久久久久久 | 高清无码午夜福利视频 | 无码一区二区三区在线观看 | 午夜福利一区二区三区在线观看 | 国产97色在线 | 免 | 精品成人av一区二区三区 | 久久久久久av无码免费看大片 | 蜜桃无码一区二区三区 | 中文无码精品a∨在线观看不卡 | 18黄暴禁片在线观看 | 久久综合激激的五月天 | 日韩欧美中文字幕公布 | 国产手机在线αⅴ片无码观看 | 午夜福利不卡在线视频 | 自拍偷自拍亚洲精品10p | 亚洲成a人一区二区三区 | 欧美三级不卡在线观看 | 性色av无码免费一区二区三区 | 在线а√天堂中文官网 | 在线天堂新版最新版在线8 | 在线观看免费人成视频 | 亚洲成熟女人毛毛耸耸多 | 亚洲人亚洲人成电影网站色 | 性欧美熟妇videofreesex | 国产乱子伦视频在线播放 | 婷婷五月综合激情中文字幕 | 亚洲综合无码一区二区三区 | 欧美怡红院免费全部视频 | 久久精品女人天堂av免费观看 | 亚洲精品欧美二区三区中文字幕 | 久精品国产欧美亚洲色aⅴ大片 | 2020久久超碰国产精品最新 | 日日天干夜夜狠狠爱 | 国产精品丝袜黑色高跟鞋 | 免费人成在线视频无码 | 亚洲一区二区三区在线观看网站 | 女人色极品影院 | 亚洲综合另类小说色区 | 日产精品高潮呻吟av久久 | 狠狠色丁香久久婷婷综合五月 | 2020久久香蕉国产线看观看 | 国产亚洲日韩欧美另类第八页 | 亚洲欧美日韩综合久久久 | 一本色道婷婷久久欧美 | 亚洲成av人影院在线观看 | 欧美性生交xxxxx久久久 | 久久久久免费精品国产 | 久久久无码中文字幕久... | 国产精品亚洲综合色区韩国 | 色婷婷综合中文久久一本 | 国产性猛交╳xxx乱大交 国产精品久久久久久无码 欧洲欧美人成视频在线 | 婷婷五月综合缴情在线视频 | 97精品人妻一区二区三区香蕉 | 国产卡一卡二卡三 | 亚洲人成影院在线无码按摩店 | 日本乱人伦片中文三区 | 奇米影视7777久久精品 | 色 综合 欧美 亚洲 国产 | 人妻夜夜爽天天爽三区 | 亚洲人成网站在线播放942 | 澳门永久av免费网站 | 久久久精品人妻久久影视 | 久久人人爽人人爽人人片ⅴ | 久久zyz资源站无码中文动漫 | 日韩欧美群交p片內射中文 | 2019nv天堂香蕉在线观看 | 国产一区二区三区日韩精品 | 亚洲 a v无 码免 费 成 人 a v | 国产精品久久久久影院嫩草 | 中文字幕日韩精品一区二区三区 | 麻豆果冻传媒2021精品传媒一区下载 | 扒开双腿疯狂进出爽爽爽视频 | 国产乱人伦偷精品视频 | 黑森林福利视频导航 | 亚洲 a v无 码免 费 成 人 a v | 久久人人97超碰a片精品 | 国产人妻精品一区二区三区不卡 | 装睡被陌生人摸出水好爽 | 国产精品高潮呻吟av久久4虎 | 亚洲欧美日韩国产精品一区二区 | 无码国模国产在线观看 | 女人高潮内射99精品 | 成熟妇人a片免费看网站 | 男人和女人高潮免费网站 | 日韩欧美中文字幕在线三区 | 一区二区三区乱码在线 | 欧洲 | 国产乱人无码伦av在线a | 国产免费久久久久久无码 | 最新版天堂资源中文官网 | 国产成人综合在线女婷五月99播放 | 久久精品成人欧美大片 | 亚拍精品一区二区三区探花 | 少妇激情av一区二区 | 网友自拍区视频精品 | 色五月五月丁香亚洲综合网 | 国产在线精品一区二区三区直播 | 白嫩日本少妇做爰 | 国产亚洲精品久久久久久大师 | 亚洲人成影院在线观看 | 国产精品多人p群无码 | 又大又紧又粉嫩18p少妇 | 国产精华av午夜在线观看 | 久久无码专区国产精品s | 亚洲人成人无码网www国产 | 久久久国产精品无码免费专区 | 久久久成人毛片无码 | 欧美熟妇另类久久久久久多毛 | 四虎国产精品一区二区 | 草草网站影院白丝内射 | 日本成熟视频免费视频 | 精品一区二区三区无码免费视频 | 国产精品久久久久久久影院 | 一本加勒比波多野结衣 | 久久久精品人妻久久影视 | 人妻少妇精品无码专区二区 | 久久亚洲精品中文字幕无男同 | 99久久久无码国产精品免费 | 女人被男人躁得好爽免费视频 | 一本久久a久久精品vr综合 | 天天躁日日躁狠狠躁免费麻豆 | 国色天香社区在线视频 | 国产精品嫩草久久久久 | 蜜臀av在线观看 在线欧美精品一区二区三区 | 国产精品无码mv在线观看 | 国产亚洲精品久久久久久 | 成人性做爰aaa片免费看 | 亚洲成a人片在线观看无码3d | 狠狠cao日日穞夜夜穞av | 久久99热只有频精品8 | 99久久99久久免费精品蜜桃 | 俄罗斯老熟妇色xxxx | 丰满人妻翻云覆雨呻吟视频 | 亚洲综合色区中文字幕 | 国模大胆一区二区三区 | 少妇性l交大片 | 亚洲区欧美区综合区自拍区 | aⅴ在线视频男人的天堂 | 日本饥渴人妻欲求不满 | 无码人妻丰满熟妇区毛片18 | 国产精品无码mv在线观看 | 少妇人妻av毛片在线看 | 一本色道久久综合狠狠躁 | 亚洲熟女一区二区三区 | 久久 国产 尿 小便 嘘嘘 | 欧美刺激性大交 | 狠狠综合久久久久综合网 | 性啪啪chinese东北女人 | 亚洲国产欧美在线成人 | 少妇高潮喷潮久久久影院 | 97资源共享在线视频 | 欧美精品在线观看 | 亚洲日韩乱码中文无码蜜桃臀网站 | 97色伦图片97综合影院 | 国产精品高潮呻吟av久久 | www国产精品内射老师 | 亚洲国产成人a精品不卡在线 | 一本一道久久综合久久 | 免费无码肉片在线观看 | 日日躁夜夜躁狠狠躁 | 亚洲小说图区综合在线 | 中文字幕 亚洲精品 第1页 | 理论片87福利理论电影 | 亚洲男女内射在线播放 | 国产精品二区一区二区aⅴ污介绍 | 丰满人妻精品国产99aⅴ | 精品国产aⅴ无码一区二区 | 精品久久久久香蕉网 | 四虎影视成人永久免费观看视频 | 亚洲中文字幕乱码av波多ji | 欧美精品无码一区二区三区 | 色噜噜亚洲男人的天堂 | 无套内射视频囯产 | 日本一卡二卡不卡视频查询 | 天堂а√在线中文在线 | 亚洲乱码国产乱码精品精 | 久久久无码中文字幕久... | 色婷婷香蕉在线一区二区 | 4hu四虎永久在线观看 | 久久人人爽人人爽人人片ⅴ | 亚洲成av人片天堂网无码】 | 熟女少妇在线视频播放 | 午夜精品久久久内射近拍高清 | 国产欧美精品一区二区三区 | 日日噜噜噜噜夜夜爽亚洲精品 | 白嫩日本少妇做爰 | 曰本女人与公拘交酡免费视频 | 在线观看国产一区二区三区 | 亚洲精品国产品国语在线观看 | 亚洲人成无码网www | 国产亚洲精品久久久久久 | 大地资源网第二页免费观看 | 麻豆国产人妻欲求不满谁演的 | 国产人妻精品午夜福利免费 | 日韩人妻系列无码专区 | 国产精品内射视频免费 | 精品无码av一区二区三区 | 又大又黄又粗又爽的免费视频 | 欧美日韩久久久精品a片 | 4hu四虎永久在线观看 | 婷婷五月综合缴情在线视频 | 无码中文字幕色专区 | 国产精品久久久午夜夜伦鲁鲁 | 熟妇人妻无乱码中文字幕 | 日本一区二区三区免费高清 | 日韩精品无码免费一区二区三区 | 永久免费精品精品永久-夜色 | 日韩精品无码免费一区二区三区 | 国产性生交xxxxx无码 | 国产情侣作爱视频免费观看 | 精品日本一区二区三区在线观看 | 亚洲午夜无码久久 | 中文字幕无码日韩欧毛 | 漂亮人妻洗澡被公强 日日躁 | 天天摸天天透天天添 | 久久成人a毛片免费观看网站 | 日本肉体xxxx裸交 | 国产精品亚洲lv粉色 | 中文字幕人妻丝袜二区 | 精品aⅴ一区二区三区 | 久久久中文久久久无码 | 强伦人妻一区二区三区视频18 | 亚洲人成影院在线无码按摩店 | 全球成人中文在线 | 欧美日韩久久久精品a片 | 人人爽人人澡人人人妻 | 欧洲vodafone精品性 | 影音先锋中文字幕无码 | 又湿又紧又大又爽a视频国产 | 欧美大屁股xxxxhd黑色 | 欧美freesex黑人又粗又大 | 99久久99久久免费精品蜜桃 | 久久aⅴ免费观看 | 国产免费久久久久久无码 | 一本久道久久综合婷婷五月 | a片免费视频在线观看 | 精品乱码久久久久久久 | 又湿又紧又大又爽a视频国产 | 亚洲精品一区三区三区在线观看 | 精品久久久无码中文字幕 | 99久久精品日本一区二区免费 | 又大又紧又粉嫩18p少妇 | 帮老师解开蕾丝奶罩吸乳网站 | 又粗又大又硬毛片免费看 | 久久人人爽人人爽人人片av高清 | 久久成人a毛片免费观看网站 | 欧美一区二区三区视频在线观看 | 国产又粗又硬又大爽黄老大爷视 | 图片小说视频一区二区 | 亚无码乱人伦一区二区 | 狠狠色噜噜狠狠狠7777奇米 | 欧美 亚洲 国产 另类 | 99久久婷婷国产综合精品青草免费 | 在线播放免费人成毛片乱码 | 少妇性荡欲午夜性开放视频剧场 | 大色综合色综合网站 | 国产成人人人97超碰超爽8 | 欧美第一黄网免费网站 | 国产极品美女高潮无套在线观看 | 精品国偷自产在线 | 日本欧美一区二区三区乱码 | 久久久久久久女国产乱让韩 | ass日本丰满熟妇pics | 福利一区二区三区视频在线观看 | 中文字幕无码乱人伦 | 九九在线中文字幕无码 | 成 人 网 站国产免费观看 | 国产麻豆精品精东影业av网站 | 欧洲vodafone精品性 | 中国女人内谢69xxxx | 亚洲综合无码久久精品综合 | 丰满人妻被黑人猛烈进入 | 色婷婷av一区二区三区之红樱桃 | 初尝人妻少妇中文字幕 | 国产成人精品必看 | 永久免费精品精品永久-夜色 | 麻豆果冻传媒2021精品传媒一区下载 | 无码人妻久久一区二区三区不卡 | 无遮挡啪啪摇乳动态图 | 熟妇人妻中文av无码 | 97久久国产亚洲精品超碰热 | 无码乱肉视频免费大全合集 | 日产精品高潮呻吟av久久 | 纯爱无遮挡h肉动漫在线播放 | 精品国产一区av天美传媒 | 国产精品第一国产精品 | 日本又色又爽又黄的a片18禁 | 亚洲自偷自拍另类第1页 | 欧美人妻一区二区三区 | 亚洲中文字幕在线观看 | 国产极品美女高潮无套在线观看 | 无遮挡国产高潮视频免费观看 | 成人一在线视频日韩国产 | 精品无码国产一区二区三区av | 日韩av无码中文无码电影 | 国产性生交xxxxx无码 | 国产亚洲视频中文字幕97精品 | 国语精品一区二区三区 | 久久久精品国产sm最大网站 | 国产精品嫩草久久久久 | 久久精品国产99精品亚洲 | 亚洲 日韩 欧美 成人 在线观看 | 国产麻豆精品精东影业av网站 | 在线播放免费人成毛片乱码 | av在线亚洲欧洲日产一区二区 | 波多野结衣aⅴ在线 | 5858s亚洲色大成网站www | 中文字幕无线码 | 国产偷自视频区视频 | 国产精品手机免费 | 人妻少妇精品久久 | 丰满人妻一区二区三区免费视频 | 亚洲啪av永久无码精品放毛片 | 欧美野外疯狂做受xxxx高潮 | 欧美激情综合亚洲一二区 | 国产亚洲日韩欧美另类第八页 | 无码吃奶揉捏奶头高潮视频 | 国内精品久久毛片一区二区 | 正在播放老肥熟妇露脸 | 99精品国产综合久久久久五月天 | 丰满少妇熟乱xxxxx视频 | 亚洲精品中文字幕 | 性啪啪chinese东北女人 | 国产卡一卡二卡三 | 日本精品人妻无码77777 天堂一区人妻无码 | 成 人 网 站国产免费观看 | 清纯唯美经典一区二区 | 亚洲国精产品一二二线 | 亚洲日韩乱码中文无码蜜桃臀网站 | 国产香蕉尹人综合在线观看 | 精品厕所偷拍各类美女tp嘘嘘 | 97无码免费人妻超级碰碰夜夜 | 亚洲国产av精品一区二区蜜芽 | 中文字幕av伊人av无码av | www国产亚洲精品久久网站 | 欧美日本精品一区二区三区 | 丰满诱人的人妻3 | 自拍偷自拍亚洲精品被多人伦好爽 | 在线精品亚洲一区二区 | 狂野欧美激情性xxxx | 精品欧洲av无码一区二区三区 | 亚洲色大成网站www国产 | 亚洲国产午夜精品理论片 | 国产午夜福利亚洲第一 | 蜜臀av无码人妻精品 | 中文精品久久久久人妻不卡 | 久久精品女人的天堂av | 亚洲日本va午夜在线电影 | 少妇的肉体aa片免费 | 男女猛烈xx00免费视频试看 | 国产精品自产拍在线观看 | 欧美性猛交xxxx富婆 | 婷婷五月综合激情中文字幕 | 黑人大群体交免费视频 | 日韩视频 中文字幕 视频一区 | 亚洲一区二区三区国产精华液 | 国内揄拍国内精品人妻 | aⅴ亚洲 日韩 色 图网站 播放 | 十八禁视频网站在线观看 | 成人欧美一区二区三区黑人 | 狠狠cao日日穞夜夜穞av | 中文字幕无码人妻少妇免费 | 免费国产成人高清在线观看网站 | www国产亚洲精品久久网站 | 国产9 9在线 | 中文 | 亚洲人成无码网www | 性欧美熟妇videofreesex | 亚洲中文字幕乱码av波多ji | 久久久国产一区二区三区 | 性欧美疯狂xxxxbbbb | 激情内射日本一区二区三区 | 久久人人爽人人爽人人片av高清 | 我要看www免费看插插视频 | 国产农村妇女高潮大叫 | 欧美自拍另类欧美综合图片区 | 国产农村妇女高潮大叫 | 亚洲欧美日韩综合久久久 | 国内丰满熟女出轨videos | 鲁鲁鲁爽爽爽在线视频观看 | 波多野结衣一区二区三区av免费 | 99久久精品无码一区二区毛片 | 国产激情无码一区二区app | 蜜桃av抽搐高潮一区二区 | 狂野欧美激情性xxxx | 国产成人亚洲综合无码 | 内射巨臀欧美在线视频 | 精品久久8x国产免费观看 | 国产人妖乱国产精品人妖 | 久久久精品456亚洲影院 | 国产激情无码一区二区 | 在线观看国产午夜福利片 | 999久久久国产精品消防器材 | 天干天干啦夜天干天2017 | 亚洲色在线无码国产精品不卡 | 天天躁日日躁狠狠躁免费麻豆 | 在线观看国产午夜福利片 | 欧洲精品码一区二区三区免费看 | 国产精品久久久久久久9999 | 亚洲小说图区综合在线 | 又大又硬又黄的免费视频 | 无码精品国产va在线观看dvd | 99er热精品视频 | 国内少妇偷人精品视频 | 最近的中文字幕在线看视频 | 欧美人与动性行为视频 | 久久综合狠狠综合久久综合88 | аⅴ资源天堂资源库在线 | 97久久精品无码一区二区 | 一本一道久久综合久久 | 日韩人妻无码一区二区三区久久99 | 久久久久se色偷偷亚洲精品av | aⅴ亚洲 日韩 色 图网站 播放 | 国产尤物精品视频 | 性欧美大战久久久久久久 | 亚洲春色在线视频 | 精品久久久无码中文字幕 | 久久人人爽人人爽人人片ⅴ | 全球成人中文在线 | 亚洲 a v无 码免 费 成 人 a v | 国产精品资源一区二区 | 丁香啪啪综合成人亚洲 | 国产超级va在线观看视频 | 国产在线精品一区二区三区直播 | 嫩b人妻精品一区二区三区 | 久久午夜无码鲁丝片 | 成人精品天堂一区二区三区 | 免费观看激色视频网站 | 久青草影院在线观看国产 | 图片小说视频一区二区 | 亚洲中文字幕在线无码一区二区 | 国产精品99爱免费视频 | 精品国产福利一区二区 | 对白脏话肉麻粗话av | 少妇被黑人到高潮喷出白浆 | 国产精品永久免费视频 | 樱花草在线社区www | 精品人妻人人做人人爽夜夜爽 | 亚洲色www成人永久网址 | 伊在人天堂亚洲香蕉精品区 | 国产精品亚洲五月天高清 | 老司机亚洲精品影院无码 | 久久国内精品自在自线 | 激情人妻另类人妻伦 | 在线播放无码字幕亚洲 | 亚洲色偷偷偷综合网 | 水蜜桃亚洲一二三四在线 | 无码任你躁久久久久久久 | 国产亚洲tv在线观看 | 天天躁夜夜躁狠狠是什么心态 | a国产一区二区免费入口 | 欧美怡红院免费全部视频 | 最近的中文字幕在线看视频 | 中文字幕av伊人av无码av | 18黄暴禁片在线观看 | 帮老师解开蕾丝奶罩吸乳网站 | 欧美freesex黑人又粗又大 | 国产激情艳情在线看视频 | 国产亚洲欧美在线专区 | 久久久无码中文字幕久... | 久久无码中文字幕免费影院蜜桃 | 午夜男女很黄的视频 | 扒开双腿疯狂进出爽爽爽视频 | 国产精品久久久一区二区三区 | 巨爆乳无码视频在线观看 | 欧美老熟妇乱xxxxx | 国产精品va在线播放 | 国产精品第一区揄拍无码 | 国产精品无码mv在线观看 | 伊在人天堂亚洲香蕉精品区 | 荡女精品导航 | 成人综合网亚洲伊人 | 亚洲中文无码av永久不收费 | 午夜丰满少妇性开放视频 | 亚洲 a v无 码免 费 成 人 a v | 色欲人妻aaaaaaa无码 | 精品国产国产综合精品 | 清纯唯美经典一区二区 | 亚欧洲精品在线视频免费观看 | 日产精品高潮呻吟av久久 | 久久伊人色av天堂九九小黄鸭 | 国产高潮视频在线观看 | 人妻少妇精品视频专区 | 又大又硬又黄的免费视频 | 亚洲人交乣女bbw | 日韩人妻无码一区二区三区久久99 | 在线成人www免费观看视频 | 在线观看国产一区二区三区 | 水蜜桃色314在线观看 | 牲欲强的熟妇农村老妇女视频 | 中文字幕无码av激情不卡 | 极品嫩模高潮叫床 | 永久黄网站色视频免费直播 | 无套内谢的新婚少妇国语播放 | 亚洲一区二区三区香蕉 | 九月婷婷人人澡人人添人人爽 | 亚洲s码欧洲m码国产av | 国产人成高清在线视频99最全资源 | 国产精品香蕉在线观看 | 亚洲精品久久久久久一区二区 | 强伦人妻一区二区三区视频18 | 亚洲 日韩 欧美 成人 在线观看 | 久久综合给合久久狠狠狠97色 | 国产精品久久久久9999小说 | 国产亚洲美女精品久久久2020 | 国产成人人人97超碰超爽8 | 欧美丰满老熟妇xxxxx性 | 国产精品无码久久av | 亚洲 a v无 码免 费 成 人 a v | 亚洲自偷自偷在线制服 | 成人性做爰aaa片免费看不忠 | 少女韩国电视剧在线观看完整 | 东京无码熟妇人妻av在线网址 | 性开放的女人aaa片 | 久久亚洲国产成人精品性色 | 国内少妇偷人精品视频免费 | 亚洲gv猛男gv无码男同 | 国产精品成人av在线观看 | 日日夜夜撸啊撸 | 日韩精品久久久肉伦网站 | 亚洲乱码日产精品bd | 麻豆精品国产精华精华液好用吗 | 欧美日韩人成综合在线播放 | 日本精品高清一区二区 | 少妇人妻偷人精品无码视频 | 日韩人妻少妇一区二区三区 | 国产在线aaa片一区二区99 | 对白脏话肉麻粗话av | 中文字幕日产无线码一区 | 国产超级va在线观看视频 | aⅴ在线视频男人的天堂 | 人人澡人人妻人人爽人人蜜桃 | 中文字幕精品av一区二区五区 | 国产午夜亚洲精品不卡下载 | 久激情内射婷内射蜜桃人妖 | 精品熟女少妇av免费观看 | 无码人妻丰满熟妇区毛片18 | 狠狠色色综合网站 | 天堂а√在线中文在线 | 青春草在线视频免费观看 | 国产av一区二区精品久久凹凸 | 无遮挡啪啪摇乳动态图 | 免费人成在线视频无码 | 又大又紧又粉嫩18p少妇 | 国产黑色丝袜在线播放 | 精品国产一区二区三区四区 | 久久久久久亚洲精品a片成人 | 呦交小u女精品视频 | 精品成在人线av无码免费看 | 国产激情精品一区二区三区 | 欧美xxxx黑人又粗又长 | 色婷婷欧美在线播放内射 | 久久精品中文闷骚内射 | 老头边吃奶边弄进去呻吟 | 亚洲一区二区三区 | 女人高潮内射99精品 | 日韩成人一区二区三区在线观看 | 亚洲精品综合五月久久小说 | 香港三级日本三级妇三级 | 荡女精品导航 | 国产免费久久精品国产传媒 | 一本久久伊人热热精品中文字幕 | 丰腴饱满的极品熟妇 | 精品国产一区二区三区av 性色 | 国产香蕉97碰碰久久人人 | 欧美熟妇另类久久久久久不卡 | 国产艳妇av在线观看果冻传媒 | 日本护士毛茸茸高潮 | 99视频精品全部免费免费观看 | 成人精品视频一区二区 | 日韩欧美中文字幕在线三区 | 日韩人妻无码一区二区三区久久99 | 老熟女重囗味hdxx69 | 99视频精品全部免费免费观看 | 亚洲日韩av一区二区三区四区 | 日本饥渴人妻欲求不满 | 亚洲天堂2017无码 | 国产精品99爱免费视频 | 亚洲午夜无码久久 | 波多野42部无码喷潮在线 | 国产精品沙发午睡系列 | 高清不卡一区二区三区 | 日韩av无码一区二区三区不卡 | 亚洲成av人在线观看网址 | 日韩在线不卡免费视频一区 | 麻豆精品国产精华精华液好用吗 | 精品亚洲成av人在线观看 | 国产suv精品一区二区五 | 六十路熟妇乱子伦 | 国产精品久久久久久亚洲毛片 | 日日橹狠狠爱欧美视频 | 日本一卡二卡不卡视频查询 | 亚洲第一网站男人都懂 | 日本一区二区更新不卡 | 内射白嫩少妇超碰 | 熟女俱乐部五十路六十路av | 国产麻豆精品精东影业av网站 | 免费看男女做好爽好硬视频 | 樱花草在线播放免费中文 | 亚洲人成人无码网www国产 | 国产精品手机免费 | 荫蒂添的好舒服视频囗交 | 色欲综合久久中文字幕网 | 日本肉体xxxx裸交 | 日本精品久久久久中文字幕 | 初尝人妻少妇中文字幕 | 中文毛片无遮挡高清免费 | 国产一区二区三区影院 | 亚洲欧美日韩国产精品一区二区 | 欧美性生交活xxxxxdddd | 国产精品人人妻人人爽 | 国产精品久久久久久久9999 | 少妇性l交大片欧洲热妇乱xxx | 久久久久成人片免费观看蜜芽 | 丰满人妻一区二区三区免费视频 | 夫妻免费无码v看片 | 亚洲中文字幕va福利 | 六月丁香婷婷色狠狠久久 | 国产情侣作爱视频免费观看 | 成人综合网亚洲伊人 | 精品国产乱码久久久久乱码 | 久久精品国产日本波多野结衣 | 亚洲综合伊人久久大杳蕉 | 国产人成高清在线视频99最全资源 | 丰腴饱满的极品熟妇 | 国产成人综合色在线观看网站 | 亚洲aⅴ无码成人网站国产app | 亚洲欧洲日本无在线码 | 国产午夜亚洲精品不卡 | 欧美日韩一区二区三区自拍 | 国产精品第一区揄拍无码 | 久久天天躁狠狠躁夜夜免费观看 | 激情内射日本一区二区三区 | 国产无套内射久久久国产 | 两性色午夜免费视频 | 亚洲男人av香蕉爽爽爽爽 | av无码久久久久不卡免费网站 | 一个人免费观看的www视频 | 久久久久99精品成人片 | 成 人 网 站国产免费观看 | 又紧又大又爽精品一区二区 | 中文字幕人妻无码一夲道 | 亚洲人成无码网www | 亚洲精品久久久久久一区二区 | 性欧美牲交在线视频 | 久久综合给久久狠狠97色 | 乱码av麻豆丝袜熟女系列 | 国产人妻精品午夜福利免费 | 久久久久人妻一区精品色欧美 | 小鲜肉自慰网站xnxx | 麻豆国产97在线 | 欧洲 | 精品 日韩 国产 欧美 视频 | 亚洲精品午夜国产va久久成人 | 成熟人妻av无码专区 | 最近免费中文字幕中文高清百度 | 欧美日韩一区二区三区自拍 | 国产成人无码av一区二区 | 人人爽人人爽人人片av亚洲 | 波多野结衣av一区二区全免费观看 | 日韩av无码一区二区三区 | 中国女人内谢69xxxx | 亚洲а∨天堂久久精品2021 | 国产精品无码永久免费888 | 亚洲精品久久久久avwww潮水 | 久久久久免费看成人影片 | 帮老师解开蕾丝奶罩吸乳网站 | 99国产精品白浆在线观看免费 | 成人亚洲精品久久久久软件 | 国产无av码在线观看 | 无码人妻av免费一区二区三区 | 中文字幕+乱码+中文字幕一区 | 国产成人一区二区三区别 | 亚洲成av人片在线观看无码不卡 | 性开放的女人aaa片 | 久久久久久av无码免费看大片 | 377p欧洲日本亚洲大胆 | 国产精品高潮呻吟av久久 | 强伦人妻一区二区三区视频18 | v一区无码内射国产 | 日本在线高清不卡免费播放 | 国产肉丝袜在线观看 | 精品乱码久久久久久久 | 中文字幕人妻丝袜二区 | 色婷婷av一区二区三区之红樱桃 | 精品人妻中文字幕有码在线 | 国产亚洲精品久久久久久久久动漫 | 少妇厨房愉情理9仑片视频 | 少妇愉情理伦片bd | 一本色道久久综合狠狠躁 | 亚洲精品成a人在线观看 | 乱中年女人伦av三区 | 免费播放一区二区三区 | 水蜜桃亚洲一二三四在线 | 久久国产精品萌白酱免费 | 精品久久久中文字幕人妻 | 亚洲色大成网站www | 动漫av一区二区在线观看 | 中文字幕乱码人妻二区三区 | 久久国产精品精品国产色婷婷 | 狠狠综合久久久久综合网 | 亚洲国产欧美在线成人 | 国产无遮挡又黄又爽免费视频 | 老司机亚洲精品影院无码 | 精品国产一区二区三区四区在线看 | 人人妻人人澡人人爽欧美一区九九 | 天堂亚洲2017在线观看 | 18黄暴禁片在线观看 | 乌克兰少妇性做爰 | 国产一精品一av一免费 | 免费无码一区二区三区蜜桃大 | 中国女人内谢69xxxx | 国产乱人伦app精品久久 国产在线无码精品电影网 国产国产精品人在线视 | 亚洲欧美中文字幕5发布 | 偷窥日本少妇撒尿chinese | 嫩b人妻精品一区二区三区 | 亚洲国产综合无码一区 | 精品无人国产偷自产在线 | 97久久国产亚洲精品超碰热 | 国产亚洲欧美日韩亚洲中文色 | 18禁止看的免费污网站 | 兔费看少妇性l交大片免费 | 国模大胆一区二区三区 | 国产激情一区二区三区 | 黑人玩弄人妻中文在线 | 亚洲色欲色欲欲www在线 | 国产av剧情md精品麻豆 | 婷婷综合久久中文字幕蜜桃三电影 | 亚洲s码欧洲m码国产av | 国产成人亚洲综合无码 | 黑人玩弄人妻中文在线 | 2020最新国产自产精品 | 成人无码精品1区2区3区免费看 | 精品国产一区二区三区av 性色 | 少妇激情av一区二区 | 亚洲a无码综合a国产av中文 | 免费无码一区二区三区蜜桃大 | 国内综合精品午夜久久资源 | 一二三四社区在线中文视频 | 无码免费一区二区三区 | 人妻少妇被猛烈进入中文字幕 | 国产明星裸体无码xxxx视频 | aⅴ在线视频男人的天堂 | 老司机亚洲精品影院 | 性欧美videos高清精品 | av无码不卡在线观看免费 | 久久久精品456亚洲影院 | 国产无遮挡吃胸膜奶免费看 | 亚洲精品国偷拍自产在线观看蜜桃 | 男女爱爱好爽视频免费看 | a在线观看免费网站大全 | 18禁止看的免费污网站 | 中文字幕日韩精品一区二区三区 | 国产国语老龄妇女a片 | 中文字幕无码av波多野吉衣 | 色综合视频一区二区三区 | 嫩b人妻精品一区二区三区 | 九九热爱视频精品 | 一二三四在线观看免费视频 | 久久综合九色综合97网 | 久久久久久久人妻无码中文字幕爆 | 女人色极品影院 | 大地资源网第二页免费观看 | 亚洲国精产品一二二线 | 国产免费无码一区二区视频 | 高潮毛片无遮挡高清免费视频 | 免费无码午夜福利片69 | 亚洲综合精品香蕉久久网 | 国产乱人伦偷精品视频 | 国产精品久久久久影院嫩草 | 国产一区二区三区精品视频 | 精品人人妻人人澡人人爽人人 | 久久久精品成人免费观看 | 日本高清一区免费中文视频 | 国产亚洲精品久久久久久久 | 丝袜美腿亚洲一区二区 | 国产深夜福利视频在线 | 香蕉久久久久久av成人 | 中文字幕av无码一区二区三区电影 | 色欲av亚洲一区无码少妇 | 最近中文2019字幕第二页 | 无码人妻少妇伦在线电影 | 亚洲大尺度无码无码专区 | 国产亚洲tv在线观看 | 欧美性生交活xxxxxdddd | 久久亚洲精品中文字幕无男同 | 色窝窝无码一区二区三区色欲 | 狠狠综合久久久久综合网 | 久久精品国产一区二区三区肥胖 | 国产精品久久久 | 久久精品无码一区二区三区 | 丁香啪啪综合成人亚洲 | 欧美性生交活xxxxxdddd | 亚洲中文字幕在线无码一区二区 | 波多野42部无码喷潮在线 | 97久久超碰中文字幕 | 免费网站看v片在线18禁无码 | 国产亚洲精品久久久闺蜜 | 99久久人妻精品免费二区 | 国产成人午夜福利在线播放 | 精品夜夜澡人妻无码av蜜桃 | 日韩人妻少妇一区二区三区 | 国産精品久久久久久久 | 青青青手机频在线观看 | 高清无码午夜福利视频 | 爽爽影院免费观看 | 中文久久乱码一区二区 | 久久无码人妻影院 | 欧洲熟妇色 欧美 | 久久熟妇人妻午夜寂寞影院 | 国产精品久久久久久亚洲影视内衣 | 夜精品a片一区二区三区无码白浆 | 国产精品沙发午睡系列 | 动漫av一区二区在线观看 | 少妇高潮喷潮久久久影院 | 久久成人a毛片免费观看网站 | 伦伦影院午夜理论片 | 国产超级va在线观看视频 | 成人综合网亚洲伊人 | 中文字幕乱妇无码av在线 | 丰满少妇弄高潮了www | 窝窝午夜理论片影院 | 无码一区二区三区在线观看 | 青青久在线视频免费观看 | 高清无码午夜福利视频 | 亚欧洲精品在线视频免费观看 | 国产福利视频一区二区 | 两性色午夜视频免费播放 | 国产一区二区三区影院 | 狂野欧美激情性xxxx | 精品久久久久香蕉网 | 亚洲色欲色欲天天天www | 精品国产精品久久一区免费式 | 国产精品久久久久久久9999 | 熟妇人妻无乱码中文字幕 | 国产乱码精品一品二品 | 国产成人无码专区 | 国色天香社区在线视频 | 夜精品a片一区二区三区无码白浆 | 久久精品国产日本波多野结衣 | 成人片黄网站色大片免费观看 | 亚洲精品久久久久久久久久久 | 蜜桃视频插满18在线观看 | 亚洲国产一区二区三区在线观看 | 久久国产精品精品国产色婷婷 | 午夜精品一区二区三区在线观看 | 亚洲乱码中文字幕在线 | 在线精品亚洲一区二区 | 久久人人97超碰a片精品 | 亚洲爆乳精品无码一区二区三区 | 精品一二三区久久aaa片 | 亚洲春色在线视频 | 久久亚洲中文字幕精品一区 | 黑人粗大猛烈进出高潮视频 | 国产精品久久久久影院嫩草 | 欧美日韩人成综合在线播放 | 亚洲理论电影在线观看 | 亚洲成在人网站无码天堂 | 国产农村乱对白刺激视频 | 国产偷自视频区视频 | 亚洲男人av香蕉爽爽爽爽 | 玩弄中年熟妇正在播放 | 国产精品亚洲а∨无码播放麻豆 | 无码人妻久久一区二区三区不卡 | 99久久精品午夜一区二区 | 日韩精品无码一本二本三本色 | 少妇久久久久久人妻无码 | 麻豆人妻少妇精品无码专区 | 国产熟女一区二区三区四区五区 | 青草视频在线播放 | 福利一区二区三区视频在线观看 | 国产精品爱久久久久久久 | 日韩精品无码免费一区二区三区 | 无码纯肉视频在线观看 | 国产精品人妻一区二区三区四 | 97人妻精品一区二区三区 | 国产日产欧产精品精品app | 国产激情艳情在线看视频 | 成熟妇人a片免费看网站 | 亚洲中文字幕va福利 | 999久久久国产精品消防器材 | 久久 国产 尿 小便 嘘嘘 | 色婷婷久久一区二区三区麻豆 | 中文无码伦av中文字幕 | 国产人妻大战黑人第1集 | 日本一区二区三区免费高清 | 国产超碰人人爽人人做人人添 | 日日摸天天摸爽爽狠狠97 | 亚洲午夜福利在线观看 | 午夜福利电影 | 亚洲人亚洲人成电影网站色 | а天堂中文在线官网 | 女人和拘做爰正片视频 | 美女黄网站人色视频免费国产 | 黑人巨大精品欧美一区二区 | 日本成熟视频免费视频 | 久久亚洲日韩精品一区二区三区 | 欧美成人高清在线播放 | 青青草原综合久久大伊人精品 | 日日碰狠狠躁久久躁蜜桃 | 国产99久久精品一区二区 | 国产亚洲精品久久久久久 | 蜜臀av在线播放 久久综合激激的五月天 | 麻豆果冻传媒2021精品传媒一区下载 | 国产真实伦对白全集 | 国产猛烈高潮尖叫视频免费 | 人人妻人人澡人人爽欧美精品 | 国产热a欧美热a在线视频 | 国产成人无码区免费内射一片色欲 | 狠狠亚洲超碰狼人久久 | 日本大香伊一区二区三区 | aⅴ在线视频男人的天堂 | 999久久久国产精品消防器材 | 精品无码一区二区三区的天堂 | 人妻aⅴ无码一区二区三区 | 中文字幕无码av波多野吉衣 | 啦啦啦www在线观看免费视频 | 亚洲午夜福利在线观看 | 熟妇人妻无乱码中文字幕 | 欧美人与禽zoz0性伦交 | 人人妻人人澡人人爽精品欧美 | 无码吃奶揉捏奶头高潮视频 | 成人精品一区二区三区中文字幕 | 老头边吃奶边弄进去呻吟 | 丰满少妇女裸体bbw | 久久久久国色av免费观看性色 | 女人被男人爽到呻吟的视频 | 九月婷婷人人澡人人添人人爽 | 美女毛片一区二区三区四区 | 男女作爱免费网站 | 亚洲人成无码网www | 麻豆国产人妻欲求不满谁演的 | 狠狠色色综合网站 | av小次郎收藏 | 97人妻精品一区二区三区 | 欧美 日韩 人妻 高清 中文 | 日韩精品无码一区二区中文字幕 | 精品厕所偷拍各类美女tp嘘嘘 | 强伦人妻一区二区三区视频18 | 久久久久免费精品国产 | 成人一在线视频日韩国产 | 免费无码av一区二区 | 毛片内射-百度 | 婷婷综合久久中文字幕蜜桃三电影 | 国产精品自产拍在线观看 | 婷婷丁香五月天综合东京热 | 亚洲性无码av中文字幕 | 少妇无码av无码专区在线观看 | 欧美激情一区二区三区成人 | 亚洲精品久久久久avwww潮水 | 波多野结衣高清一区二区三区 | 色狠狠av一区二区三区 | 中文字幕 人妻熟女 | 国产无遮挡又黄又爽又色 | 中文字幕+乱码+中文字幕一区 | 亚洲成av人在线观看网址 | 成人无码精品1区2区3区免费看 | 成人毛片一区二区 | 亚洲国产精品成人久久蜜臀 | 高潮毛片无遮挡高清免费视频 | 色诱久久久久综合网ywww | 日日干夜夜干 | 亚洲色www成人永久网址 | 国产精品高潮呻吟av久久 | 免费无码肉片在线观看 | 久久人人爽人人爽人人片av高清 | 亚洲经典千人经典日产 | 天堂无码人妻精品一区二区三区 | 天天综合网天天综合色 | 成人性做爰aaa片免费看不忠 | 十八禁视频网站在线观看 | 国产av无码专区亚洲a∨毛片 | 四虎永久在线精品免费网址 | 日韩 欧美 动漫 国产 制服 | 人妻少妇被猛烈进入中文字幕 | 在教室伦流澡到高潮hnp视频 | 亚洲欧美精品aaaaaa片 | 国产深夜福利视频在线 | 一本加勒比波多野结衣 | 国产成人精品优优av | 激情亚洲一区国产精品 | 国产网红无码精品视频 | 亚洲精品久久久久久久久久久 | 国产乱人伦av在线无码 | 欧美丰满老熟妇xxxxx性 | 日本一区二区更新不卡 | 夜夜影院未满十八勿进 | 亚洲精品鲁一鲁一区二区三区 | 亚洲精品欧美二区三区中文字幕 | 亚洲午夜久久久影院 | 妺妺窝人体色www在线小说 | 成人av无码一区二区三区 | 午夜性刺激在线视频免费 | 国产精品美女久久久久av爽李琼 | 久久精品无码一区二区三区 | 无码人妻精品一区二区三区下载 | 国产做国产爱免费视频 | 国产精品办公室沙发 | 人妻无码αv中文字幕久久琪琪布 | 曰韩少妇内射免费播放 | 中文字幕日产无线码一区 | 性欧美疯狂xxxxbbbb | 国内精品久久久久久中文字幕 | 欧美高清在线精品一区 | 精品厕所偷拍各类美女tp嘘嘘 | 亚洲第一无码av无码专区 | 免费无码的av片在线观看 | 中文字幕人成乱码熟女app | 一本加勒比波多野结衣 | 高清不卡一区二区三区 | 免费男性肉肉影院 | 亚洲欧洲中文日韩av乱码 | 亚洲一区二区三区 | 少妇太爽了在线观看 | 日韩av无码一区二区三区 | 一本色道久久综合狠狠躁 | 国产在热线精品视频 | 丁香花在线影院观看在线播放 | 国产农村妇女高潮大叫 | 欧美人与禽猛交狂配 | 亚洲欧美色中文字幕在线 | 成在人线av无码免费 | 亚洲gv猛男gv无码男同 | 爆乳一区二区三区无码 | 男人扒开女人内裤强吻桶进去 | 亚洲日韩乱码中文无码蜜桃臀网站 | 亚洲成av人综合在线观看 | a片在线免费观看 | 国产精品久久久 | 亚洲精品综合一区二区三区在线 | 一区二区三区高清视频一 | 麻豆精品国产精华精华液好用吗 | 免费乱码人妻系列无码专区 | 国产av一区二区三区最新精品 | 夜夜影院未满十八勿进 | 亚洲精品午夜国产va久久成人 | 亚洲第一无码av无码专区 | 国产精品99久久精品爆乳 | 国产超级va在线观看视频 | 在线 国产 欧美 亚洲 天堂 | 国产精华av午夜在线观看 | 国产精品免费大片 | 午夜福利一区二区三区在线观看 | 2020久久香蕉国产线看观看 | 中文字幕无码人妻少妇免费 | 亚洲一区二区三区无码久久 | 欧美刺激性大交 | 国产精品无码一区二区三区不卡 | 欧美老人巨大xxxx做受 | 理论片87福利理论电影 | 成 人 网 站国产免费观看 | 国内少妇偷人精品视频免费 | 婷婷五月综合缴情在线视频 | 荫蒂被男人添的好舒服爽免费视频 | 狠狠综合久久久久综合网 | 天天拍夜夜添久久精品大 | 日韩欧美中文字幕在线三区 | 亚洲爆乳精品无码一区二区三区 | 欧洲欧美人成视频在线 | 牲交欧美兽交欧美 | 狠狠噜狠狠狠狠丁香五月 | 最近的中文字幕在线看视频 | 亚洲欧美日韩国产精品一区二区 | 亚洲七七久久桃花影院 | 97无码免费人妻超级碰碰夜夜 | 我要看www免费看插插视频 | а√天堂www在线天堂小说 | 国产精品对白交换视频 | 99麻豆久久久国产精品免费 | 中文字幕无码热在线视频 | 国产真人无遮挡作爱免费视频 | 国产精品资源一区二区 | 国产精品va在线观看无码 | 亚洲人亚洲人成电影网站色 | 免费播放一区二区三区 | 丰腴饱满的极品熟妇 | 欧美亚洲日韩国产人成在线播放 | 亚洲a无码综合a国产av中文 | 在线精品亚洲一区二区 | 无码人妻精品一区二区三区下载 | 性开放的女人aaa片 | 99精品国产综合久久久久五月天 | 搡女人真爽免费视频大全 | 日韩成人一区二区三区在线观看 | 国产麻豆精品精东影业av网站 | 国产av人人夜夜澡人人爽麻豆 | 久久99热只有频精品8 | 国产乱码精品一品二品 | 午夜肉伦伦影院 | 又大又黄又粗又爽的免费视频 | 国产超碰人人爽人人做人人添 | 欧美一区二区三区 | 精品国产av色一区二区深夜久久 | 色一情一乱一伦一视频免费看 | 成人精品一区二区三区中文字幕 | 中文字幕精品av一区二区五区 | 成年美女黄网站色大免费视频 | 夜夜夜高潮夜夜爽夜夜爰爰 | 人妻少妇被猛烈进入中文字幕 | 人人妻在人人 | 动漫av一区二区在线观看 | 亚洲一区二区观看播放 | 人人爽人人爽人人片av亚洲 | 粉嫩少妇内射浓精videos | 亚洲午夜无码久久 | 无码毛片视频一区二区本码 | 水蜜桃亚洲一二三四在线 | 久久精品国产一区二区三区 | 99久久精品无码一区二区毛片 | 久久久国产一区二区三区 | 国产激情无码一区二区 | 亚洲爆乳精品无码一区二区三区 | 国产欧美精品一区二区三区 | 国产人成高清在线视频99最全资源 | 国产亚洲精品久久久久久大师 | 日韩精品成人一区二区三区 | 国产成人久久精品流白浆 | 欧美老人巨大xxxx做受 | 亚洲国产欧美在线成人 | 精品无码国产自产拍在线观看蜜 | 强伦人妻一区二区三区视频18 | 亚洲娇小与黑人巨大交 | 99麻豆久久久国产精品免费 | 中国女人内谢69xxxxxa片 | 免费国产成人高清在线观看网站 | 久久久精品456亚洲影院 | 国产精品无码成人午夜电影 | 精品厕所偷拍各类美女tp嘘嘘 | 久久精品国产一区二区三区 | 国产性生交xxxxx无码 | 少妇被黑人到高潮喷出白浆 | 老熟妇仑乱视频一区二区 | 捆绑白丝粉色jk震动捧喷白浆 | 亚洲成色在线综合网站 | 精品无码一区二区三区的天堂 | 精品日本一区二区三区在线观看 | 一本久道久久综合狠狠爱 | 国产精品无码成人午夜电影 | 人人爽人人澡人人高潮 | 久久99热只有频精品8 | 色情久久久av熟女人妻网站 | 东北女人啪啪对白 | 成人精品一区二区三区中文字幕 | 野外少妇愉情中文字幕 | 国产香蕉尹人综合在线观看 | 香港三级日本三级妇三级 | 国产乱子伦视频在线播放 | 亚洲熟女一区二区三区 | 性色av无码免费一区二区三区 | 国产精品久久精品三级 | 久久久久99精品成人片 | 亚洲国产欧美在线成人 | 日本精品人妻无码免费大全 | 亚洲 激情 小说 另类 欧美 | 久久久久成人精品免费播放动漫 | 精品成人av一区二区三区 | 精品久久久久香蕉网 | 精品人妻人人做人人爽夜夜爽 | 在线播放亚洲第一字幕 | 亚洲精品国产精品乱码视色 | a片在线免费观看 | 激情内射亚州一区二区三区爱妻 | 国产极品美女高潮无套在线观看 | 色欲av亚洲一区无码少妇 | 正在播放东北夫妻内射 | 搡女人真爽免费视频大全 | 国产成人久久精品流白浆 | 亚洲精品久久久久avwww潮水 | 人妻夜夜爽天天爽三区 | 国产黑色丝袜在线播放 | 久久国产劲爆∧v内射 | 国产精品高潮呻吟av久久4虎 | av无码电影一区二区三区 | 国产又粗又硬又大爽黄老大爷视 | 少妇性l交大片欧洲热妇乱xxx | 熟妇激情内射com | 亚洲综合在线一区二区三区 | 中文字幕乱码中文乱码51精品 | 色婷婷综合中文久久一本 | 中文字幕人成乱码熟女app | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 男女超爽视频免费播放 | 欧美日本精品一区二区三区 | 亚洲精品中文字幕久久久久 | 国产高清不卡无码视频 | 日本护士毛茸茸高潮 | 性欧美大战久久久久久久 | 久久久中文久久久无码 | 欧美人与牲动交xxxx | 国产一区二区三区日韩精品 | 无码av中文字幕免费放 | 最近免费中文字幕中文高清百度 | 久久精品人人做人人综合试看 | 日本熟妇人妻xxxxx人hd | 日日摸天天摸爽爽狠狠97 | 18无码粉嫩小泬无套在线观看 | 少妇高潮喷潮久久久影院 | 国产手机在线αⅴ片无码观看 | 久久zyz资源站无码中文动漫 | 99麻豆久久久国产精品免费 | 一本久久a久久精品亚洲 | 强开小婷嫩苞又嫩又紧视频 | 久久久久人妻一区精品色欧美 | 牲交欧美兽交欧美 | 欧美丰满熟妇xxxx性ppx人交 | 久久无码专区国产精品s | 一本无码人妻在中文字幕免费 | 亚洲中文字幕无码中文字在线 | 少妇激情av一区二区 | 欧美乱妇无乱码大黄a片 | 国产极品视觉盛宴 | 97久久超碰中文字幕 | 无码午夜成人1000部免费视频 | 伊人久久大香线蕉亚洲 | 国产精品久久久一区二区三区 | 久久99精品久久久久久动态图 | 精品久久久久香蕉网 | 999久久久国产精品消防器材 | 天天摸天天碰天天添 | 99国产欧美久久久精品 | 又大又硬又爽免费视频 | 亚洲成在人网站无码天堂 | 2020久久香蕉国产线看观看 | 国产高清不卡无码视频 | 亚洲色欲色欲欲www在线 | 日日鲁鲁鲁夜夜爽爽狠狠 | 国产精品无码成人午夜电影 | 中文无码精品a∨在线观看不卡 | 国产卡一卡二卡三 | 99久久精品无码一区二区毛片 | 奇米影视7777久久精品人人爽 | 国产国产精品人在线视 | 东京一本一道一二三区 | 国产精品久久久久久亚洲毛片 | 亚洲 另类 在线 欧美 制服 | 国产成人久久精品流白浆 | 精品一区二区三区波多野结衣 | 国产精品亚洲专区无码不卡 | 久久人人爽人人爽人人片av高清 | 人妻无码αv中文字幕久久琪琪布 | 99久久人妻精品免费二区 | 国产精品99久久精品爆乳 | 国产一区二区三区精品视频 | 日韩欧美群交p片內射中文 | 亚洲精品一区二区三区在线观看 | 四虎永久在线精品免费网址 | 成年美女黄网站色大免费视频 | 性色欲网站人妻丰满中文久久不卡 | 亚洲爆乳大丰满无码专区 | 久久久久久久久888 | 玩弄中年熟妇正在播放 | 熟女体下毛毛黑森林 | 真人与拘做受免费视频 | 人人妻在人人 | 国产精品无码一区二区桃花视频 | 精品人妻中文字幕有码在线 | 性欧美熟妇videofreesex | 国产精品亚洲lv粉色 | 鲁鲁鲁爽爽爽在线视频观看 | 国产午夜精品一区二区三区嫩草 | 中文字幕+乱码+中文字幕一区 | 久久综合狠狠综合久久综合88 | 久久www免费人成人片 | 欧美性色19p | 精品人妻中文字幕有码在线 | 精品午夜福利在线观看 | 国产三级久久久精品麻豆三级 | www成人国产高清内射 | 亚洲爆乳无码专区 | 久久精品国产99精品亚洲 | 天天躁日日躁狠狠躁免费麻豆 | 久久国产精品偷任你爽任你 | 东京热一精品无码av | 国产精品第一国产精品 | 亚洲另类伦春色综合小说 | 又大又黄又粗又爽的免费视频 |