国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频

Spring Bean生命周期

共 11494字,需瀏覽 23分鐘

 ·

2021-02-20 10:17

點擊上方藍色字體,選擇“標星公眾號”

優(yōu)質文章,第一時間送達

? 作者?|? Gouden

來源 |? urlify.cn/2QZr6f

76套java從入門到精通實戰(zhàn)課程分享

Spring Bean生命周期整體可分為以下幾個階段:

  • Spring Bean元信息處理階段

  • Spring Bean實例化階段

  • Spring Bean初始化階段

  • Spring Bean銷毀階段

  • Spring Bean垃圾收集階段

Spring Bean生命周期處理是Spring應用上下文生命周期的一部分,可以參考此文了解Spring應用上下文生命周期。

Spring Bean元信息處理階段

Spring Bean元信息處理階段可以細分為以下幾個階段:

  • Spring Bean元信息解析階段

  • Spring BeanDefinition注冊階段

  • Spring BeanDefinition合并階段

Spring Bean元信息解析階段

在Spring應用上下文生命周期里有一個創(chuàng)建BeanFactory階段,在這個階段會創(chuàng)建底層IoC容器BeanFactory,然后會進行一些別的操作,其中一個操作就是處理Spring Bean元信息,代碼如下所示:

protected?final?void?refreshBeanFactory()?throws?BeansException?{
????????if?(hasBeanFactory())?{
????????????destroyBeans();
????????????closeBeanFactory();
????????}
????????try?{
????????????DefaultListableBeanFactory?beanFactory?=?createBeanFactory();
????????????beanFactory.setSerializationId(getId());
????????????customizeBeanFactory(beanFactory);
????????????loadBeanDefinitions(beanFactory);
????????????synchronized?(this.beanFactoryMonitor)?{
????????????????this.beanFactory?=?beanFactory;
????????????}
????????}
????????catch?(IOException?ex)?{
????????????throw?new?ApplicationContextException("I/O?error?parsing?bean?definition?source?for?"?+?getDisplayName(),?ex);
????????}
????}

可以看出這個方法會調用方法loadBeanDefinitions加載Spring Bean元信息: BeanDefinition。

loadBeanDefinitions在子類AbstractXmlApplicationContext有一個實現(xiàn),代碼如下所示:

@Override
????protected?void?loadBeanDefinitions(DefaultListableBeanFactory?beanFactory)?throws?BeansException,?IOException?{
????????//創(chuàng)建XmlBeanDefinitionReader解析XML配置文件讀取Spring?Bean元信息
????????XmlBeanDefinitionReader?beanDefinitionReader?=?new?XmlBeanDefinitionReader(beanFactory);

????????//設置Spring?Bean元信息讀取配置
????????beanDefinitionReader.setEnvironment(this.getEnvironment());
????????beanDefinitionReader.setResourceLoader(this);
????????beanDefinitionReader.setEntityResolver(new?ResourceEntityResolver(this));

????????//初始化XmlBeanDefinitionReader
????????initBeanDefinitionReader(beanDefinitionReader);?????//加載Spring?Bean元信息
????????loadBeanDefinitions(beanDefinitionReader);
????}
protected?void?loadBeanDefinitions(XmlBeanDefinitionReader?reader)?throws?BeansException,?IOException?{?????//獲取資源配置
????????Resource[]?configResources?=?getConfigResources();?????//如果不是空,加載對應資源
????????if?(configResources?!=?null)?{
????????????reader.loadBeanDefinitions(configResources);
????????}?????//獲取資源配置字符串,是路徑
????????String[]?configLocations?=?getConfigLocations();?????//如果不是空,加載對應資源
????????if?(configLocations?!=?null)?{
????????????reader.loadBeanDefinitions(configLocations);
????????}
????}

這一塊代碼邏輯比較簡單,就是使用XmlBeanDefinitionReader加載Spring Bean元信息,這里指處理了XML配置的元信息。

還有一種常用Spring Bean元信息配置是注解,針對這種Spring Bean元信息配置的解析,在AnnotationConfigApplicationContext進行處理,代碼如下所示:

????public?AnnotationConfigApplicationContext(String...?basePackages)?{
????????this();
????????scan(basePackages);
????????refresh();
????}

AnnotationConfigApplicationContext一個構造器里會調用scan方法掃描指定包路徑,會使用ClassPathBeanDefinitionScanner的scan能力掃描具有某些注解的類,把這些類加載為Spring Bean元信息。

Spring BeanDefinition注冊階段

上面著重介紹了Spring Bean元信息解析,Spring Bean元信息解析之后,就要注冊并保存起來,方便后續(xù)使用。

Spring具有一個數(shù)據(jù)結構BeanDefinitionRegistry,解析后的BeanDefinition會注冊到BeanDefinitionRegistry,BeanDefinitionRegistry是一個接口,一個典型的實現(xiàn)類是DefaultListableBeanFactory。

DefaultListableBeanFactory里的registerBeanDefinition方法實現(xiàn)如下所示(這里刪除了一些打印日志分支):

public?void?registerBeanDefinition(String?beanName,?BeanDefinition?beanDefinition)
????????????throws?BeanDefinitionStoreException?{
?????//校驗入?yún)?br>????????Assert.hasText(beanName,?"Bean?name?must?not?be?empty");
????????Assert.notNull(beanDefinition,?"BeanDefinition?must?not?be?null");
?????????//判斷BeanDefinition是否是AbstractBeanDefinition類或子類的對象,如果是,進行校驗
????????if?(beanDefinition?instanceof?AbstractBeanDefinition)?{
????????????try?{
????????????????((AbstractBeanDefinition)?beanDefinition).validate();
????????????}
????????????catch?(BeanDefinitionValidationException?ex)?{
????????????????throw?new?BeanDefinitionStoreException(beanDefinition.getResourceDescription(),?beanName,
????????????????????????"Validation?of?bean?definition?failed",?ex);
????????????}
????????}
?????//判斷beanName對應BeanDefinition是否存在
????????BeanDefinition?existingDefinition?=?this.beanDefinitionMap.get(beanName);?????//如果已經(jīng)存在,判斷是否允許覆蓋,這里覆蓋是指一個beanName有兩個不同BeanDefinition,默認允許
????????if?(existingDefinition?!=?null)?{????????//如果不允許覆蓋,拋出異常
????????????if?(!isAllowBeanDefinitionOverriding())?{
????????????????throw?new?BeanDefinitionOverrideException(beanName,?beanDefinition,?existingDefinition);
????????????}????????//如果允許覆蓋,覆蓋配置
????????????this.beanDefinitionMap.put(beanName,?beanDefinition);
????????}
????????else?{????????//判斷是否已經(jīng)有Bean被創(chuàng)建了
????????????if?(hasBeanCreationStarted())?{
????????????????//如果是就不能修改之前集合,需要全量覆蓋
????????????????synchronized?(this.beanDefinitionMap)?{
????????????????????this.beanDefinitionMap.put(beanName,?beanDefinition);
????????????????????List?updatedDefinitions?=?new?ArrayList<>(this.beanDefinitionNames.size()?+?1);
????????????????????updatedDefinitions.addAll(this.beanDefinitionNames);
????????????????????updatedDefinitions.add(beanName);
????????????????????this.beanDefinitionNames?=?updatedDefinitions;
????????????????????removeManualSingletonName(beanName);
????????????????}
????????????}
????????????else?{
????????????????//如果不是就修改之前集合
????????????????this.beanDefinitionMap.put(beanName,?beanDefinition);
????????????????this.beanDefinitionNames.add(beanName);
????????????????removeManualSingletonName(beanName);
????????????}
????????????this.frozenBeanDefinitionNames?=?null;
????????}
?????//判斷是否存在這個配置且已經(jīng)創(chuàng)建單例Bean
????????if?(existingDefinition?!=?null?||?containsSingleton(beanName))?{????????//如果是就清除緩存
????????????resetBeanDefinition(beanName);
????????}
????}

Spring BeanDefinition合并階段

Spring BeanDefinition在用來實例化前,還需要做的一件事就是Spring BeanDefinition合并。

在底層IoC容器通常會有兩種BeanDefinition,一個是GenericBeanDefinition,一個是RootBeanDefinition,一個Bean在實例化前,對應BeanDefinition都要轉化成RootBeanDefinition。

GenericBeanDefinition保存原始的Spring Bean元信息,可以指定父Bean的beanName,但是不會繼承父Bean的屬性,還不具備實例化的能力。

GenericBeanDefinition在合并之后會變成RootBeanDefinition,這時RootBeanDefinition不會保存父Bean的beanName,但是會從父Bean繼承屬性。

就算一個GenericBeanDefinition沒有父Bean也需要轉換成RootBeanDefinition。

BeanDefinition合并操作通常在實例化前進行,ConfigurableBeanFactory#getMergedBeanDefinition方法會合并對應BeanDefinition并且返回,getMergedBeanDefinition(AbstractBeanFactory)代碼如下所示:

public?BeanDefinition?getMergedBeanDefinition(String?name)?throws?BeansException?{
????????String?beanName?=?transformedBeanName(name);
????????//判斷當前BeanFactory不存在對應BeanDefinition,從父BeanFactory獲取合并后的BeanDefinition
????????if?(!containsBeanDefinition(beanName)?&&?getParentBeanFactory()?instanceof?ConfigurableBeanFactory)?{
????????????return?((ConfigurableBeanFactory)?getParentBeanFactory()).getMergedBeanDefinition(beanName);
????????}
????????//從當前BeanFactory獲取合并后的BeanDefintion
????????return?getMergedLocalBeanDefinition(beanName);
????}
protected?RootBeanDefinition?getMergedLocalBeanDefinition(String?beanName)?throws?BeansException?{
????????//從緩存里獲取RootBeanDefinition
????????RootBeanDefinition?mbd?=?this.mergedBeanDefinitions.get(beanName);?????//如果不是空并且不需要再次合并,返回緩存的RootBeanDefinition
????????if?(mbd?!=?null?&&?!mbd.stale)?{
????????????return?mbd;
????????}?????//返回合并的BeanDefinition,入?yún)⑹莃eanName、GenericBeanDefinition
????????return?getMergedBeanDefinition(beanName,?getBeanDefinition(beanName));
????}

最后會進到下面這個方法:

protected?RootBeanDefinition?getMergedBeanDefinition(
????????????String?beanName,?BeanDefinition?bd,?@Nullable?BeanDefinition?containingBd)
????????????throws?BeanDefinitionStoreException?{

????????synchronized?(this.mergedBeanDefinitions)?{
????????????RootBeanDefinition?mbd?=?null;
????????????RootBeanDefinition?previous?=?null;

????????????//加鎖后再從緩存里查詢一次,dcl
????????????if?(containingBd?==?null)?{
????????????????mbd?=?this.mergedBeanDefinitions.get(beanName);
????????????}
????????//如果獲取不到或者需要再次合并,執(zhí)行合并BeanDefinition邏輯
????????????if?(mbd?==?null?||?mbd.stale)?{
????????????????previous?=?mbd;
????????????????if?(bd.getParentName()?==?null)?{
????????????????????//如果沒有父beanName,直接生成RootBeanDefinition
????????????????????if?(bd?instanceof?RootBeanDefinition)?{
????????????????????????mbd?=?((RootBeanDefinition)?bd).cloneBeanDefinition();
????????????????????}
????????????????????else?{
????????????????????????mbd?=?new?RootBeanDefinition(bd);
????????????????????}
????????????????}
????????????????else?{
????????????????????//如果有父beanName,需要用父BeanDefinition合并生成RootBeanDefinition
????????????????????BeanDefinition?pbd;
????????????????????try?{
????????????????????????String?parentBeanName?=?transformedBeanName(bd.getParentName());
????????????????????????if?(!beanName.equals(parentBeanName))?{?????????????????//用parentBeanName獲取BeanDefinition
????????????????????????????pbd?=?getMergedBeanDefinition(parentBeanName);
????????????????????????}
????????????????????????else?{
????????????????????????????BeanFactory?parent?=?getParentBeanFactory();
????????????????????????????if?(parent?instanceof?ConfigurableBeanFactory)?{
????????????????????????????????pbd?=?((ConfigurableBeanFactory)?parent).getMergedBeanDefinition(parentBeanName);
????????????????????????????}
????????????????????????????else?{
????????????????????????????????throw?new?NoSuchBeanDefinitionException(parentBeanName,
????????????????????????????????????????"Parent?name?'"?+?parentBeanName?+?"'?is?equal?to?bean?name?'"?+?beanName?+
????????????????????????????????????????"':?cannot?be?resolved?without?an?AbstractBeanFactory?parent");
????????????????????????????}
????????????????????????}
????????????????????}
????????????????????catch?(NoSuchBeanDefinitionException?ex)?{
????????????????????????throw?new?BeanDefinitionStoreException(bd.getResourceDescription(),?beanName,
????????????????????????????????"Could?not?resolve?parent?bean?definition?'"?+?bd.getParentName()?+?"'",?ex);
????????????????????}
????????????????????//用parentBeanName獲取RootBeanDefinition創(chuàng)建RootBeanDefinition
????????????????????mbd?=?new?RootBeanDefinition(pbd);?????????????//用子BeanDefinition覆蓋RootBeanDefinition
????????????????????mbd.overrideFrom(bd);
????????????????}

????????????????//設置scope
????????????????if?(!StringUtils.hasLength(mbd.getScope()))?{
????????????????????mbd.setScope(SCOPE_SINGLETON);
????????????????}

????????????????if?(containingBd?!=?null?&&?!containingBd.isSingleton()?&&?mbd.isSingleton())?{
????????????????????mbd.setScope(containingBd.getScope());
????????????????}

????????????????//把RootBeanDefinition放到緩存
????????????????if?(containingBd?==?null?&&?isCacheBeanMetadata())?{
????????????????????this.mergedBeanDefinitions.put(beanName,?mbd);
????????????????}
????????????}
????????????if?(previous?!=?null)?{
????????????????copyRelevantMergedBeanDefinitionCaches(previous,?mbd);
????????????}
????????????return?mbd;
????????}
????}

Spring Bean實例化階段

Spring Bean實例化階段可以細分為以下幾個階段:

  • Spring Bean Class加載階段

  • Spring Bean實例化階段

  • Spring Bean實例化前階段

  • Spring Bean實例化后階段

  • Spring Bean屬性賦值前階段

  • Spring Bean賦值階段

Spring Bean Class加載階段

Spring Bean Class加載方法是AbstractBeanFactory#resolveBeanClass,代碼如下所示:

?resolveBeanClass方法會使用RootBeanDefinition里記錄的beanClassName加載對應類,保存到RootBeanDefinition并且返回。

protected?Class?resolveBeanClass(final?RootBeanDefinition?mbd,?String?beanName,?final?Class...?typesToMatch)
????????????throws?CannotLoadBeanClassException?{

????????try?{
????????????if?(mbd.hasBeanClass())?{??????????//判斷RootBeanDefinition里關聯(lián)了class,直接返回
????????????????return?mbd.getBeanClass();
????????????}
????????????if?(System.getSecurityManager()?!=?null)?{??????????//加載對應class
????????????????return?AccessController.doPrivileged((PrivilegedExceptionAction>)?()?->
????????????????????doResolveBeanClass(mbd,?typesToMatch),?getAccessControlContext());
????????????}
????????????else?{??????????//加載對應class
????????????????return?doResolveBeanClass(mbd,?typesToMatch);
????????????}
????????}
????????catch?(PrivilegedActionException?pae)?{
????????????ClassNotFoundException?ex?=?(ClassNotFoundException)?pae.getException();
????????????throw?new?CannotLoadBeanClassException(mbd.getResourceDescription(),?beanName,?mbd.getBeanClassName(),?ex);
????????}
????????catch?(ClassNotFoundException?ex)?{
????????????throw?new?CannotLoadBeanClassException(mbd.getResourceDescription(),?beanName,?mbd.getBeanClassName(),?ex);
????????}
????????catch?(LinkageError?err)?{
????????????throw?new?CannotLoadBeanClassException(mbd.getResourceDescription(),?beanName,?mbd.getBeanClassName(),?err);
????????}
????}
private?Class?doResolveBeanClass(RootBeanDefinition?mbd,?Class...?typesToMatch)
????????????throws?ClassNotFoundException?{
?????//獲取當前類加載器
????????ClassLoader?beanClassLoader?=?getBeanClassLoader();?????//定義動態(tài)類加載器,默認是上面的類加載器,可以修改擴展
????????ClassLoader?dynamicLoader?=?beanClassLoader;
????????boolean?freshResolve?=?false;

????????if?(!ObjectUtils.isEmpty(typesToMatch))?{
????????????//如果tempClassLoader不是空,動態(tài)類加載器設置為tempClassLoader
????????????ClassLoader?tempClassLoader?=?getTempClassLoader();
????????????if?(tempClassLoader?!=?null)?{
????????????????dynamicLoader?=?tempClassLoader;
????????????????freshResolve?=?true;
????????????????if?(tempClassLoader?instanceof?DecoratingClassLoader)?{
????????????????????DecoratingClassLoader?dcl?=?(DecoratingClassLoader)?tempClassLoader;
????????????????????for?(Class?typeToMatch?:?typesToMatch)?{
????????????????????????dcl.excludeClass(typeToMatch.getName());
????????????????????}
????????????????}
????????????}
????????}

????????String?className?=?mbd.getBeanClassName();
????????if?(className?!=?null)?{
????????????Object?evaluated?=?evaluateBeanDefinitionString(className,?mbd);
????????????if?(!className.equals(evaluated))?{
????????????????//如果evaluateBeanDefinitionString
????????????????if?(evaluated?instanceof?Class)?{
????????????????????return?(Class)?evaluated;
????????????????}
????????????????else?if?(evaluated?instanceof?String)?{
????????????????????className?=?(String)?evaluated;
????????????????????freshResolve?=?true;
????????????????}
????????????????else?{
????????????????????throw?new?IllegalStateException("Invalid?class?name?expression?result:?"?+?evaluated);
????????????????}
????????????}
????????????if?(freshResolve)?{
????????????????//使用dynamicLoader加載class并且不和RootBeanDefinition關聯(lián),目前沒有用到過,后面確認用處
????????????????if?(dynamicLoader?!=?null)?{
????????????????????try?{
????????????????????????return?dynamicLoader.loadClass(className);
????????????????????}
????????????????????catch?(ClassNotFoundException?ex)?{
????????????????????????if?(logger.isTraceEnabled())?{
????????????????????????????logger.trace("Could?not?load?class?["?+?className?+?"]?from?"?+?dynamicLoader?+?":?"?+?ex);
????????????????????????}
????????????????????}
????????????????}
????????????????return?ClassUtils.forName(className,?dynamicLoader);
????????????}
????????}

????????//常規(guī)處理方式,RootBeanDefinition使用默認類加載器并且關聯(lián)到RootBeanDefinition
????????return?mbd.resolveBeanClass(beanClassLoader);
????}

Spring Bean實例化階段

AbstractAutowireCapableBeanFactory#createBeanInstance方法處理Spring Bean實例化,給指定beanName創(chuàng)建一個新的實例,先后使用工廠方法、構造器自動注入、簡單實例化方式創(chuàng)建,具體代碼如下所示:?

protected?BeanWrapper?createBeanInstance(String?beanName,?RootBeanDefinition?mbd,?@Nullable?Object[]?args)?{
????????//使用RootBeanDefinition加載class
????????Class?beanClass?=?resolveBeanClass(mbd,?beanName);
?????//如果訪問不到這個類,拋出異常
????????if?(beanClass?!=?null?&&?!Modifier.isPublic(beanClass.getModifiers())?&&?!mbd.isNonPublicAccessAllowed())?{
????????????throw?new?BeanCreationException(mbd.getResourceDescription(),?beanName,
????????????????????"Bean?class?isn't?public,?and?non-public?access?not?allowed:?"?+?beanClass.getName());
????????}
?????//配置lamda方式實例化Bean
????????Supplier?instanceSupplier?=?mbd.getInstanceSupplier();
????????if?(instanceSupplier?!=?null)?{
????????????return?obtainFromSupplier(instanceSupplier,?beanName);
????????}
?????//如果是工廠方式,用工廠方式實例化對象
????????if?(mbd.getFactoryMethodName()?!=?null)?{
????????????return?instantiateUsingFactoryMethod(beanName,?mbd,?args);
????????}

????????//如果某個RootBeanDefinition已經(jīng)實例化過再次實例化,直接使用上次配置,不需要再決策
????????boolean?resolved?=?false;
????????boolean?autowireNecessary?=?false;
????????if?(args?==?null)?{
????????????synchronized?(mbd.constructorArgumentLock)?{
????????????????if?(mbd.resolvedConstructorOrFactoryMethod?!=?null)?{
????????????????????resolved?=?true;
????????????????????autowireNecessary?=?mbd.constructorArgumentsResolved;
????????????????}
????????????}
????????}
????????if?(resolved)?{
????????????if?(autowireNecessary)?{
????????????????return?autowireConstructor(beanName,?mbd,?null,?null);
????????????}
????????????else?{
????????????????return?instantiateBean(beanName,?mbd);
????????????}
????????}

????????//決策候選構造器
????????Constructor[]?ctors?=?determineConstructorsFromBeanPostProcessors(beanClass,?beanName);
????????if?(ctors?!=?null?||?mbd.getResolvedAutowireMode()?==?AUTOWIRE_CONSTRUCTOR?||
????????????????mbd.hasConstructorArgumentValues()?||?!ObjectUtils.isEmpty(args))?{
????????????return?autowireConstructor(beanName,?mbd,?ctors,?args);
????????}

????????//獲取合適構造器
????????ctors?=?mbd.getPreferredConstructors();
????????if?(ctors?!=?null)?{
????????????return?autowireConstructor(beanName,?mbd,?ctors,?null);
????????}

????????//使用無參構造器實例化對象
????????return?instantiateBean(beanName,?mbd);
????}

Spring Bean實例化前階段

AbstractAutowireCapableBeanFactory#resolveBeforeInstantiation方法提供一個擴展方式可以讓Spring Bean在實例化前做一些擴展,比如一些RPC場景,可以在這里生成RPC接口代理類,不執(zhí)行實例化邏輯,具體代碼如下所示:

protected?Object?resolveBeforeInstantiation(String?beanName,?RootBeanDefinition?mbd)?{
????????Object?bean?=?null;
????????if?(!Boolean.FALSE.equals(mbd.beforeInstantiationResolved))?{
????????????//如果有InstantiationAwareBeanPostProcessors,調用applyBeanPostProcessorsBeforeInstantiation方法獲取對象
????????????if?(!mbd.isSynthetic()?&&?hasInstantiationAwareBeanPostProcessors())?{
????????????????Class?targetType?=?determineTargetType(beanName,?mbd);
????????????????if?(targetType?!=?null)?{
????????????????????bean?=?applyBeanPostProcessorsBeforeInstantiation(targetType,?beanName);
????????????????????if?(bean?!=?null)?{
????????????????????????bean?=?applyBeanPostProcessorsAfterInitialization(bean,?beanName);
????????????????????}
????????????????}
????????????}
????????????mbd.beforeInstantiationResolved?=?(bean?!=?null);
????????}
????????return?bean;
????}
protected?Object?applyBeanPostProcessorsBeforeInstantiation(Class?beanClass,?String?beanName)?{
????????for?(BeanPostProcessor?bp?:?getBeanPostProcessors())?{
????????????if?(bp?instanceof?InstantiationAwareBeanPostProcessor)?{
????????????????InstantiationAwareBeanPostProcessor?ibp?=?(InstantiationAwareBeanPostProcessor)?bp;??????????//調用InstantiationAwareBeanPostProcessor#postProcessBeforeInstantiation方法創(chuàng)建對象
????????????????Object?result?=?ibp.postProcessBeforeInstantiation(beanClass,?beanName);
????????????????if?(result?!=?null)?{
????????????????????return?result;
????????????????}
????????????}
????????}
????????return?null;
????}

Spring Bean實例化后階段

AbstractAutowireCapableBeanFactory#applyMergedBeanDefinitionPostProcessors方法是Spring提供的第一個Spring Bean實例化后擴展,實現(xiàn)MergedBeanDefinitionPostProcessor接口即可進行擴展,具體代碼如下所示:

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);
??????}
???}
}

Spring提供的第二個實例化后擴展是InstantiationAwareBeanPostProcessor,在方法AbstractAutowireCapableBeanFactory#populateBean里有一段代碼處理這個擴展,具體代碼如下所示:

if?(!mbd.isSynthetic()?&&?hasInstantiationAwareBeanPostProcessors())?{
???for?(BeanPostProcessor?bp?:?getBeanPostProcessors())?{
??????if?(bp?instanceof?InstantiationAwareBeanPostProcessor)?{
?????????InstantiationAwareBeanPostProcessor?ibp?=?(InstantiationAwareBeanPostProcessor)?bp;
?????????if?(!ibp.postProcessAfterInstantiation(bw.getWrappedInstance(),?beanName))?{
????????????return;
?????????}
??????}
???}
}

Spring Bean賦值前階段

Spring Bean賦值前提供擴展是InstantiationAwareBeanPostProcessor#postProcessProperties和InstantiationAwareBeanPostProcessor#postProcessPropertyValues,在方法AbstractAutowireCapableBeanFactory#populateBean里有一段代碼處理這兩個擴展,具體代碼如下所示:

if?(hasInstAwareBpps)?{
???if?(pvs?==?null)?{
??????pvs?=?mbd.getPropertyValues();
???}
???for?(BeanPostProcessor?bp?:?getBeanPostProcessors())?{
??????if?(bp?instanceof?InstantiationAwareBeanPostProcessor)?{
?????????InstantiationAwareBeanPostProcessor?ibp?=?(InstantiationAwareBeanPostProcessor)?bp;
?????????PropertyValues?pvsToUse?=?ibp.postProcessProperties(pvs,?bw.getWrappedInstance(),?beanName);
?????????if?(pvsToUse?==?null)?{
????????????if?(filteredPds?==?null)?{
???????????????filteredPds?=?filterPropertyDescriptorsForDependencyCheck(bw,?mbd.allowCaching);
????????????}
????????????pvsToUse?=?ibp.postProcessPropertyValues(pvs,?filteredPds,?bw.getWrappedInstance(),?beanName);
????????????if?(pvsToUse?==?null)?{
???????????????return;
????????????}
?????????}
?????????pvs?=?pvsToUse;
??????}
???}
}

Spring Bean賦值階段

Spring Bean賦值階段代碼如下所示:

protected?void?applyPropertyValues(String?beanName,?BeanDefinition?mbd,?BeanWrapper?bw,?PropertyValues?pvs)?{
???if?(pvs.isEmpty())?{
??????return;
???}

???if?(System.getSecurityManager()?!=?null?&&?bw?instanceof?BeanWrapperImpl)?{
??????((BeanWrapperImpl)?bw).setSecurityContext(getAccessControlContext());
???}

???MutablePropertyValues?mpvs?=?null;
???List?original;

???if?(pvs?instanceof?MutablePropertyValues)?{
??????mpvs?=?(MutablePropertyValues)?pvs;
??????if?(mpvs.isConverted())?{
?????????//?Shortcut:?use?the?pre-converted?values?as-is.
?????????try?{
????????????bw.setPropertyValues(mpvs);
????????????return;
?????????}
?????????catch?(BeansException?ex)?{
????????????throw?new?BeanCreationException(
??????????????????mbd.getResourceDescription(),?beanName,?"Error?setting?property?values",?ex);
?????????}
??????}
??????original?=?mpvs.getPropertyValueList();
???}
???else?{
??????original?=?Arrays.asList(pvs.getPropertyValues());
???}

???TypeConverter?converter?=?getCustomTypeConverter();
???if?(converter?==?null)?{
??????converter?=?bw;
???}
???BeanDefinitionValueResolver?valueResolver?=?new?BeanDefinitionValueResolver(this,?beanName,?mbd,?converter);

???//?Create?a?deep?copy,?resolving?any?references?for?values.
???List?deepCopy?=?new?ArrayList<>(original.size());
???boolean?resolveNecessary?=?false;
???for?(PropertyValue?pv?:?original)?{
??????if?(pv.isConverted())?{
?????????deepCopy.add(pv);
??????}
??????else?{
?????????String?propertyName?=?pv.getName();
?????????Object?originalValue?=?pv.getValue();
?????????if?(originalValue?==?AutowiredPropertyMarker.INSTANCE)?{
????????????Method?writeMethod?=?bw.getPropertyDescriptor(propertyName).getWriteMethod();
????????????if?(writeMethod?==?null)?{
???????????????throw?new?IllegalArgumentException("Autowire?marker?for?property?without?write?method:?"?+?pv);
????????????}
????????????originalValue?=?new?DependencyDescriptor(new?MethodParameter(writeMethod,?0),?true);
?????????}
?????????Object?resolvedValue?=?valueResolver.resolveValueIfNecessary(pv,?originalValue);
?????????Object?convertedValue?=?resolvedValue;
?????????boolean?convertible?=?bw.isWritableProperty(propertyName)?&&
???????????????!PropertyAccessorUtils.isNestedOrIndexedProperty(propertyName);
?????????if?(convertible)?{
????????????convertedValue?=?convertForProperty(resolvedValue,?propertyName,?bw,?converter);
?????????}
?????????//?Possibly?store?converted?value?in?merged?bean?definition,
?????????//?in?order?to?avoid?re-conversion?for?every?created?bean?instance.
?????????if?(resolvedValue?==?originalValue)?{
????????????if?(convertible)?{
???????????????pv.setConvertedValue(convertedValue);
????????????}
????????????deepCopy.add(pv);
?????????}
?????????else?if?(convertible?&&?originalValue?instanceof?TypedStringValue?&&
???????????????!((TypedStringValue)?originalValue).isDynamic()?&&
???????????????!(convertedValue?instanceof?Collection?||?ObjectUtils.isArray(convertedValue)))?{
????????????pv.setConvertedValue(convertedValue);
????????????deepCopy.add(pv);
?????????}
?????????else?{
????????????resolveNecessary?=?true;
????????????deepCopy.add(new?PropertyValue(pv,?convertedValue));
?????????}
??????}
???}
???if?(mpvs?!=?null?&&?!resolveNecessary)?{
??????mpvs.setConverted();
???}

???//?Set?our?(possibly?massaged)?deep?copy.
???try?{
??????bw.setPropertyValues(new?MutablePropertyValues(deepCopy));
???}
???catch?(BeansException?ex)?{
??????throw?new?BeanCreationException(
????????????mbd.getResourceDescription(),?beanName,?"Error?setting?property?values",?ex);
???}
}

Spring Bean初始化階段

Spring Bean初始化階段可以細分為以下幾個階段:

  • Spring Bean Aware接口回調階段

  • Spring Bean初始化前階段

  • Spring Bean初始化階段

  • Spring Bean初始化后階段

Spring Bean初始化代碼如下所示:

protected?Object?initializeBean(final?String?beanName,?final?Object?bean,?@Nullable?RootBeanDefinition?mbd)?{???//Spring?Bean?Aware接口回調
???if?(System.getSecurityManager()?!=?null)?{
??????AccessController.doPrivileged((PrivilegedAction)?()?->?{
?????????invokeAwareMethods(beanName,?bean);
?????????return?null;
??????},?getAccessControlContext());
???}
???else?{
??????invokeAwareMethods(beanName,?bean);
???}

???Object?wrappedBean?=?bean;???//Spring?Bean初始化前階段
???if?(mbd?==?null?||?!mbd.isSynthetic())?{
??????wrappedBean?=?applyBeanPostProcessorsBeforeInitialization(wrappedBean,?beanName);
???}
???//Spring?Bean初始化階段
???try?{
??????invokeInitMethods(beanName,?wrappedBean,?mbd);
???}
???catch?(Throwable?ex)?{
??????throw?new?BeanCreationException(
????????????(mbd?!=?null???mbd.getResourceDescription()?:?null),
????????????beanName,?"Invocation?of?init?method?failed",?ex);
???}???//Spring?Bean初始化后階段
???if?(mbd?==?null?||?!mbd.isSynthetic())?{
??????wrappedBean?=?applyBeanPostProcessorsAfterInitialization(wrappedBean,?beanName);
???}

???return?wrappedBean;
}

Spring Bean Aware接口回調階段

invokeAwareMethods具體代碼如下所示:

private?void?invokeAwareMethods(final?String?beanName,?final?Object?bean)?{
????????if?(bean?instanceof?Aware)?{
????????????if?(bean?instanceof?BeanNameAware)?{
????????????????((BeanNameAware)?bean).setBeanName(beanName);
????????????}
????????????if?(bean?instanceof?BeanClassLoaderAware)?{
????????????????ClassLoader?bcl?=?getBeanClassLoader();
????????????????if?(bcl?!=?null)?{
????????????????????((BeanClassLoaderAware)?bean).setBeanClassLoader(bcl);
????????????????}
????????????}
????????????if?(bean?instanceof?BeanFactoryAware)?{
????????????????((BeanFactoryAware)?bean).setBeanFactory(AbstractAutowireCapableBeanFactory.this);
????????????}
????????}
????}

Spring Bean初始化前階段

applyBeanPostProcessorsBeforeInitialization具體代碼如下所示:

這個方法會調用BeanPostProcessor#postProcessBeforeInitialization方法。

public?Object?applyBeanPostProcessorsBeforeInitialization(Object?existingBean,?String?beanName)
????????????throws?BeansException?{

????????Object?result?=?existingBean;
????????for?(BeanPostProcessor?processor?:?getBeanPostProcessors())?{
????????????Object?current?=?processor.postProcessBeforeInitialization(result,?beanName);
????????????if?(current?==?null)?{
????????????????return?result;
????????????}
????????????result?=?current;
????????}
????????return?result;
????}

Spring Bean初始化階段

invokeInitMethods具體代碼如下所示:

protected?void?invokeInitMethods(String?beanName,?final?Object?bean,?@Nullable?RootBeanDefinition?mbd)
????????????throws?Throwable?{
?????//處理InitializingBean#afterPropertiesSet方法初始化Bean
????????boolean?isInitializingBean?=?(bean?instanceof?InitializingBean);
????????if?(isInitializingBean?&&?(mbd?==?null?||?!mbd.isExternallyManagedInitMethod("afterPropertiesSet")))?{
????????????if?(logger.isTraceEnabled())?{
????????????????logger.trace("Invoking?afterPropertiesSet()?on?bean?with?name?'"?+?beanName?+?"'");
????????????}
????????????if?(System.getSecurityManager()?!=?null)?{
????????????????try?{
????????????????????AccessController.doPrivileged((PrivilegedExceptionAction)?()?->?{
????????????????????????((InitializingBean)?bean).afterPropertiesSet();
????????????????????????return?null;
????????????????????},?getAccessControlContext());
????????????????}
????????????????catch?(PrivilegedActionException?pae)?{
????????????????????throw?pae.getException();
????????????????}
????????????}
????????????else?{
????????????????((InitializingBean)?bean).afterPropertiesSet();
????????????}
????????}
?????//處理自定義初始化方法
????????if?(mbd?!=?null?&&?bean.getClass()?!=?NullBean.class)?{
????????????String?initMethodName?=?mbd.getInitMethodName();
????????????if?(StringUtils.hasLength(initMethodName)?&&
????????????????????!(isInitializingBean?&&?"afterPropertiesSet".equals(initMethodName))?&&
????????????????????!mbd.isExternallyManagedInitMethod(initMethodName))?{
????????????????invokeCustomInitMethod(beanName,?bean,?mbd);
????????????}
????????}
????}

Spring Bean初始化后階段

applyBeanPostProcessorsAfterInitialization具體代碼如下所示:

這個方法回調用BeanPostProcessor#postProcessAfterInitialization方法。

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;
????}

Spring Bean銷毀階段

Spring Bean銷毀階段可以細分為以下幾個階段:

  • Spring Bean銷毀前階段

  • Spring Bean銷毀階段

Spring Bean在初始化后會調用registerDisposableBeanIfNecessary方法注冊到disposableBeans,方便后續(xù)銷毀。

protected?void?registerDisposableBeanIfNecessary(String?beanName,?Object?bean,?RootBeanDefinition?mbd)?{
????????AccessControlContext?acc?=?(System.getSecurityManager()?!=?null???getAccessControlContext()?:?null);
????????if?(!mbd.isPrototype()?&&?requiresDestruction(bean,?mbd))?{
????????????if?(mbd.isSingleton())?{
????????????????//注冊DisposableBeanAdapter,后續(xù)銷毀時用
????????????????registerDisposableBean(beanName,
????????????????????????new?DisposableBeanAdapter(bean,?beanName,?mbd,?getBeanPostProcessors(),?acc));
????????????}
????????????else?{
????????????????//如果不是單例而且不是原生,比如servlet里context、request等作用域,在一定階段觸發(fā)scope銷毀操作會銷毀Bean
????????????????Scope?scope?=?this.scopes.get(mbd.getScope());
????????????????if?(scope?==?null)?{
????????????????????throw?new?IllegalStateException("No?Scope?registered?for?scope?name?'"?+?mbd.getScope()?+?"'");
????????????????}
????????????????scope.registerDestructionCallback(beanName,
????????????????????????new?DisposableBeanAdapter(bean,?beanName,?mbd,?getBeanPostProcessors(),?acc));
????????????}
????????}
????}
public?void?destroy()?{?????//Spring銷毀前階段,調動DestructionAwareBeanPostProcessor#postProcessBeforeDestruction方法
????????if?(!CollectionUtils.isEmpty(this.beanPostProcessors))?{
????????????for?(DestructionAwareBeanPostProcessor?processor?:?this.beanPostProcessors)?{
????????????????processor.postProcessBeforeDestruction(this.bean,?this.beanName);
????????????}
????????}
?????//調用DisposableBean#destroy方法
????????if?(this.invokeDisposableBean)?{
????????????if?(logger.isTraceEnabled())?{
????????????????logger.trace("Invoking?destroy()?on?bean?with?name?'"?+?this.beanName?+?"'");
????????????}
????????????try?{
????????????????if?(System.getSecurityManager()?!=?null)?{
????????????????????AccessController.doPrivileged((PrivilegedExceptionAction)?()?->?{
????????????????????????((DisposableBean)?this.bean).destroy();
????????????????????????return?null;
????????????????????},?this.acc);
????????????????}
????????????????else?{
????????????????????((DisposableBean)?this.bean).destroy();
????????????????}
????????????}
????????????catch?(Throwable?ex)?{
????????????????String?msg?=?"Invocation?of?destroy?method?failed?on?bean?with?name?'"?+?this.beanName?+?"'";
????????????????if?(logger.isDebugEnabled())?{
????????????????????logger.warn(msg,?ex);
????????????????}
????????????????else?{
????????????????????logger.warn(msg?+?":?"?+?ex);
????????????????}
????????????}
????????}
?????//調用自定義銷毀函數(shù)
????????if?(this.destroyMethod?!=?null)?{
????????????invokeCustomDestroyMethod(this.destroyMethod);
????????}
????????else?if?(this.destroyMethodName?!=?null)?{
????????????Method?methodToInvoke?=?determineDestroyMethod(this.destroyMethodName);
????????????if?(methodToInvoke?!=?null)?{
????????????????invokeCustomDestroyMethod(ClassUtils.getInterfaceMethodIfPossible(methodToInvoke));
????????????}
????????}
????}

Spring Bean垃圾收集階段

Spring Bean在Spring應用上下文關閉后觸發(fā)GC會觸發(fā)Spring Bean垃圾收集。





粉絲福利:Java從入門到入土學習路線圖

??????

??長按上方微信二維碼?2 秒


感謝點贊支持下哈?

瀏覽 36
點贊
評論
收藏
分享

手機掃一掃分享

分享
舉報
評論
圖片
表情
推薦
點贊
評論
收藏
分享

手機掃一掃分享

分享
舉報

感谢您访问我们的网站,您可能还对以下资源感兴趣:

国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频 中文字幕人妻丰满熟妇| www.av免费| 亚洲无码精品视频| 人人爱人人草| 国产视频中文字幕| 天天日天天操天天射| 草比视频| 狠狠五月| 日韩爱爱网| 久久久久亚洲AV无码麻豆| 久久婷婷五月综合伊人| 黄片视频在线播放| 高清视频一区| 欧美AA级毛片| 免费国产精品视频| 成人AV一AV二| 无码国产精品一区二区性色AV| 美女毛片网站| 免费av毛片| 黄色大片中国一级片-免费看特一级片-亚洲黄色AV | 亚洲成人免费视频| 欧美视频一区二区| 久久黄色视频网站| 国产成人精品免费视频| 狠狠操网站| 精品无码秘人妻一区二区三区| 男女无码视频| 91日逼视频| 7777影视电视剧在线观看官网| 91人妻人人澡人人爽人人精品乱 | 另类天堂| 乱伦无码| 久热久| 中文有码| 国产午夜男女性爱| 精品无码一区二区三区| 亚洲无码三级片| 肏屄视频在线观看| 蜜臀久久99精品久久久久久牛牛| 大乳奶一级婬片A片| 日韩一区二区三区四区| 日韩人妻精品中文字幕免费| 大香蕉操逼| 久艹视频在线观看| 亚洲免费高清| 日本中文字幕在线观看| 婷婷激情综合| 大香蕉尹人在线| 国产三级片网站| 搡BBBB推BBBB推BBBB| 亚洲免费视频在线观看| 无码一级| 少妇BBBBBB| 欧美性久久久久| 国产美女啪啪| 欧美在线国产| 18禁网站在线看| 久久理论电影| 一级片电影网站| 在线看毛片网站| 国产精品无| 国产亚洲视频免费观看| 国产乱子伦真实精品!| 香蕉视频成人在线观看| 大香蕉亚洲在线| 日日搔AV一区二区三区| 婷婷毛片| 亚洲第一视频在线观看| 99久久婷婷国产综合精品hsex | 熊猫视频91| AV网站入口| 欧美久久一区二区三区四区视频| 久久成人久久| 在线不卡无码| 无码av高清| 嫩草嫩草69| 永久AV免费网站| 成人激情免费视频| 欧美黄片一区| 欧美淫乱视频| 成人在线精品视频| 欧美级毛片一进一出| AV在线免费播放| 日韩在线观看| 日都一级A片| 欧美A一| 无码视频一二三区| 江苏妇搡BBBB搡BBBB-百度| 成人性爱免费网站| 蜜臀久久久99久久久久久久| 无码中文字幕在线视频| 小黄片在线看| 中文字幕日韩人妻在线| 国产黄色三级片| 夜夜骚精品人妻av一区| 久草黄色电影| 爽爽午国产浪潮AV性色www| 波多野结衣视频无码| 91在线成人电影| 亚洲男人的天堂视频网在线观看+720P | 久久精品99视频| 中国毛片网站| 国产视频精品一区二区三区| 国产九九九视频| 成年人免费视频在线观看| 青娱乐亚洲精品| 黄色片视频在线观看| 军人妓女院BD高清片在线播放| 青娱乐偷拍| 一区二区三区精品| 插菊花综合网亚洲| 亚洲日韩精品成人无码专区AV| h视频在线观看网站| 无码AV动漫| 浮力影院欧美| 久久久久久成人电影| 在线不卡| 国产精品视频一区二区三| 久久九九免费视频| 欧美在线操| 日韩一区二区三区无码| 午夜偷拍| 婷婷午夜精品久久久久久性色AV| 91成人18| 中日美朝美女一级片免费看| 大香蕉精品一区| 日韩黄色精品| www.三级片| 欧美色色网站| 欧美在线一区二区三区| 高清无码一区二区三区| 先锋影音亚洲AV每日资源网站| 强行征服邻居人妻HD高清日本| 色婷婷激情综合网| 九九九免费| www.国产在线| 一区二区三区精品| 男人的天堂视频在线观看| 激情久久综合| 麻豆乱伦视频| 少妇综合网| 99无码秘蜜桃人妻一区二区三区| www.爆操| A色片| 性九九九九九九| 国产日韩在线视频| 免费的av| 欧美精品18videosex性欧美| 国产探花一区二区三区| 操逼中文字幕| 国产一级免费| 国产三级电影| 色噜噜在线观看| 免费在线观看A| 这里只有精品在线观看| 伊人成色| 加勒比无码人妻| 日韩无码A级片| 中文无码观看| 欧美精品日韩在线观看| 日韩黄色三级片| 日本色色网站免费| 超碰97成人| 麻豆传媒一区二区| 亚洲日韩av在线| 先锋AV资源| 日韩无码不卡电影| 亚洲AV无码成人精品区久| 成人精品视频网站| 天天av天天av天天爽| 88AV视频| 毛片a级| 国产午夜视频在线| 刘玥91精一区二区三区| 婷婷五月在线| 亚洲欧美视频| 国产精品高潮呻吟久久| 国精产品一区一区三区| 亚洲天堂av在线观看| 超碰97成人| 狠狠躁日日躁夜夜躁A片小说免费| 国产一级片免费观看| 欧美一级a| 伊人黄色网| 男人天堂免费视频| 男女啪啪网| 91人妻在线| 日本操屄视频| 亚洲精选一区二区三区| 久久国产劲爆∧v内射| 内射午夜福利在线免费观看视频| 天天日天天综合| 人人插人人射| 久久99热这里只频精品6学生| 久久久久久国际四虎免费精品视频| 中文字幕在线视频无码| 亚洲黄色免费电影| 国产高潮视频| 在线观看成人三级片| 伊人天天日| 天堂成人在线| 麻豆传媒视频观看| 91在线视频免费播放| 国产秘精品一区二区三区免费| 久久99久久99久久99国内少妇精品| 国产熟妇婬乱一区二区| 性饥渴欧美老妇XXXXX| 毛片aaa| 性爱福利视频| 欧美成人A片在线观看| 操逼视频下载| 九九在线观看视频| 先锋影音在线资源| 久久久久久黄片| 午夜AV在线免费观看| 亚洲小视频在线观看| 国产91综合一区在线观看| 亚洲精品国产精品国自产网站| 丰满岳乱妇一区二区三区| 国产A片| 狠狠做深爱婷婷久久综合一区| 九九热av| av在线天堂| 亚洲砖区免费| 日本综合视频| 欧美黄片免费| 91在线无码精品秘入口电车| 老骚逼| 欧美在线不卡综合| 老汉av| JiZZjiZZ亚洲成熟熟妇| 日本特级黄色毛片| 日本一级特黄大片AAAAA级| 91女人18片女毛片60分钟| 日韩23岁观看| 无码蜜桃吴梦梦| 日韩高清一级| 亚洲精品97久久| 人人操人人摸人人爽| 免费毛片网址| 麻豆国产成人AV一区二区三区| 婷婷午夜精品久久久久久| 大鸡巴久久| 天天色天天干天天| 黄色电影天堂| 91人人| 艹在线观看| 91免费看片| 久草黄色电影在线观看| 国产免费av网站| 欧美理论片在线观看| 三级片在线观看网站| 91色逼| 中文字幕中文字幕| 亚洲成人在线一区| 91精品国产aⅴ一区二区| 91探花足浴店按摩店| 日韩AV自拍| 黄色伊人网| 佐山爱人妻无码蜜桃| 国产三级网址| 美女天天操| 人妻熟女88AⅤ| 日韩黄色无码视频| 国产A片免费视频| 天天干天天干天| 91无码精品| 99免费热视频| 免费高潮视频| 成人性生活影视av| 国产香蕉精品视频| 伊人成人在线| 自拍偷拍亚洲无码| a视频在线免费观看| 精品国产AV色一区二区深夜久久| 怡红院欧美| 激情小视频国产在线播放| 十八女人高潮A片免费| 玖玖资源在线| 亚洲国产综合AV在线| 操操操影院| 欧美操逼免费视频| 色婷婷影音| 操逼的视频| 自拍啪啪| 中文字幕在线一区| 丁香婷婷五月基地| 人人爱人人射| 日韩xxx视频| 一级a一级a爱片免费免免高潮 | 中文观看| 西西444www| 韩国一区二区在线观看| 免费毛片网| 国产精品成人3p一区二区三区| 久久久91精品国产一区苍井空| 欧美日韩狠狠操在线观看视频 | 麻豆精品无码| 欧美做爱网站| 国产亲子乱婬一级A片借种| 亚洲97| 精品人妻在线| 国模在线| 青草久久久久| 久久午夜无码鲁丝片午夜精| 中文字幕第一页亚洲| 无码成人A片在线观看| 亚洲激情偷拍| 亚洲AV无码成人精品区大猫| 亚洲v欧美v| 麻豆三级片在线观看| 男女操逼视频网站免费| 超碰2022| 亚洲人内射片又| 国产乱码一区二区三区的区别| 欧美黄色小说| 人妻斩り43歳| 操逼综合网| 日韩av小电影| 日韩无码专区| 国产一级a毛一级a毛视频在线网站)| 国产成人电影| 国产高清免费无码| 亚洲精品一区二区二区的游戏情况| 北条麻妃JUX-869无码播放| 四虎网站| 天天草天天撸| 成人在线免费观看国产| 波多野结衣一级婬片A片免费下载 囯产精品久久久久久久久免费无码 | 视频一视频二在线视频| 欧美日韩免费视频| 成人肏逼视频在线| 日韩有码一区| 可以免费观看的AV| 91麻豆精品91久久久ios版| 国产成人三级在线| 狠狠色丁香| 男女AV在线免费观看| 国产又爽又黄免费视频免费 | jizz日本护士| 无码视频在线观看免费| 亚洲福利在线免费观看| 三级网站免费| 91乱| 少妇高潮视频| 乱子伦日B视频| av久| 97午夜福利| 中文字幕69| 亚洲精品无码久久久| 大香蕉久在线| 久久精品小视频| 97超碰中文字幕| 91在线视频播放| 国产农村妇女精品一二区| 亚洲熟女一区二区三区妖精 | 婷婷99狠狠躁天天| 天天爽夜夜爽AA片免费| 性爱福利视频| 日韩av在线看| 国产秘久久一区二区| 乱伦内射视频| 一插菊花综合网| 久久久久久无码| 黄色插逼视频| www.17c嫩嫩草色蜜桃网站| 亚洲三级视频在线播出| 91乱子伦国产乱子伦!| 另类老妇性BBwBBw图片| 国产激情视频| 一级黄色录像带| 成年人视频在线观看免费| 欧美精品久久| 另类国产| 久久V| 又大又粗又爽| 免费av毛片| 猫咪AV成人永久网站| 国产免费av网站| 婷婷久久综合| 亚洲69p| 国产成人午夜福利视频| 日韩免费A片| 先锋成人av| 搞黄免费视频视频| 日韩无码www| 大鸡巴久久久久| 人人色人人爱| 我和岳m愉情XXXⅩ视频| 青青草做爱视频| 国产一区二区三区免费视频| 中韩日美免费看的电影| 高清无码一区二区三区| av网站免费看| 噼里啪啦免费观看视频大全| 豆花视频| 91亚洲国产成人久久精品麻豆| 久久911| 国产一二三| 成人免费乱码大片a毛片蜜芽| 国产成人精品八戒| 精品人妻午夜一区二区三区四区| 国产精品一区二区三区不卡| a视频在线观看| 婷婷五月欧美| 91香蕉视频在线看| 国产成人秘免费观看一区二区三区| 俺来俺也去www色在线观看| 亚洲人妻性爱| 西西特级无码444www| av影片在线播放| 日韩一级电影在线| 中文字幕一区二区三区四虎在线| 日韩无码AV一区二区三区| 日韩av免费在线观看| 日韩A片免费观看| 麻豆乱伦| 成人午夜在线| 亚洲日韩在线视频播放| 久久久999| 色五月婷婷小说| 国产无遮挡又黄又爽又色学生软件 | 免费av毛片| 爱爱视频免费看| av网站在线免费观看| 国产成人综合亚洲| 91无码精品| 久久国产99| 欧美系列在线| 大香蕉电影网| 日韩在线视频免费| 亚洲综合视频网| 翔田千里被躁120分钟| 成人久久精品| 男人天堂视频网站| 无码乱伦AV| 国产一页| 一级成人毛片| 婷婷五月六月| 97国产精品| 亚洲日韩中字| 成人A∨| 欧美aaaaaa| 天天射日日干| 亚洲一级免费视频| 99久久大香蕉| 一区二区三区精品婷婷| 亚洲中文字幕免费| 特级西西444WWW无码视频兔费看 | 日韩成人精品| 99热都是精品| www.日韩一区| 91传媒在线免费观看| 操逼逼网| 大肉大捧一出免费观看| 国产精品久久久久久久牛牛| 怡春院熟女精品AV| 狠狠干在线视频| 天堂网在线观看| 亚洲精品福利视频导航| 国产探花视频在线免费观看| 国产三级电影在线观看| 7799综合| 综合黄色| 蜜桃秘一二三区最新| 毛片在线观看网站| 久久婷五月天| 国产精品伊人| 丝袜美女足交| 黄色在线免费| www.婷婷六月天| 午夜爱爱爱| 一级免费a片| 狠狠操在线视频| 国产精品国产精品| 国产av中文| 色图插插插| 乱伦视频网| 久久精品国产99精品国产亚洲性色| 麻豆精品无码| 亚洲网站在线免费观看| 丁香六月婷婷| 久久久久久免费视频| 亚洲精品suv视频| 色999亚洲人成色| 久久精品水多多www| 亚洲黄色电影网站| 女人18片毛片60分钟黃菲菲 | 摸BBB搡BBB搡BBBB| 97超碰网| 亚洲视频日韩在线观看| 欧美精品综合| 色婷婷在线观看视频| 无码视频在线免费播放| 婷婷精品秘进入| 欧美人操逼一二区| 色哟哟av| 怡红院综合网| 俺也来www俺也色com| 拍拍拍免费视频| 欧美午夜精品久久久| 爱爱91| 九九操逼| 高清无码专区| 少妇人妻一区二区三区| 国产无遮挡又黄又爽在线观看| 伊人网综合| 国产理论电影在线观看| 一道本无码在线观看| 五月天综合在线| 无码精品人妻一区二区欧美| 国产av高清| 国产人成一区二区三区影院| 亚洲精品久久久久久久久豆丁网| 国产在线播放91| 国产又粗又大又爽| A级黄色网| AA片在线观看视频在线播放| 婷婷狠狠| 999一区二区三区| 爱草在线| 欧美成人日韩| 3D精品啪啪一区二区免费| 另类av| 久久人妻中文字幕| 91视频内射| AV网站在线免费观看| 少妇中文字幕| 亚洲秘无码一区二区| 亚洲成人免费福利| 操逼小电影| 亚洲天堂免费| 思思操| 黄色A片电影| 伊人青青操| 人人舔人人爱| 国产久久精品视频| 木下凛凛子AV888AV在线观看 | 鸡巴网站| 草逼网址| 亚洲综合在线网| 亚洲精品女人久久久| 黄色一级片免费| 99天天视频| 亚洲中文字幕播放| 插丰满少妇在线观看| 秋霞午夜福利| 亲子乱AⅤ一区二区三区| 在线免费毛片| 码人妻免费视频| 久艹综合| 亚洲高清无码视频在线播放| 伊人综合干| 欧洲毛片基地c区| 91乱子伦国产乱子伦无码| 午夜熟睡乱子伦视频| 91亚洲国产成人精品一区 | 欧美一区二区在线观看| 久久伊人影院| 免费黄色视频观看| 男人在线天堂| 青娱乐91视频| 国产女人18毛片水真多成人如厕 | 午夜福利电影网| 国产视频无码在线| 99天天视频| 欧美成人一级a片| 在线成人亚洲| 91麻豆大奶巨乳一区白虎| 国产成人在线播放| 无码h| 免费AV大全| 爱爱无码视频| 日韩免费看| 十八毛片| 亚洲精选一区二区三区| 国产精品毛片视频| 亚洲午夜成人精品一区二区| 欧美久久性爱视频| 亚洲欧美视频| 四川揉BBB搡BBB| 丁香五月亭亭| 草逼美女| 日韩欧美不卡色不卡| 久久国产V一级毛多内射| 欧美色图第一页| www.偷拍| 欧美中文字幕在线视频| 久久噜噜噜精品国产亚洲综合| A片在线观看免费| 草草国产| 国产成人黄色| 中文字幕在线播放视频| 波多野结衣一二三区| 福利一区在线观看| 日本免费版网站nba| 黄色三级片视频| 影音先锋91视频| 亚洲精品成人无码熟妇在线 | 我爱大香蕉| 国产aaaaaa| 91极品视觉盛宴| 免费一级网站| 无码人妻AⅤ一区二区三区| 伊大香蕉在线| 婷婷五月亚洲精品AAA片在| 日本操屄视频| 99久久人妻精品免费二区| 久久国产精品在线| 日本高清中文字幕| 俺来俺去www色婷婷| 一本一道vs波多野结衣| www.国产豆花精品区| 欧美日韩中国操逼打炮| 伊人青草视频9| 亚洲欧美大香蕉视频网| 精品九九九| 伊人大香蕉视频| 神马午夜福利| 精品人妻一区二区三区在| 国产精品自拍视频| 三级视频在线播放| 日韩欧美一级片| 亚洲成人免费视频| 久久高清免费视频| 黄色视频网站在线观看| 操逼精品| 欧美精产国品一二三产品动漫| 日韩18禁| 蜜桃视频在线观看18| 波多野结衣久久| 成人国产精品秘在线看| 大鸡巴午夜爽视频电影| 国产无套在线观看| 黄色影视不卡| 欧美美女日逼视频| 四虎色情| 久久婷婷影院| 久久精品视频播放| 成人网站视频| 影音先锋av网| 色婷婷狠狠操| 欧美被操| 久草视频在线免费看| 亚洲无码视频在线免费观看| 国产女人高潮毛片| 大香蕉在线网站| 北京熟妇搡BBBB搡BBBB| 2026国产精品视频| 人人操比| 日韩成人一区二区| 亚洲电影中文字幕| 18国产免费视频在线观看| 国产精品黄色电影| 狠狠狠狠狠狠| 免费a片在线观看| 亚洲AV成人片无码网站| 日韩理论片| 日本伊人在线综合视频| 日本最新免费二区| 欧美偷拍一区二区| 午夜操B| 欧美激情一区二区A片成人牛牛| 狠狠狠狠狠狠狠狠狠狠| 在线视频福利导航| 国产精品视频在线免费观看| 日韩中文无码字幕| 成年人在线观看视频网站| 日本A片在线播放| 黄色片一级| 欧美性猛交XXXX乱大交3| 无码高清一区二区| 国产黄网| 撸一撸成人在线做爱视频。| 亚洲有码人妻| 大香蕉88| 狠狠做深爱婷婷久久综合一区| 久久青草免费视频| 91人妻日韩人妻无码| 久久艹久久| 久久久久久毛片| 色婷婷Av| 91在线精品一区二区| 欧美精品久久久久久久久老牛影院 | 久久国产精品一区二区三区| 亚洲涩情91日韩一区二区| 人人操人人草| 蜜桃Av噜噜一区二区| 免费黄色在线视频| 操逼视频在线观看| 九九中文字幕| 亚洲色成人网站www永久四虎| 免费爱爱网站| 色哟哟一中文字慕| 囯产精品久久久久久久久免费无码 | 日韩欧美操逼视频| 午夜成人小电影| 日韩视频免费| 国产欧美一区二区精品性色超碰| 久久中文字幕综合| 三级高清无码视频| 少妇人妻在线| 日日搔AV一区二区三区| 91丝袜一区二区三区| 岛国无码破解AV在线播放| 大荫蒂HD大荫蒂视频| 激情五月天网站| 国产97热人人| 欧美肏屄网| 五月激情久久| 欧美人成人无码| 成人亚洲AV| 亚洲AV无码成人精品区| 99视频内射三四| 操逼的视频| 国产综合亚洲精品一区二| 九九re精品视频在线观看| AV天堂资源| 中文字幕av第一页| 欧美l∨视| 国产一区无码| 丰臀肥逼高清视频电影播放| 在线观看亚州| 国产精品国产三级国产| BBB搡BBB搡BBB搡BBB| 国产精品欧美一区二区三区苍井空 | 红桃视频无码| 国产一级AV国产免费| 在线中文字幕视频| 操逼无码| 嫩草99| 久久久久亚洲AV无码专区| 人人干天天操| 国产靠逼视频| 日韩av电影在线观看| 成人国产精品秘在线看| 伊人婷婷久久| 久草视频在线免费看| 日韩高清无码三级片| 亚洲国产成人综合| 日本免费爱爱视频| 欧美日综合| 爱爱日韩| 国产精品无码中文在线| 亚洲乱| 玖玖资源在线| 六月婷婷深爱| 黄色av网| 人操人妻| 毛片毛片毛片毛片毛片毛片| 国产黄色A片| av大片免费看| 囯产精品久久| 日日摸夜夜| 成人a片在线观看| 影音先锋男人站| 怍爱视频| AV天堂偷拍亂伦| 欧美性爱导航| 91中文字幕+乱码| 操逼日韩| 亚洲中文视频免费| 国产午夜精品一区二区三区嫩A| 日韩黄色免费电影| 九九热热| 91探花足浴店按摩店| 大逼影院| 国产精品高潮呻吟| 五月深爱| 99热这里只有精品9| 亚洲wwwwww| 婷婷色视频| 麻豆三级片在线观看| 三级网站免费| 日韩黄色电影在线免费观看| 久草高清视频| 国产经典午夜福利视频合集| 老司机无码视频| 中文字幕精品在线免费视频观看视频| 久久亚洲热| 好吊顶亚洲AV大香蕉色色| 激情国产av| 日韩18禁| 国产黄色视频在线播放| 午夜福利100理论片| 五月天久久婷婷| 黑人一级片| 草碰在线视频| 婷婷五月天影视| 日韩午夜AV| 激情无码视频| 2018天天操天天干| 国产亲子乱XXXXimim/| 成人视频免费| 色婷婷av| 欧美色图色就是色| 亚洲在线一区| 欧美综合激情| 欧美欧美欧美| 有码视频在线观看| 久久XX| 日本一级a片| 正在播放无码| 在线免费观看黄色视频网站| 18国产免费视频在线观看| 99色色| 少妇搡BBBB搡BBB搡18禁| 成人免费激情视频| 日韩无码激情| 韩国午夜福利视频| 国产一级a毛一级a毛观看视频网站www.jn| 视频在线观看一区| 日韩欧美不卡| 国产熟妇搡BBBB搡BBBB搡| 午夜亚洲福利| 大鸡巴久久| 91日日| 99久久国产热无码精品免费| 亚洲第1页| 亚洲无码三级片| AV在线资源观看| 在线无码不卡| 欧美精产国品一二三区| 男人操女人视频网站| 亚洲免费毛片| 搡BBBB搡BBB搡五十| 婷婷欧美色图| 亚洲插菊花综合网| 欧美成人大香蕉| 欧美日综合| 日韩欧美一区二区在线观看 | 二区| 国产精品三级在线观看| 日本三级片视频不卡| 亚洲一区二区免费视频| 丰满人妻一区二区三区精品高 | 东京热视频网站| 91视频首页| 婷婷深爱五月| 插进去综合网| 成人黄网站在线观看| 欧美中文字幕在线播放| 婷婷天堂| 韩国无码成人电影啊荒| 高清无码黄| 69精品视频| 日韩精品一区二区三区在线观看免费 | 日韩精品三级| 青青操在线视频| 久久精品婷婷| 九色PORNY蝌蚪视频| 逼特逼| 日韩在线女优天天干| A级片在线观看| 国产毛片一照区| 99免费在线视频| 九九视频在线观看| 日本黄色的视频| 亚洲午夜精品成人毛片| 成人一级视频| 国产一级A片在线观看| 成人久久久久一级大黄毛片中国| 91人妻无码一区二区三区| 日韩AV免费在线播放| 嫩苞又嫩又紧AV无码| 自拍偷拍第一页| 大地资源第5页在线| 欧美精品人妻| 一本到在线观看午夜剧场| 国产小精品| 国产中文字幕在线视频| 亚洲一级av无码毛片精品| 久久久青草| 毛片国产| 国产福利在线导航| 俺来也俺也啪WWW色| 国产激倩都市一区二区三区欧美| www,色婷婷| 操逼视频免费在线观看| 婷婷五月18永久免费视频| 成人片免费| 五月天激情网站| 亚洲色图88| 人妻一区| 日日夜夜爱| 午夜69成人做爱视频网站| 偷拍99| 精品1区2区| 骚逼综合| 国产成人三级在线| 国产一区二区三区在线观看免费视频免费视频免费视频 | 一级在线| 女同一区二区三区| 日本久久视频| 国产操逼片| 嫩BBB槡BBBB槡BBBB免费视频| 国产成人小视频| 亚洲AV无码精品岛国| 日本特黄AA片免费视频| 国产中文字幕亚洲综合欧美|