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

Spring創(chuàng)建Bean的全過程Debug,沒人能說的這么通透了

共 34234字,需瀏覽 69分鐘

 ·

2020-11-21 10:27

作者:x1aoda1

https://www.cnblogs.com/darope/p/13917264.html

1.1 Spring測試環(huán)境搭建

Spring模塊概覽,綠色是模塊,Spring中八大模塊,黑色表示該模塊包含的jar包(組件)。例如我們想要用IOC容器,也就是綠色的CoreContainer,我們需要導(dǎo)入Beans,Core,Context,SpEL(spring-expression)四個包。

Spring模塊概覽
  • Test:測試相關(guān)
  • Core Container:IOC容器
  • AOP:面向切面編程
  • Aspects:切面
  • Instrumenttation:跟JDK關(guān)聯(lián),一般不用
  • Messaging:消息服務(wù),一般不用
  • Data Access/Integration:數(shù)據(jù)訪問與集成(JDBC訪問,Transaction事務(wù),ORM對象關(guān)系映射,OXM和XML映射一般不用,JMS為Java消息服務(wù)Java-message-service一般不用)
  • Web:Web服務(wù)(WebSocket網(wǎng)絡(luò)通信協(xié)議,Servlet, Web,Portlet一般不用)

最偷懶的方式,是直接導(dǎo)入Spring-Framework。但是可能導(dǎo)入不必要的包,導(dǎo)致項目打包后比較大

由于Spring-Content中的ApplicationContent是整個IOC的入口。我們導(dǎo)入Spring-context包即可



????org.springframework
????spring-context
????5.2.3.RELEASE

我們導(dǎo)入spring-content后,默認會導(dǎo)入該組件的依賴jar,spring-content底層的依賴可以看到,實際上我們是導(dǎo)入了Core Container模塊:

??
????
??????org.springframework
??????spring-aop
??????5.2.3.RELEASE
??????compile
????

????
??????org.springframework
??????spring-beans
??????5.2.3.RELEASE
??????compile
????

????
??????org.springframework
??????spring-core
??????5.2.3.RELEASE
??????compile
????

????
??????org.springframework
??????spring-expression
??????5.2.3.RELEASE
??????compile
????

??

新建Spring配置文件spring.xml:


<beans?xmlns="http://www.springframework.org/schema/beans"
???????xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
???????xsi:schemaLocation="http://www.springframework.org/schema/beans?http://www.springframework.org/schema/beans/spring-beans.xsd">


????
????
????<bean?id="hello"?class="com.xiaodai.service.Hello">
????????
????????<property?name="id"?value="1">property>
????????<property?name="name"?value="zhangsan">property>
????????<property?name="age"?value="18">property>
????bean>
beans>

編寫測試類:

import?com.xiaodai.service.Hello;
import?org.springframework.context.ApplicationContext;
import?org.springframework.context.support.ClassPathXmlApplicationContext;

public?class?Test?{

????public?static?void?main(String[]?args)?{
????????ApplicationContext?applicationContext?=?new?ClassPathXmlApplicationContext("spring.xml");
????????Hello?hello?=?applicationContext.getBean("hello",?Hello.class);
????????System.out.println(hello.getName());

????}

}

1.2 Debug容器創(chuàng)建過程

從測試類的new ClassPathXmlApplicationContext("spring.xml")開始debug,進入ClassPathXmlApplicationContext,可以看到:

?public?ClassPathXmlApplicationContext(
???String[]?configLocations,?boolean?refresh,?@Nullable?ApplicationContext?parent)

???throws?BeansException?
{

??super(parent);
??//?設(shè)置配置文件路徑
??setConfigLocations(configLocations);
??if?(refresh)?{
??????????//?核心步驟
???refresh();
??}
?}

加載配置文件后,進入refresh()方法,該方法是容器初始化的核心步驟。該方法包含十三個方法:

????????@Override
?public?void?refresh()?throws?BeansException,?IllegalStateException?{
??synchronized?(this.startupShutdownMonitor)?{
???//?Prepare?this?context?for?refreshing.
???/**?
????*?準(zhǔn)備刷新,做一些最基本的準(zhǔn)備化工作
???**/

???prepareRefresh();

???//?Tell?the?subclass?to?refresh?the?internal?bean?factory.
???/**?
????*?獲得一個刷新的bean容器,實質(zhì)就是獲取工廠。
????*?加載xml等配置文件,用該文件產(chǎn)生的BeanDefinition來創(chuàng)建一個工廠
???**/

???ConfigurableListableBeanFactory?beanFactory?=?obtainFreshBeanFactory();

???//?Prepare?the?bean?factory?for?use?in?this?context.
???/**
????*?準(zhǔn)備bean工廠
???**/

???prepareBeanFactory(beanFactory);

???try?{
????//?Allows?post-processing?of?the?bean?factory?in?context?subclasses.
????//?后置增強,方便擴展
????postProcessBeanFactory(beanFactory);

????//?Invoke?factory?processors?registered?as?beans?in?the?context.
????//?實例化并且執(zhí)行BeanFactoryPostProcessors
????invokeBeanFactoryPostProcessors(beanFactory);

????//?Register?bean?processors?that?intercept?bean?creation.
????//?實例化并且注冊所有的BeanPostProcessor
????registerBeanPostProcessors(beanFactory);

????//?Initialize?message?source?for?this?context.
????//?國際化設(shè)置,一般用不到
????initMessageSource();

????//?Initialize?event?multicaster?for?this?context.
????//?初始化應(yīng)用程序的多波器和廣播器
????initApplicationEventMulticaster();

????//?Initialize?other?special?beans?in?specific?context?subclasses.
????//?空方法,預(yù)留給子類做擴展
????onRefresh();

????//?Check?for?listener?beans?and?register?them.
????//?注冊監(jiān)聽器
????registerListeners();

????//?Instantiate?all?remaining?(non-lazy-init)?singletons.
????//?工作中常用,面試常問。實例化所有非懶加載的實例對象
????finishBeanFactoryInitialization(beanFactory);

????//?Last?step:?publish?corresponding?event.
????//?完成刷新
????finishRefresh();
???}

???catch?(BeansException?ex)?{
????if?(logger.isWarnEnabled())?{
?????logger.warn("Exception?encountered?during?context?initialization?-?"?+
???????"cancelling?refresh?attempt:?"?+?ex);
????}

????//?Destroy?already?created?singletons?to?avoid?dangling?resources.
????destroyBeans();

????//?Reset?'active'?flag.
????cancelRefresh(ex);

????//?Propagate?exception?to?caller.
????throw?ex;
???}

???finally?{
????//?Reset?common?introspection?caches?in?Spring's?core,?since?we
????//?might?not?ever?need?metadata?for?singleton?beans?anymore...
????resetCommonCaches();
???}
??}
?}

1.3 AbstractApplicationContext的refresh()包含的13個方法分析

結(jié)合概覽圖一個一個方法分析:

Bean工廠實例化Bean概覽圖

方法1:prepareRefresh() => 準(zhǔn)備工作

準(zhǔn)備刷新,做一些最基本的準(zhǔn)備化工作

?protected?void?prepareRefresh()?{
??//?Switch?to?active.
??//?設(shè)置開始時間
??this.startupDate?=?System.currentTimeMillis();
??//?關(guān)閉狀態(tài)設(shè)置為false
??this.closed.set(false);
??//?活躍狀態(tài)設(shè)置為true
??this.active.set(true);

????????//?打印日志
??if?(logger.isDebugEnabled())?{
???if?(logger.isTraceEnabled())?{
????logger.trace("Refreshing?"?+?this);
???}
???else?{
????logger.debug("Refreshing?"?+?getDisplayName());
???}
??}

??//?Initialize?any?placeholder?property?sources?in?the?context?environment.
??//?初始化屬性資源
??initPropertySources();

??//?Validate?that?all?properties?marked?as?required?are?resolvable:
??//?see?ConfigurablePropertyResolver#setRequiredProperties
??//?獲取環(huán)境信息,驗證屬性信息
??getEnvironment().validateRequiredProperties();

??//?Store?pre-refresh
??//?存儲預(yù)刷新的一些應(yīng)用信息的監(jiān)聽器
??ApplicationListeners...
??if?(this.earlyApplicationListeners?==?null)?{
???this.earlyApplicationListeners?=?new?LinkedHashSet<>(this.applicationListeners);
??}
??else?{
???//?Reset?local?application?listeners?to?pre-refresh?state.
???this.applicationListeners.clear();
???this.applicationListeners.addAll(this.earlyApplicationListeners);
??}

??//?Allow?for?the?collection?of?early?ApplicationEvents,
??//?to?be?published?once?the?multicaster?is?available...
??//?創(chuàng)建一些監(jiān)聽器事件的集合
??this.earlyApplicationEvents?=?new?LinkedHashSet<>();
?}

總結(jié):1.設(shè)置啟動事件 2.設(shè)置關(guān)閉活躍的狀態(tài) 3.獲取環(huán)境對象并設(shè)置屬性值 4.設(shè)置監(jiān)聽器以及需要發(fā)布事件的集合

重要的點:

  • 獲取環(huán)境信息,驗證屬性信息,getEnvironment().validateRequiredProperties();
  • 存儲預(yù)刷新的一些應(yīng)用信息的監(jiān)聽器,在Spring中是空實現(xiàn),但是SpringBoot中,是有具體的值的

方法2:obtainFreshBeanFactory() => 獲得一個刷新的bean容器

獲得一個刷新的bean容器,實質(zhì)就是獲取工廠。創(chuàng)建容器對象DefaultListableBeanFactory;加載xml配置文件的屬性到當(dāng)前的工廠中,最重要的就是BeanDefinition

Bean工廠實例繼承關(guān)系圖

AbstractRefreshableApplicationContext:

????//?只要進到這個方法,那么我們創(chuàng)建的一定是一個新的工廠
?@Override
?protected?final?void?refreshBeanFactory()?throws?BeansException?{
??if?(hasBeanFactory())?{
??????//?如果存在先銷毀,后關(guān)閉
???destroyBeans();
???closeBeanFactory();
??}
??try?{
??????//?創(chuàng)建bean工廠,這里使用的就是DefaultListableBeanFactory。此時創(chuàng)建的工廠里面的屬性值都是默認值
???DefaultListableBeanFactory?beanFactory?=?createBeanFactory();
???//?序列化id
???beanFactory.setSerializationId(getId());
???//?設(shè)置一些屬性值
???customizeBeanFactory(beanFactory);
???//?加載bean的定義屬性值。該方法有很多重載,非常復(fù)雜,核心是do操作
???//?完成配置文件或者配置類文件的加載
???loadBeanDefinitions(beanFactory);
???synchronized?(this.beanFactoryMonitor)?{
????this.beanFactory?=?beanFactory;
???}
??}
??catch?(IOException?ex)?{
???throw?new?ApplicationContextException("I/O?error?parsing?bean?definition?source?for?"?+?getDisplayName(),?ex);
??}
?}

方法3:prepareBeanFactory(beanFactory) => 準(zhǔn)備(初始化)Bean工廠

為方法2拿到的工廠,設(shè)置某些具體的值

?protected?void?prepareBeanFactory(ConfigurableListableBeanFactory?beanFactory)?{
??//?Tell?the?internal?bean?factory?to?use?the?context's?class?loader?etc.
??//?為bean工廠設(shè)置類加載器
??beanFactory.setBeanClassLoader(getClassLoader());
??//?設(shè)置SPEL解析器
??beanFactory.setBeanExpressionResolver(new?StandardBeanExpressionResolver(beanFactory.getBeanClassLoader()));
??beanFactory.addPropertyEditorRegistrar(new?ResourceEditorRegistrar(this,?getEnvironment()));

??//?Configure?the?bean?factory?with?context?callbacks.
??//?添加一個BeanPostProcessor
??beanFactory.addBeanPostProcessor(new?ApplicationContextAwareProcessor(this));
??//?忽略對應(yīng)接口的實現(xiàn)
??beanFactory.ignoreDependencyInterface(EnvironmentAware.class);
??beanFactory.ignoreDependencyInterface(EmbeddedValueResolverAware.class);
??beanFactory.ignoreDependencyInterface(ResourceLoaderAware.class);
??beanFactory.ignoreDependencyInterface(ApplicationEventPublisherAware.class);
??beanFactory.ignoreDependencyInterface(MessageSourceAware.class);
??beanFactory.ignoreDependencyInterface(ApplicationContextAware.class);

??//?BeanFactory?interface?not?registered?as?resolvable?type?in?a?plain?factory.
??//?MessageSource?registered?(and?found?for?autowiring)?as?a?bean.
????????//?注冊一些依賴
??beanFactory.registerResolvableDependency(BeanFactory.class,?beanFactory);
??beanFactory.registerResolvableDependency(ResourceLoader.class,?this);
??beanFactory.registerResolvableDependency(ApplicationEventPublisher.class,?this);
??beanFactory.registerResolvableDependency(ApplicationContext.class,?this);

??//?Register?early?post-processor?for?detecting?inner?beans?as
??//?ApplicationListeners添加一個BeanPostProcessor增強器
??ApplicationListeners.
??beanFactory.addBeanPostProcessor(new?ApplicationListenerDetector(this));

??//?Detect?a?LoadTimeWeaver?and?prepare?for?weaving,?if?found.
??if?(beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME))?{
???beanFactory.addBeanPostProcessor(new?LoadTimeWeaverAwareProcessor(beanFactory));
???//?Set?a?temporary?ClassLoader?for?type?matching.
???beanFactory.setTempClassLoader(new?ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader()));
??}

??//?Register?default?environment?beans.
??if?(!beanFactory.containsLocalBean(ENVIRONMENT_BEAN_NAME))?{
???beanFactory.registerSingleton(ENVIRONMENT_BEAN_NAME,?getEnvironment());
??}
??if?(!beanFactory.containsLocalBean(SYSTEM_PROPERTIES_BEAN_NAME))?{
???beanFactory.registerSingleton(SYSTEM_PROPERTIES_BEAN_NAME,?getEnvironment().getSystemProperties());
??}
??if?(!beanFactory.containsLocalBean(SYSTEM_ENVIRONMENT_BEAN_NAME))?{
???beanFactory.registerSingleton(SYSTEM_ENVIRONMENT_BEAN_NAME,?getEnvironment().getSystemEnvironment());
??}
?}

方法4:postProcessBeanFactory(beanFactory) => 后置增強Bean(擴展實現(xiàn))

空方法,方便擴展

方法5:invokeBeanFactoryPostProcessors(beanFactory) => 執(zhí)行BFPP

實例化并且執(zhí)行BeanFactoryPostProcessors

?/**
??*?Instantiate?and?invoke?all?registered?BeanFactoryPostProcessor?beans,
??*?respecting?explicit?order?if?given.
??*?

Must?be?called?before?singleton?instantiation.
??*?單例對象之前一定調(diào)用,因為單例bean創(chuàng)建后就只有一份
??*/
?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()));
??}
?}

方法6:registerBeanPostProcessors(beanFactory) => 注冊BPP

實例化并且注冊所有的BeanPostProcessor。實例化Bean之前的準(zhǔn)備工作

?/**
??*?Instantiate?and?register?all?BeanPostProcessor?beans,
??*?respecting?explicit?order?if?given.
??*?

Must?be?called?before?any?instantiation?of?application?beans.
??*/
?protected?void?registerBeanPostProcessors(ConfigurableListableBeanFactory?beanFactory)?{
??PostProcessorRegistrationDelegate.registerBeanPostProcessors(beanFactory,?this);
?}

方法7:initMessageSource() => 國際化設(shè)置

方法8:initApplicationEventMulticaster() => 初始化應(yīng)用程序的多波器和廣播器

也屬于準(zhǔn)備工作

方法9:onRefresh() => 預(yù)留給子類做擴展

空方法

方法10:registerListeners() => 注冊監(jiān)聽器

也屬于準(zhǔn)備工作

?/**
??*?Add?beans?that?implement?ApplicationListener?as?listeners.
??*?Doesn't?affect?other?listeners,?which?can?be?added?without?being?beans.
??*/
?protected?void?registerListeners()?{
??//?Register?statically?specified?listeners?first.
??for?(ApplicationListener?listener?:?getApplicationListeners())?{
???getApplicationEventMulticaster().addApplicationListener(listener);
??}

??//?Do?not?initialize?FactoryBeans?here:?We?need?to?leave?all?regular?beans
??//?uninitialized?to?let?post-processors?apply?to?them!
??String[]?listenerBeanNames?=?getBeanNamesForType(ApplicationListener.class,?true,?false);
??for?(String?listenerBeanName?:?listenerBeanNames)?{
???getApplicationEventMulticaster().addApplicationListenerBean(listenerBeanName);
??}

??//?Publish?early?application?events?now?that?we?finally?have?a?multicaster...
??Set?earlyEventsToProcess?=?this.earlyApplicationEvents;
??this.earlyApplicationEvents?=?null;
??if?(earlyEventsToProcess?!=?null)?{
???for?(ApplicationEvent?earlyEvent?:?earlyEventsToProcess)?{
????getApplicationEventMulticaster().multicastEvent(earlyEvent);
???}
??}
?}

方法11:finishBeanFactoryInitialization(beanFactory) => 實例化所有單例對象

面試常問,工作常用。過程比較復(fù)雜

?/**
??*?Finish?the?initialization?of?this?context's?bean?factory,
??*?initializing?all?remaining?singleton?beans.
??*/

?protected?void?finishBeanFactoryInitialization(ConfigurableListableBeanFactory?beanFactory)?{
??//?Initialize?conversion?service?for?this?context.
??/**
???*?把類型轉(zhuǎn)化操作,設(shè)置到當(dāng)前的beanFactory里面去
??**/

??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.
??/**
???*?判斷當(dāng)前的beanFactory有沒有內(nèi)置的值處理器
??**/

??if?(!beanFactory.hasEmbeddedValueResolver())?{
???beanFactory.addEmbeddedValueResolver(strVal?->?getEnvironment().resolvePlaceholders(strVal));
??}

??//?Initialize?LoadTimeWeaverAware?beans?early?to?allow?for?registering?their?transformers?early.
??/**
???*?織入Aware
??**/

??String[]?weaverAwareNames?=?beanFactory.getBeanNamesForType(LoadTimeWeaverAware.class,?false,?false);
??for?(String?weaverAwareName?:?weaverAwareNames)?{
???getBean(weaverAwareName);
??}

??//?Stop?using?the?temporary?ClassLoader?for?type?matching.
??//?設(shè)置類加載器
??beanFactory.setTempClassLoader(null);

??//?Allow?for?caching?all?bean?definition?metadata,?not?expecting?further?changes.
??/**
???*?凍結(jié):某些bean不需要進行修改操作了,放入
??**/

??beanFactory.freezeConfiguration();

??//?Instantiate?all?remaining?(non-lazy-init)?singletons.
??/**
???*?實例化所有非懶加載的實例對象(重要)
??**/

??beanFactory.preInstantiateSingletons();
?}

實例化所有非懶加載的實例對象方法:

?@Override
?public?void?preInstantiateSingletons()?throws?BeansException?{
??if?(logger.isTraceEnabled())?{
???logger.trace("Pre-instantiating?singletons?in?"?+?this);
??}

??//?Iterate?over?a?copy?to?allow?for?init?methods?which?in?turn?register?new?bean?definitions.
??//?While?this?may?not?be?part?of?the?regular?factory?bootstrap,?it?does?otherwise?work?fine.
??/**
???*?拿到所有注冊bean的名稱
???**/

??List?beanNames?=?new?ArrayList<>(this.beanDefinitionNames);

??//?Trigger?initialization?of?all?non-lazy?singleton?beans...
??//?循環(huán)去創(chuàng)建我們需要的單例對象
??for?(String?beanName?:?beanNames)?{
??????//?拿到bean的定義信息,就是我們在xml配置文件里面指定的一些屬性
???RootBeanDefinition?bd?=?getMergedLocalBeanDefinition(beanName);
???//?是否是抽象的,是否是單例的,是否是懶加載的
???if?(!bd.isAbstract()?&&?bd.isSingleton()?&&?!bd.isLazyInit())?{
???????//?判斷當(dāng)前類是否實現(xiàn)了factoryBean接口。一般沒實現(xiàn),直接進入下面的getBean
????if?(isFactoryBean(beanName))?{
?????Object?bean?=?getBean(FACTORY_BEAN_PREFIX?+?beanName);
?????if?(bean?instanceof?FactoryBean)?{
??????final?FactoryBean?factory?=?(FactoryBean)?bean;
??????boolean?isEagerInit;
??????if?(System.getSecurityManager()?!=?null?&&?factory?instanceof?SmartFactoryBean)?{
???????isEagerInit?=?AccessController.doPrivileged((PrivilegedAction)
???????????((SmartFactoryBean)?factory)::isEagerInit,
?????????getAccessControlContext());
??????}
??????else?{
???????isEagerInit?=?(factory?instanceof?SmartFactoryBean?&&
?????????((SmartFactoryBean)?factory).isEagerInit());
??????}
??????if?(isEagerInit)?{
???????getBean(beanName);
??????}
?????}
????}
????else?{
????????//?通過beanName。拿到bean
?????getBean(beanName);
????}
???}
??}

??//?Trigger?post-initialization?callback?for?all?applicable?beans...
??for?(String?beanName?:?beanNames)?{
???Object?singletonInstance?=?getSingleton(beanName);
???if?(singletonInstance?instanceof?SmartInitializingSingleton)?{
????final?SmartInitializingSingleton?smartSingleton?=?(SmartInitializingSingleton)?singletonInstance;
????if?(System.getSecurityManager()?!=?null)?{
?????AccessController.doPrivileged((PrivilegedAction)?()?->?{
??????smartSingleton.afterSingletonsInstantiated();
??????return?null;
?????},?getAccessControlContext());
????}
????else?{
?????smartSingleton.afterSingletonsInstantiated();
????}
???}
??}
?}

重要方法:

  • getMergedLocalBeanDefinition
?/**
??*?Return?a?merged?RootBeanDefinition,?traversing?the?parent?bean?definition
??*?if?the?specified?bean?corresponds?to?a?child?bean?definition.
??*?@param?beanName?the?name?of?the?bean?to?retrieve?the?merged?definition?for
??*?@return?a?(potentially?merged)?RootBeanDefinition?for?the?given?bean
??*?@throws?NoSuchBeanDefinitionException?if?there?is?no?bean?with?the?given?name
??*?@throws?BeanDefinitionStoreException?in?case?of?an?invalid?bean?definition
??*/

??//?返回一個合并好的RootBeanDefinition。整合子類和父類
?protected?RootBeanDefinition?getMergedLocalBeanDefinition(String?beanName)?throws?BeansException?{
??//?Quick?check?on?the?concurrent?map?first,?with?minimal?locking.
??RootBeanDefinition?mbd?=?this.mergedBeanDefinitions.get(beanName);
??if?(mbd?!=?null?&&?!mbd.stale)?{
???return?mbd;
??}
??return?getMergedBeanDefinition(beanName,?getBeanDefinition(beanName));
?}
  • getBean() => doGetBean()
?/**
??*?Return?an?instance,?which?may?be?shared?or?independent,?of?the?specified?bean.
??*?@param?name?the?name?of?the?bean?to?retrieve
??*?@param?requiredType?the?required?type?of?the?bean?to?retrieve
??*?@param?args?arguments?to?use?when?creating?a?bean?instance?using?explicit?arguments
??*?(only?applied?when?creating?a?new?instance?as?opposed?to?retrieving?an?existing?one)
??*?@param?typeCheckOnly?whether?the?instance?is?obtained?for?a?type?check,
??*?not?for?actual?use
??*?@return?an?instance?of?the?bean
??*?@throws?BeansException?if?the?bean?could?not?be?created
??*/

?@SuppressWarnings("unchecked")
?protected??T?doGetBean(final?String?name,?@Nullable?final?Class?requiredType,
???@Nullable?final?Object[]?args,?boolean?typeCheckOnly)
?throws?BeansException?
{

????????//?獲取beanName
??final?String?beanName?=?transformedBeanName(name);
??Object?bean;

??//?Eagerly?check?singleton?cache?for?manually?registered?singletons.
??//?單例檢查,如果一級,二級,三級緩存中存在該Bean,直接獲取到了
??Object?sharedInstance?=?getSingleton(beanName);
??if?(sharedInstance?!=?null?&&?args?==?null)?{
???if?(logger.isTraceEnabled())?{
????if?(isSingletonCurrentlyInCreation(beanName))?{
?????logger.trace("Returning?eagerly?cached?instance?of?singleton?bean?'"?+?beanName?+
???????"'?that?is?not?fully?initialized?yet?-?a?consequence?of?a?circular?reference");
????}
????else?{
?????logger.trace("Returning?cached?instance?of?singleton?bean?'"?+?beanName?+?"'");
????}
???}
???bean?=?getObjectForBeanInstance(sharedInstance,?name,?beanName,?null);
??}

??else?{
???//?Fail?if?we're?already?creating?this?bean?instance:
???//?We're?assumably?within?a?circular?reference.
???//?如果是單例對象的話,嘗試解決循環(huán)依賴問題
???if?(isPrototypeCurrentlyInCreation(beanName))?{
????throw?new?BeanCurrentlyInCreationException(beanName);
???}

???//?Check?if?bean?definition?exists?in?this?factory.
???//?獲取父類容器
???BeanFactory?parentBeanFactory?=?getParentBeanFactory();
???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?if?(requiredType?!=?null)?{
?????//?No?args?->?delegate?to?standard?getBean?method.
?????return?parentBeanFactory.getBean(nameToLookup,?requiredType);
????}
????else?{
?????return?(T)?parentBeanFactory.getBean(nameToLookup);
????}
???}

????????????//?標(biāo)志位。如果不是類型檢查,表示要創(chuàng)建bean,此處在集合中做一個記錄
???if?(!typeCheckOnly)?{
????markBeanAsCreated(beanName);
???}

???try?{
???????//?獲取beanDefinition
????final?RootBeanDefinition?mbd?=?getMergedLocalBeanDefinition(beanName);
????//?檢測beanDefinition
????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)?{
????????//?如果有依賴的bean,我們要先遞歸解決其他依賴的bean
?????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.
????//?是否是單例的
????if?(mbd.isSingleton())?{
?????sharedInstance?=?getSingleton(beanName,?()?->?{
??????try?{
???????return?createBean(beanName,?mbd,?args);
??????}
??????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);
????}

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

????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.
??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.isTraceEnabled())?{
?????logger.trace("Failed?to?convert?bean?'"?+?name?+?"'?to?required?type?'"?+
???????ClassUtils.getQualifiedName(requiredType)?+?"'",?ex);
????}
????throw?new?BeanNotOfRequiredTypeException(name,?requiredType,?bean.getClass());
???}
??}
??return?(T)?bean;
?}
  • getSingleton
?/**
??*?Return?the?(raw)?singleton?object?registered?under?the?given?name,
??*?creating?and?registering?a?new?one?if?none?registered?yet.
??*?@param?beanName?the?name?of?the?bean
??*?@param?singletonFactory?the?ObjectFactory?to?lazily?create?the?singleton
??*?with,?if?necessary
??*?@return?the?registered?singleton?object
??*/

?public?Object?getSingleton(String?beanName,?ObjectFactory?singletonFactory)?{
??Assert.notNull(beanName,?"Bean?name?must?not?be?null");
??synchronized?(this.singletonObjects)?{
???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?+?"'");
????}
????beforeSingletonCreation(beanName);
????boolean?newSingleton?=?false;
????boolean?recordSuppressedExceptions?=?(this.suppressedExceptions?==?null);
????if?(recordSuppressedExceptions)?{
?????this.suppressedExceptions?=?new?LinkedHashSet<>();
????}
????try?{
????????//?實際上就是調(diào)用了CreateBean
?????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;
?????}
?????afterSingletonCreation(beanName);
????}
????if?(newSingleton)?{
?????addSingleton(beanName,?singletonObject);
????}
???}
???return?singletonObject;
??}
?}
  • doCreateBean => 通過上方法的singletonObject = singletonFactory.getObject();進入的
?/**
??*?Actually?create?the?specified?bean.?Pre-creation?processing?has?already?happened
??*?at?this?point,?e.g.?checking?{@code?postProcessBeforeInstantiation}?callbacks.
??*?

Differentiates?between?default?bean?instantiation,?use?of?a
??*?factory?method,?and?autowiring?a?constructor.
??*?@param?beanName?the?name?of?the?bean
??*?@param?mbd?the?merged?bean?definition?for?the?bean
??*?@param?args?explicit?arguments?to?use?for?constructor?or?factory?method?invocation
??*?@return?a?new?instance?of?the?bean
??*?@throws?BeanCreationException?if?the?bean?could?not?be?created
??*?@see?#instantiateBean
??*?@see?#instantiateUsingFactoryMethod
??*?@see?#autowireConstructor
??*/
?protected?Object?doCreateBean(final?String?beanName,?final?RootBeanDefinition?mbd,?final?@Nullable?Object[]?args)
???throws?BeanCreationException?
{

??//?Instantiate?the?bean.
??BeanWrapper?instanceWrapper?=?null;
??if?(mbd.isSingleton())?{
???instanceWrapper?=?this.factoryBeanInstanceCache.remove(beanName);
??}
??if?(instanceWrapper?==?null)?{
??????/**
???????*?核心的創(chuàng)建實例化Bean的過程
??????**/

???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?{
?????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.
??boolean?earlySingletonExposure?=?(mbd.isSingleton()?&&?this.allowCircularReferences?&&
????isSingletonCurrentlyInCreation(beanName));
????
??/**
???*?解決循環(huán)依賴。使用三級緩存
??**/

??if?(earlySingletonExposure)?{
???if?(logger.isTraceEnabled())?{
????logger.trace("Eagerly?caching?bean?'"?+?beanName?+
??????"'?to?allow?for?resolving?potential?circular?references");
???}
???addSingletonFactory(beanName,?()?->?getEarlyBeanReference(beanName,?mbd,?bean));
??}

??//?Initialize?the?bean?instance.
??Object?exposedObject?=?bean;
??try?{
??????/**
???????*?填充屬性,上文的實例化只是默認屬性值。填充屬性是初始化的第一步,第二步是執(zhí)行init方法
??????**/

???populateBean(beanName,?mbd,?instanceWrapper);
???/**
????*?執(zhí)行init方法
???**/

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

??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?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?{
??????/**
???????*?需要銷毀的時候,銷毀的鉤子函數(shù)
??????**/

???registerDisposableBeanIfNecessary(beanName,?bean,?mbd);
??}
??catch?(BeanDefinitionValidationException?ex)?{
???throw?new?BeanCreationException(
?????mbd.getResourceDescription(),?beanName,?"Invalid?destruction?signature",?ex);
??}

??return?exposedObject;
?}

面試題:為甚么循環(huán)依賴的解決要使用三級緩存?

  • createBeanInstance => 核心的創(chuàng)建和實例化bean的過程,由doCreateBean調(diào)用

大量的反射出現(xiàn)在該方法中,用來創(chuàng)建對象

?/**
??*?Create?a?new?instance?for?the?specified?bean,?using?an?appropriate?instantiation?strategy:
??*?factory?method,?constructor?autowiring,?or?simple?instantiation.
??*?@param?beanName?the?name?of?the?bean
??*?@param?mbd?the?bean?definition?for?the?bean
??*?@param?args?explicit?arguments?to?use?for?constructor?or?factory?method?invocation
??*?@return?a?BeanWrapper?for?the?new?instance
??*?@see?#obtainFromSupplier
??*?@see?#instantiateUsingFactoryMethod
??*?@see?#autowireConstructor
??*?@see?#instantiateBean
??*/

?protected?BeanWrapper?createBeanInstance(String?beanName,?RootBeanDefinition?mbd,?@Nullable?Object[]?args)?{
??//?Make?sure?bean?class?is?actually?resolved?at?this?point.
??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());
??}

??Supplier?instanceSupplier?=?mbd.getInstanceSupplier();
??if?(instanceSupplier?!=?null)?{
???return?obtainFromSupplier(instanceSupplier,?beanName);
??}

??if?(mbd.getFactoryMethodName()?!=?null)?{
???return?instantiateUsingFactoryMethod(beanName,?mbd,?args);
??}

??//?Shortcut?when?re-creating?the?same?bean...
??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);
???}
??}

??//?Candidate?constructors?for?autowiring?
??//?構(gòu)造器
??Constructor[]?ctors?=?determineConstructorsFromBeanPostProcessors(beanClass,?beanName);
??if?(ctors?!=?null?||?mbd.getResolvedAutowireMode()?==?AUTOWIRE_CONSTRUCTOR?||
????mbd.hasConstructorArgumentValues()?||?!ObjectUtils.isEmpty(args))?{
???return?autowireConstructor(beanName,?mbd,?ctors,?args);
??}

??//?Preferred?constructors?for?default?construction?
??ctors?=?mbd.getPreferredConstructors();
??if?(ctors?!=?null)?{
???return?autowireConstructor(beanName,?mbd,?ctors,?null);
??}

??//?No?special?handling:?simply?use?no-arg?constructor.
??/**
???*?默認無參構(gòu)造
???**/

??return?instantiateBean(beanName,?mbd);
?}
  • instantiateBean(beanName, mbd) => 默認無參構(gòu)造
?/**
??*?Instantiate?the?given?bean?using?its?default?constructor.
??*?@param?beanName?the?name?of?the?bean
??*?@param?mbd?the?bean?definition?for?the?bean
??*?@return?a?BeanWrapper?for?the?new?instance
??*/

?protected?BeanWrapper?instantiateBean(final?String?beanName,?final?RootBeanDefinition?mbd)?{
??try?{
???Object?beanInstance;
???final?BeanFactory?parent?=?this;
???if?(System.getSecurityManager()?!=?null)?{
????beanInstance?=?AccessController.doPrivileged((PrivilegedAction)?()?->
????????????//?實例化只會分配內(nèi)存空間,設(shè)置默認值
??????getInstantiationStrategy().instantiate(mbd,?beanName,?parent),
??????getAccessControlContext());
???}
???else?{
????beanInstance?=?getInstantiationStrategy().instantiate(mbd,?beanName,?parent);
???}
???BeanWrapper?bw?=?new?BeanWrapperImpl(beanInstance);
???initBeanWrapper(bw);
???return?bw;
??}
??catch?(Throwable?ex)?{
???throw?new?BeanCreationException(
?????mbd.getResourceDescription(),?beanName,?"Instantiation?of?bean?failed",?ex);
??}
?}
  • instantiate
?@Override
?public?Object?instantiate(RootBeanDefinition?bd,?@Nullable?String?beanName,?BeanFactory?owner)?{
??//?Don't?override?the?class?with?CGLIB?if?no?overrides.
??if?(!bd.hasMethodOverrides())?{
???Constructor?constructorToUse;
???synchronized?(bd.constructorArgumentLock)?{
????constructorToUse?=?(Constructor)?bd.resolvedConstructorOrFactoryMethod;
????if?(constructorToUse?==?null)?{
?????final?Class?clazz?=?bd.getBeanClass();
?????if?(clazz.isInterface())?{
??????throw?new?BeanInstantiationException(clazz,?"Specified?class?is?an?interface");
?????}
?????try?{
??????if?(System.getSecurityManager()?!=?null)?{
???????constructorToUse?=?AccessController.doPrivileged(
?????????(PrivilegedExceptionAction>)?clazz::getDeclaredConstructor);
??????}
??????else?{
???????constructorToUse?=?clazz.getDeclaredConstructor();
??????}
??????bd.resolvedConstructorOrFactoryMethod?=?constructorToUse;
?????}
?????catch?(Throwable?ex)?{
??????throw?new?BeanInstantiationException(clazz,?"No?default?constructor?found",?ex);
?????}
????}
???}
???return?BeanUtils.instantiateClass(constructorToUse);
??}
??else?{
???//?Must?generate?CGLIB?subclass.
???return?instantiateWithMethodInjection(bd,?beanName,?owner);
??}
?}
  • BeanUtils.instantiateClass => 通過構(gòu)造器反射創(chuàng)建bean
?/**
??*?Convenience?method?to?instantiate?a?class?using?the?given?constructor.
??*?

Note?that?this?method?tries?to?set?the?constructor?accessible?if?given?a
??*?non-accessible?(that?is,?non-public)?constructor,?and?supports?Kotlin?classes
??*?with?optional?parameters?and?default?values.
??*?@param?ctor?the?constructor?to?instantiate
??*?@param?args?the?constructor?arguments?to?apply?(use?{@code?null}?for?an?unspecified
??*?parameter,?Kotlin?optional?parameters?and?Java?primitive?types?are?supported)
??*?@return?the?new?instance
??*?@throws?BeanInstantiationException?if?the?bean?cannot?be?instantiated
??*?@see?Constructor#newInstance
??*/
?public?static??T?instantiateClass(Constructor?ctor,?Object...?args)?throws?BeanInstantiationException?{
??Assert.notNull(ctor,?"Constructor?must?not?be?null");
??try?{
???ReflectionUtils.makeAccessible(ctor);
???if?(KotlinDetector.isKotlinReflectPresent()?&&?KotlinDetector.isKotlinType(ctor.getDeclaringClass()))?{
????return?KotlinDelegate.instantiateClass(ctor,?args);
???}
???else?{
????Class[]?parameterTypes?=?ctor.getParameterTypes();
????Assert.isTrue(args.length?<=?parameterTypes.length,?"Can't?specify?more?arguments?than?constructor?parameters");
????Object[]?argsWithDefaultValues?=?new?Object[args.length];
????for?(int?i?=?0?;?i??????if?(args[i]?==?null)?{
??????Class?parameterType?=?parameterTypes[i];
??????argsWithDefaultValues[i]?=?(parameterType.isPrimitive()???DEFAULT_TYPE_VALUES.get(parameterType)?:?null);
?????}
?????else?{
??????argsWithDefaultValues[i]?=?args[i];
?????}
????}
????return?ctor.newInstance(argsWithDefaultValues);
???}
??}
??catch?(InstantiationException?ex)?{
???throw?new?BeanInstantiationException(ctor,?"Is?it?an?abstract?class?",?ex);
??}
??catch?(IllegalAccessException?ex)?{
???throw?new?BeanInstantiationException(ctor,?"Is?the?constructor?accessible?",?ex);
??}
??catch?(IllegalArgumentException?ex)?{
???throw?new?BeanInstantiationException(ctor,?"Illegal?arguments?for?constructor",?ex);
??}
??catch?(InvocationTargetException?ex)?{
???throw?new?BeanInstantiationException(ctor,?"Constructor?threw?exception",?ex.getTargetException());
??}
?}

方法12:finishRefresh() => 完成刷新

?/**
??*?Finish?the?refresh?of?this?context,?invoking?the?LifecycleProcessor's
??*?onRefresh()?method?and?publishing?the
??*?{@link?org.springframework.context.event.ContextRefreshedEvent}.
??*/

?protected?void?finishRefresh()?{
??//?Clear?context-level?resource?caches?(such?as?ASM?metadata?from?scanning).
??//?
??clearResourceCaches();

??//?Initialize?lifecycle?processor?for?this?context.
??initLifecycleProcessor();

??//?Propagate?refresh?to?lifecycle?processor?first.
??getLifecycleProcessor().onRefresh();

??//?Publish?the?final?event.
??publishEvent(new?ContextRefreshedEvent(this));

??//?Participate?in?LiveBeansView?MBean,?if?active.
??LiveBeansView.registerApplicationContext(this);
?}

方法13:resetCommonCaches() => 緩存重置

?/**
??*?Reset?Spring's?common?reflection?metadata?caches,?in?particular?the
??*?{@link?ReflectionUtils},?{@link?AnnotationUtils},?{@link?ResolvableType}
??*?and?{@link?CachedIntrospectionResults}?caches.
??*?@since?4.2
??*?@see?ReflectionUtils#clearCache()
??*?@see?AnnotationUtils#clearCache()
??*?@see?ResolvableType#clearCache()
??*?@see?CachedIntrospectionResults#clearClassLoader(ClassLoader)
??*/

?protected?void?resetCommonCaches()?{
??ReflectionUtils.clearCache();
??AnnotationUtils.clearCache();
??ResolvableType.clearCache();
??CachedIntrospectionResults.clearClassLoader(getClassLoader());
?}

最后回顧整個流程概覽圖:

Bean工廠實例化Bean概覽圖

好文章,我在看

瀏覽 30
點贊
評論
收藏
分享

手機掃一掃分享

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

手機掃一掃分享

分享
舉報

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

国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频 大香蕉福利视频导航| 高清无码专区| 免费三级片网址| 好好的日视频| 免费肏屄| 无码人妻精品一区二区三区温州| 德国肥妇熟妇BBwBBw| 人人操AV在线| 天天色天天日| 亚洲一二三| 99人妻人人爽人人添人人精品 | 精品人妻一区二区三区鲁大师| 黃色一级A片一級片| 人妻少妇一区二区三区| 国产17c精品视频一二三区| 特大妓女BBwBBWBBw| 人人澡超碰碰| 五月琪琪| 嫩草久久99www亚洲红桃| 97久久精品| 亚洲无码中文字幕在线| 99热99re6国产线播放| 日本黄色视频。| 日韩无码破解| 夜夜网站| 国产精品探花熟女| 久99在线视频| 51亚洲精品| AAA三级视频| 九九草在线视频| 日本黄色视频电影| 综合导航无码| 欧美AAAAAA视频| 99久久99久国产黄毛片| 少妇爆射| 欧美级毛片高潮| 日本高清版色视频| 越南熟女| 操操小骚逼| 三级片韩国AV| 性欧美成人播放77777| 日韩欧美在线中文| 懂色在线精品分类视频| 黄频美女日本免费| av大片免费看| 国产美女一级特黄大片| 午夜无码鲁丝片午夜精品一区二区| 婷婷丁香五月激情一区综合网| 国产精品免费av在线| 青草中文娱乐网在线| 成人网站在线| 国产高清做爱免费在线视频| 玖玖爱AV| 久久a久久| 亚洲精品一区中文字幕乱码| 黄网91| 91视频福利网| 特级爱爱视频| 国产天堂av| 色播网址| 操逼网站在线看| 亚洲AV无码乱码国产精品黑人 | 人妻少妇无码精品| 国产成人午夜福利在线| 高H视频在线观看| 中文不卡视频| 亚洲成人在线网站| 乱婬妺妺躁爽A片| 欧美激情在线| 夜夜骚精品人妻av一区| 六月丁香五月天| 久久99精品国产.久久久久| 国产精品色婷婷99久久精品| 玖玖热在线视频| 欧美色图网址| 三级片AAAA| 狠狠91| 久久97人妻AⅤ无码一区| 艹逼91| 亚洲高清视频免费| 国产一片黑夜内射| 日韩中文无| 中文字幕777| www男人的天堂| www俺来也com| 六月婷婷五月| 黃色一級片黃色一級片尖叫声-百度-百| 操逼视频高清无码| 日韩有码中文字幕在线观看| 91综合久久| 日本成人黄色电影| 日本黄色免费视频| 啪啪免费视频| 午夜操一操| 欧美日逼| 国产AV三级片| www.欧美| 手机看片午夜福利网| 久久水密桃| 色九月婷婷| 一区二区免费在线观看| 欧性猛交ⅩXXX乱大交| 谁有毛片网站| 日韩小黄片| 男人天堂社区| 黄片高清| 亚洲视频在线免费观看| 亚洲AV无码成人网站国产网站| 中文字幕精品综合| 欧亚一区二区| 国产免费www| 国产午夜视频在线| 最新三级网站| 久久久久久久性爱| 欧美成人网站在线观看| 2025AV中文字幕| 制服丝袜人妻| 青青国产| 色哥网在线一区| 中文字幕在线观看免费高清完整版在线观看| 色色五月婷婷| 中文字幕观看| 伊人9| 国产欧美另类| 日韩一区二区三区精品| 人人人射| 日韩精品毛片| 色婷婷av在线| 激情五月天在线观看| 9I成人免费版视频| 欧美五月在线网址| 日韩三级在线免费观看| 免费高清无码在线| 婷婷情色| 色吧久久| 婷婷无码在线| 激情综合五月| av在线精品| 国产无码一区二区| 一区二区三区四区久久| 四虎黄色| 伊人一区| 三级丁香在线| 在线观看三级网址| 先锋影音亚洲无码av| 成人动漫一区| 少妇高潮日韩| 欧美人妻无码| 国产3级片| 再深点灬好爽灬轻点久久国产| 91人妻人人澡人人| 国模精品无码一区二区免费蜜桃| 国产青青草| 黄色成人网站在线观看免费| 人人妻人人操人人| 成人自拍偷拍视频| 91性爱嫩逼视频| 无码婬片A片AAA毛片艳谭| 一本一道久久综合| 日韩欧美国产精品综合嫩V| 久久草大香蕉| 国产黄色网页| 91麻豆大奶巨乳一区白虎| 五月天婷婷色播| 国产亚洲精品久久久波多野结衣 | 激情无码在线观看| 在线观看视频免费无码免费视频 | 免费电影日本黄色| 91精品国产乱码香蕉黄瓜草莓| 337p西西人体大胆瓣开下部| 日本AⅤ在线| 日韩无码成人| 国产青草视频在线观看| 91在线免费播放| 狠狠干b| 色图欧美色图| 国产又爽又黄免费网站免费观看| 成人性爱毛片| 91成人一区二区| 中文字幕在线视频第一页| 日本一本不卡| 水蜜桃视频网| 怡春院熟女精品AV| jizz国产视频| 无码一级二级| ww国产| 黄色视频| 一级成人电影| 国产黄色视频免费在线观看| 逼特逼视频在线观看| 98色色| 偷偷操av| 亚洲性爱小说网址| 欧美日色| 自拍偷拍视频网址| 色色色色色欧美| 激情五月天亚洲| 色婷婷在线影院| 豆花视频logo进入官网| 操逼黄色视频| 91N视频| 欧美群交videotv群交| 五月丁香999| 瑟瑟视频在线观看| 日韩AV三级片| 大肉大捧视频免费观看| 午夜精品久久久| 性V天堂| 久热久热| 大香蕉久操网| 翔田千里| 欧美成在线| www一个人免费观看视频www| 欧美日韩美女| 91狠狠色丁香婷婷综合久久精品| 亚洲一本| 激情小说亚洲图片:伦| 久9久9久9久9久9久9| 18禁无码永久免费网站大全| 日韩在线毛片| 精品看片| 美日韩无码视频| 中文字幕在线观看网址最新地址 | 综合天堂AV久久久久久久| AA级黄色视频| 日本视频免费| 欧美三级电影在线观看| 在线人妻| 婷婷五月伊人| 一区二区三区免费在线观看 | 蜜臀99久久精品久久久久久软件| 亚洲天堂本一| 国产精品国产三级国产| 911精品国产一区二区在线| 精品久久视频| 91视频在线免费观看app| 天天躁夜夜躁狠狠躁AV| 日本AV在线播放| 免费做爱视频网站| 在线男人天堂| 日皮视频免费在线观看| 特黄AAAAAAAA片视频| 青青草91在线| 99视频久久| 一级操逼视频| 三级片无码在线| 中文字幕777| 亚洲激情视频| 久久超碰99| 亚洲欧美日韩一区| 亚洲黄色电影| 在线性视频| 妻子互换被高潮了三次| 五丁香在线观看AV| 黄色电影视频在线| 加勒比无码| 色色欧美色色| 亚洲欧美成人视频| 婷婷五月精品中文字幕| 国产精品探花熟女AV| 国产麻豆精品成人免费视频| 欧美日视频| 无码乱伦AV| 黑人一区二区| 久久精品视频在线观看| 国产av电影网| jizz麻豆| 国产精品国产精品国产| 啪啪91| 亚洲无码成人在线| 成人国产欧美日韩在线视频| 88在线无码精品秘入口九色 | 精品伊人久久| 亚洲色情在线观看| 天天色小说| 中文字幕亚洲无码视频| 人人干人人爽| 黄色片网站视频| 爱操逼网| 综合影院| 欧美日韩一区视频| 在线观看免费无码视频| 日本少妇高潮喷水XXXXXXX| 体内射精视频| 无码激情| wwwwww黄| 自拍偷拍无码| 中文字幕AV免费观看| 五月天激情导航| h片在线免费观看| h网站在线看| av日韩无码| 一级片三级片| 欧美精品一卡| 免费成人黄视频| 日本白浆| 精品欧美无人区乱码毛片| 1024大香蕉| 欧美A区| 欧美狼友| 久久精品视频9| 国产毛片在线| 真人一级毛毛片| 国产欧美日本| 精品人妻无码一区二区三区| 三级无码中文| 懂色av懂色av粉嫩av分享吧| 国产一a毛一a免费观看| 成人A片视频| 日本高清久久| 日韩黄片视频| 一区二区国产视频| 久操无码| 欧美亚洲成人网站| 性天堂| 亚洲欧洲久久电影| 乱伦视频91| 大香蕉伊人视频| 一区无码高清| 麻豆91在线| 男人午夜网站| 欧美久久网| 黄色一级片在线看| 国产学生妹在线播放| www.av免费| 操逼啦| 在线观看国产区| 日韩无码五月天| 久久嫩草在线影院| 日本电影一区二区| 99热在线免费观看| 久热re| 精品91| 高清无码视频免费| 国产高清不卡| 亚洲色图欧美在线| 国产91在线播放| 男人天堂资源网| 少妇毛片| 北条麻妃成人视频| 人妻p| 18禁网站在线播放| 自拍偷拍无码| 色欲AV秘无码一区二区三区| 91精品久久香蕉国产线看观看| 91精品少妇高潮一区二区三区不卡| 人妻无码专区| jizz在线观看免费视频| 久久99精品久久久水蜜桃| 无码做爰欢H肉动漫网站在线看 | www.zaixianshipin| 午夜AV在线免费观看| 亚洲天堂本一| 91无码高清| 综合影院| 成人色色网站| 欧美亚洲综合在线观看| 亚洲欧美激情小说| AA片免费| 亚洲性爱网址| 高清在线无码视频| 欧美成视频| 超碰碰97| www黄色视频| 麻豆AV免费看| 91在线观看高清18| 成人毛片在线视频| 亚洲AV无码成人精品区天堂小说 | 国产一区二区免费在线观看| 成人无码视频在线观看| 台湾色综合| 亚洲精品一区二三区不卡| 天堂视频在线观看亚洲美女| 国产无码激情视频| 黄色视频日本免费| 18禁黄网站| 麻豆乱伦视频| 蝌蚪九色啦403| 国产在线视频导航| 人人肏人人射| av电影在线观看| 青草久久网| 啪啪啪啪网站| 日韩欧美中文字幕在线视频| 日本草久| 亚洲欧美v| 亚洲日本中文字幕在线| 深夜无码| 99久久国产热无码精品免费| 夜夜骚精品人妻av一区| 丁香五月天社区| 天天搞天天色| 亚洲香蕉在线观看| 欧美亚洲在线观看| 亚洲av免费在线观看| 色骚综合| 中文字幕88页| 一级黄色片视频| 欧美午夜影院| 国产黄色视频在线| 九九精品热播| 精品逼| 17c.白丝喷水自慰| 国产xxxx视频| 黄色视频免费在线观看| AV一区二区在线观看| 人人操人人透| 丁香五月激情网| 日本一级黄色| 性欧美亚洲| 日韩无码精品电影| 九九综合精品| 丁香久久| 2021国产视频| 国产免费激情视频| 日本成人黄色视频| 首屈一指视频在线观看| 国产性爱自拍一下| 欧美一区二区在线视频| 大香蕉青青| 一区二区AV| 99久久精品国产一区二区成人| 91吊逼| 日韩在线综合| 永久av| 成人免费毛片片v| 欧美日韩精品一区二区| 在线观看国产一级片| 中文字幕精品无码亚| 日韩成人网站在线观看| 人人人妻人人人操| 尤物无码| 91精品日韩| 久久成人18免费网站波多野结衣 | 亚洲国产成人在线| 大香焦久久| 亚洲一卡二卡三卡四卡免| 综合天堂网| 欧美午夜视频| xxxxxbbbbb| 欧美激情视频在线| 亚洲黄色免费在线观看| 桃花岛tⅴ+亚洲品质| 国产精品秘入口18禁网站| 北京熟妇槡BBBB槡BBBB| 欧美性猛交ⅩXXX无码视频 | 久久天堂| 亚洲综合社区| 激情三区| 天天操免费| 日韩精品视频在线免费观看| 91丨九色丨老熟女探花| 北条麻妃无码一区三区| 色天堂网| 亚洲人妻影院| 欧美喷水视频| 色情五月| 中文字幕在线国产| 久久无码人妻精品一区二区三区| 北条麻妃无码在线| 性爱无码网站| 婷婷五月天激情电影| 久草黄色电影| 日韩爱爱视频| 久久婷五月天| 亚洲成人电影天堂| 久久国产精品波多野结衣AV| 豆花视频成人版www满18| 亚洲一区高清无码| 浪潮在线观看完整版| 高清无码在线观看免费| 成人黄色无码视频| 国产骚逼视频| 麻豆乱码国产一区二区三区| 欧美又粗又长| 91丨熟女丨露脸| 狠狠的操| 狠狠穞A片一區二區三區| 欧美老女人操逼视频| 国产成人AA| 久久精品熟妇丰满人妻99| 五月丁香婷婷综合网| 午夜亚洲AⅤ无码高潮片苍井空| 天堂亚洲AV无码精品成人| 黄色成人网站在线| 久久大陆| 亚洲AV无码高清| 91热| 久草视频观看| 无码不卡av| 曰韩一级A片| 日本a视频| 91人妻人人澡人人| 成人免费三级| 99在线观看视频在线高清| 欧美成人毛片AAAAAA| 中文字幕一区二区三区免费2023| 亚洲天堂影音先锋| 91丨九色丨蝌蚪丨对白| 亚洲视屏| 玖玖爱国产| 大香蕉综合视频| 蜜桃性视频| 加勒比黑人和翔田千里在线播放| 超碰国产在线| 精品欧美乱码久久久久久| 亚洲无码。| 亚洲AV无码一区毛片AV| 日韩成人视频在线观看| 国产一卡二卡在线观看| 国产毛片精品一区二区色欲黄A片| 日韩性网| 久久加勒比| 国产一级a毛一级a毛视频在线网站 | 亚洲视频免费看| 操逼电影网站| 婷婷五月综合中文字幕| 日韩美女做爱| 日韩一页| 久久一级视频| 亚洲精品伊人| 韩国gogogo高清在线完整版| 天堂vs亚洲| 51无码| 亚洲精品97久久中文字幕| 免费Av网站| 美女人人操| 欧美亚洲综合在线观看| 高清无码在线免费观看| 欧美黑吊大战白妞欧美大片| 91无码人妻一区二区| 亚洲日韩欧美色图| 国产婷婷精品| 日本天堂Tv视频在线观看| 中日韩特黄A片免费视频| 人人色人人黄| 苍井空中文字幕在线观看| h片在线观看| 深爱婷婷| 97A片在线观看播放| 亚洲中文字幕在线看| 无码中文在线| 亚洲黄色视频在线观看网站| 亚洲精品久久久久毛片A级牛奶 | 秋霞欧美在线| 一区二区小视频| 欧美色乱| 伊人免费视频| av在线免费播放| seseav| 日本内射在线观看| 狠狠躁日日躁夜夜躁A片小说免费 色综合久久久无码中文字幕999 | 97精品在线观看| 乱伦视频91| 日韩一级片在线| 成人精品亚洲人成在线| 操屄国产| 亚洲www| 日韩视频第一页| 亚洲A视频| 北条麻妃无码中文| 亚洲人成免费| 日本aa视频| 51妺嘿嘿午夜福利视频| 超碰人人搞| 国产无遮挡又黄又爽又| 精产国品一区二区| 人人操人人爽| 国产激情AV| 人人爽人人爽人人爽| 久草超碰在线| 日本视频一区二区三区| 青娱乐在线视频精品| 亚洲午夜久久久久久久久| 大香蕉在线视频网| 黑人精品XXX一区一二区| 亚洲视频三区| 一区二区三区四区不卡| 亚洲婷婷三级成人网| 国产激情在线视频| 综合天堂AV久久久久久久| 麻豆人妻换人妻好紧| 爱操逼综合网| 亚洲成人大香蕉| 91丝袜一区二区三区| 3D动漫精品一区二区在线播放免费 | 日韩在线视频一区二区三区 | 你懂的在线观看视频| 噜噜在线| 亚洲日韩AV无码| 日韩AV成人电影| 高潮喷水视频| 伊人逼逼| 这里精品| 亚洲爱爱网站| 欧美午夜电影| 国产女人高潮的AV毛片| 日韩无码人妻视频| 北条麻妃视频在线播放| 欧美精品一区二区少妇免费A片| 夜夜爱爱| 91丝袜一区二区| 亚洲色视频| 爱搞逼综合网| 男女AV| 动漫3d啪啪成人h动漫| 亚洲操b| 婷婷AV在线| 午夜无码av| 国产视频二区| 中文乱伦视频| 日韩有码在线观看| 九九精品视频在线播放| 精品日韩一区二区三区| 国产精品porn| 亚洲高清成人| 台湾精品无码| 三级片网站在线观看| 91色区| 青青色视频| 伊人黄色电影| 日韩无码AV一区二区三区| 影音先锋av成人电影| 4438黄色| 伊人大香蕉视频在线观看| AV无码网| 日本A在线播放| 国产精品九九九九九九| 日屄电影| 国产h在线播放| 无码电影在线播放| 91视频网站免费观看| 成人动漫| 麻豆AV免费看| 黄色视频毛片一一| 久久无码在线观看| www.日韩一区| 日本在线一区| 欧美AAA在线观看| 日韩啊v| 江苏妇搡BBB搡BBBB| 伊人蕉久| 亚洲成人第一页| 手机看片1024旧版| 男人天堂视频网| 中文字幕国产av| 国产精品爽爽久久久久| 成人三级片在线| 成人第一页| 高清免费无码视频| 色婷婷综合久久久中文字幕| 高清无码在线观看视频| 亚洲日韩AV在线| 国产在线小视频| 日韩三区| 99久久99久国产黄毛片| 亚洲第一狼人综合网| 4080yy午夜理论片成人| 欧美成人中文字幕| 国产精品99久久免费黑人人妻| 大香蕉九九| 色香蕉在线视频| 丁香六月色| 免费黄色视频网站在线观看| 国产三级免费观看| 国产亚洲天堂| 成人无码电影在线观看| 一区二区日本| 五月丁香成人| 成人在线国产| 日本无码视频在线观看| 一级片日韩| 色77777| 亚洲欧美日韩黑料吃瓜在线观看 | 天堂va欧美va亚洲va在线| 波多野结衣一区二区三区在线观看 | 亚洲黄色影视| 北条麻妃无码精品AV| 99精品在线免费观看| 久久精品国产视频| 婷婷综合| 国产96在线亚洲| 毛片在线看片| 伊人久久大香线蕉| 中文√在线天堂8| 97人人操人人| 亚洲A片一区二区三区电影网| 内射无码视频| 久久999| 在线看黄网站| 水果派av解说| 日本A视频| footjobvk| 国产一级a毛片| 嘿嘿午夜影院| 99er在线观看| 天天摸天天干| 最新三级网站| 91久久国产性奴调教| 日韩人妻无码专区| 精品视频在线观看| 欧美视频综合| 粉嫩99精品99久久久久久特污兔 | 中国老少配BBwBBwBBW| 黄片网站在线免费观看| 国产无遮挡又黄又爽又色视频| 丁香婷婷激情| 青青草在线播放| 91免费小视频| 91丨人妻丨国产丨丝袜| 亚洲AV无码久| 亚洲成人77777| 婷婷五月天色综合| 久久国产一区二区三区| 国产黄色性爱视频| 成人无码动漫A片| 在线中文字幕网站| 爱爱帝国综合社区| 大鸡吧大香蕉| 日韩欧美大片在线观看| 午夜天堂精品久久久久9| 又大又黄又爽| 亚洲操逼片| 北条麻妃视频在线观看| 色综合视频| 成人免费视频一区| 麻豆一区在线| 91狠狠色丁香婷婷综合久久精品| 91网站免费看| 午夜无码福利| 38D蜜桃臀| 日本欧美一级片| 国产成人一区二区无码| 日韩欧美成人在线观看| 高清无码激情| aaa黄片| 欧美在线不卡综合| 国产91探花| 久久视频在线| 粉嫩av懂色av蜜臀av熟妇| 四川少妇BBBB槡BBBB槡| 亚洲第一福利视频| 91精产国品一二| 在线观看黄色| 蜜桃91在线观看| 91人妻最真实刺激绿帽| 中文字幕一区二区三区四虎在线| 中文字幕在线免费| 国产人成视频免费观看| 亚洲字幕AV| 九九小视频| 一区二区三区无码免费| 九色91| 91操美女视频| 18禁无码网站| 日韩日韩日韩日韩| 躁BBB躁BBB躁BBBBB乃| 91综合视频| 女人的天堂AV在线观看| 亚洲精品乱码在线| 欧美熟妇搡BBBB搡BBBBB| 青娱乐国产视频| 国产91无码精品秘入口新欢| 91就要爱爱视频| 麻豆911精一区二区| 国产乱子伦无码视频免费| 午夜成人鲁丝片午夜精品| 无码免费一区二区| 国产无码AV大片| 国产夫妻自拍av| 大香蕉在线网站| 亚洲日韩一级片| 中文无码在线播放| JlZZJLZZJlZZ亚洲女人17 | 自拍偷拍AV| 欧美黄视频| 午夜精品18码视频国产17c| 97人人爽人人爽人人爽| 免费啪啪网| 亚洲av高清无码| 国产一级婬女AAAA片季秀英| 91视频黄| 精品亚洲一区二区三区四区五区| 国产在线观看无码免费视频 | 欧美亚洲三级| 日韩一级片视频| 久久精品禁一区二区三区四区五区| 欧美日韩美女| 激情人妻av| 专区无日本视频高清8| 日韩人妻无码一区二区三区七区| 免费av中文字幕| 亚洲视频在线免费看| 激情动态视频| 丝袜制服中文字幕无码专区| 亚洲天堂在线免费观看视频| 国产丝袜在线| 日韩在线综合| 五月天色色婷婷| 免费在线观看Av| 免费看一级黄色片| 日韩黄色三级片| 3d动漫一区二区| 麻豆亚洲| 五月天啪啪| 操逼视频在线观看| 日韩操逼av| 国产人妖TS重口系列网站观看| 欧美综合在线观看| 亚洲精品乱码久久久久久按摩观| 久久久国产AV| 久久精品毛片| 激情操逼| 色狠狠干| 国产熟女一区| 79色色| 搡BBBB搡BBB搡五十粉嫩| 高清无码视频免费| 亚洲国产精品成人久久蜜臀| 亚洲一级黄色电影| 国产夫妻自拍av| 久久嫩草国产成人一区| 亚洲资源在线观看| 日本女人高潮视频| 国产白丝视频| 波多野结衣视频在线| 日韩亚洲中文在线| 天天日天天干美女| 亚洲一级AV| 熟女一区| 黄色视频网站在线播放| 黄色特级毛片| 日逼黄片| 91黄网站在线观看| 国产艹| 日本黄色免费视频| 五月一区| 闺蜜av| www.色婷婷| 另类老妇奶性生BBwBBw偷拍| 一区成人| 超碰99在线| 成人做爰100片免费着| 丁香五月五月婷婷| 无码超碰| 欧美操美女| 男人天堂视频在线观看| 丰满人妻一区二区三区| 一级a一级a爰片免费免免中国A片| 精品欧美乱码久久久久久| 大香蕉国产精品| 久久久在线视频| 囯产精品久久久久久久久久辛辛| 伊人午夜| 日韩色爱| 中文字幕无码视频在线观看| 色情欧美一级A片| 成人大香蕉视频| 婷婷久久亚洲| 强奸校花到高潮| 少妇人妻AV| 白嫩外女BBWBBWBBW| 尤物A片| 人人看人人摸人人草| 国产人妖在线| 日韩一区二区三区在线视频| 日韩AV无码专区亚洲AV| 色中文字幕| 成人黄网站在线观看| 亚洲国产成人91PORN| 豆花视频在线观看| 操逼视频在线免费看| 国产剧情在线| 天堂色| 欧美久久大香蕉| 成人在线视频网站| 鲁鲁鲁鲁鲁鲁鲁777777| 欧洲成人在线观看| 精品夜夜澡人妻无码AV| 欧美成人手机在线看片| 亚洲精品一区二区三区在线观看 | 欧洲亚洲免费视频| 蜜桃视频网| 五月天婷婷无码| www.亚洲成人| 天天操夜夜操视频免费高清| 精品五月天| 亚洲三级片在线观看| 狠狠2021| 久久久久久久免费视频| a√在线视频| 69国产在线| 色色网站| 中文字幕成人影片| 成人免费网站| 日日碰狠狠躁久久躁婷婷| 中文字幕+乱码+中文字幕电视剧 | 欧美+日韩+国产+成人+在线| 99re在线视频观看| 在线观看毛片网站|