13--BeanFactory簡介

前兩篇已經(jīng)簡介了Spring及其IoC容器,本篇介紹IoC容器最基礎(chǔ)的實(shí)現(xiàn)BeanFactory民逼,其XmlBeanFactory實(shí)現(xiàn)類將作為分析的入口(雖然該類已經(jīng)被標(biāo)記為過期,但是這不妨礙我們作為分析IoC的入口類)稳懒,接下來很多的篇幅將以XmlBeanFactory為入口沃琅,對IoC容器進(jìn)行解析队寇。

BeanFactory簡介

IoC容器的頂級接口滋戳,是IoC容器的最基礎(chǔ)實(shí)現(xiàn)斋竞,也是訪問Spring容器的根接口倔约,負(fù)責(zé)對bean的創(chuàng)建,訪問等工作坝初。

接下來要介紹的類比較多浸剩,對于初看Spring源碼的同學(xué),只要知道BeanFactory的作用即可鳄袍。

類圖關(guān)系

  • IDEA查看類圖-->光標(biāo)定位到類或接口-->右鍵

![IDEA查看類圖](https://upload-images.jianshu.io/upload_images/13657367-377f9b8776179b8a.png =400x300)

  • XmlBeanFactory類圖結(jié)構(gòu)

![XmlBeanFactory類圖結(jié)構(gòu)](https://upload-images.jianshu.io/upload_images/13657367-6952aeac459b3ce3.png =400x300)

藍(lán)色的實(shí)線表示類與類之間的繼承關(guān)系
綠色的實(shí)線表示接口與接口之間的繼承關(guān)系
綠色的虛線表示類與接口之間的繼承關(guān)系

XmlBeanFactory的繼承體系比較復(fù)雜,但是在分析源碼之間,了解一下類的繼承關(guān)系將助于我們對源碼的分析

從圖中可以看到,頂級接口分別是BeanFactory,SingletonBeanRegistry,AliasRegistry


1.BeanFactory

//SpringIoC容器頂級接口
public interface BeanFactory {

    // 區(qū)分是獲取FactoryBean還是FactoryBean的createBean創(chuàng)建的實(shí)例.如果&開始則獲取FactoryBean;否則獲取createBean創(chuàng)建的實(shí)例.
    String FACTORY_BEAN_PREFIX = "&";

    Object getBean(String name) throws BeansException;

    <T> T getBean(String name, Class<T> requiredType) throws BeansException;

    Object getBean(String name, Object... args) throws BeansException;

    <T> T getBean(Class<T> requiredType) throws BeansException;

    <T> T getBean(Class<T> requiredType, Object... args) throws BeansException;

    <T> ObjectProvider<T> getBeanProvider(Class<T> requiredType);

    <T> ObjectProvider<T> getBeanProvider(ResolvableType requiredType);

    boolean containsBean(String name);

    boolean isSingleton(String name) throws NoSuchBeanDefinitionException;

    boolean isPrototype(String name) throws NoSuchBeanDefinitionException;

    boolean isTypeMatch(String name, ResolvableType typeToMatch) throws NoSuchBeanDefinitionException;

    boolean isTypeMatch(String name, Class<?> typeToMatch) throws NoSuchBeanDefinitionException;

    @Nullable
    Class<?> getType(String name) throws NoSuchBeanDefinitionException;

    String[] getAliases(String name);
}
1.1 ListableBeanFactory-->BeanFactory
//擴(kuò)展了BeanFactory接口,提供了對bean的枚舉能力,
//即可以返回bean的實(shí)例集合,而不用像BeanFactory只能返回單個bean的實(shí)例
//注意:如果存在父容器的話該接口不會考慮父容器中的bean,只會返回當(dāng)前容器中的bean
public interface ListableBeanFactory extends BeanFactory {

    boolean containsBeanDefinition(String beanName);

    int getBeanDefinitionCount();

    String[] getBeanDefinitionNames();

    String[] getBeanNamesForType(ResolvableType type);

    String[] getBeanNamesForType(@Nullable Class<?> type);

    String[] getBeanNamesForType(@Nullable Class<?> type, boolean includeNonSingletons, boolean allowEagerInit);

    <T> Map<String, T> getBeansOfType(@Nullable Class<T> type) throws BeansException;

    <T> Map<String, T> getBeansOfType(@Nullable Class<T> type, boolean includeNonSingletons, boolean allowEagerInit) throws BeansException;

    String[] getBeanNamesForAnnotation(Class<? extends Annotation> annotationType);

    Map<String, Object> getBeansWithAnnotation(Class<? extends Annotation> annotationType) throws BeansException;

    @Nullable
    <A extends Annotation> A findAnnotationOnBean(String beanName, Class<A> annotationType) throws NoSuchBeanDefinitionException;

}
1.2 HierarchicalBeanFactory--> BeanFactory
//擴(kuò)展了BeanFactory接口,提供了對父容器的訪問功能
public interface HierarchicalBeanFactory extends BeanFactory {

    @Nullable
    BeanFactory getParentBeanFactory();

    boolean containsLocalBean(String name);

}
1.3 AutowireCapableBeanFactory --> BeanFactory
//擴(kuò)展了BeanFactory绢要,主要提供了自動裝配能力
public interface AutowireCapableBeanFactory extends BeanFactory {

    //無自動裝配
    int AUTOWIRE_NO = 0;

    //by-name裝配
    int AUTOWIRE_BY_NAME = 1;

    //by-type裝配
    int AUTOWIRE_BY_TYPE = 2;

    //constructor構(gòu)造函數(shù)裝配
    int AUTOWIRE_CONSTRUCTOR = 3;

    //自動裝配,已被標(biāo)記為過時
    @Deprecated
    int AUTOWIRE_AUTODETECT = 4;


    //-------------------------------------------------------------------------
    // 創(chuàng)建和填充外部bean實(shí)例的典型方法
    //-------------------------------------------------------------------------

    <T> T createBean(Class<T> beanClass) throws BeansException;

    void autowireBean(Object existingBean) throws BeansException;

    Object configureBean(Object existingBean, String beanName) throws BeansException;


    //-------------------------------------------------------------------------
    // 用于細(xì)粒度控制bean生命周期的方法
    //-------------------------------------------------------------------------

    Object createBean(Class<?> beanClass, int autowireMode, boolean dependencyCheck) throws BeansException;

    Object autowire(Class<?> beanClass, int autowireMode, boolean dependencyCheck) throws BeansException;

    void autowireBeanProperties(Object existingBean, int autowireMode, boolean dependencyCheck) throws BeansException;

    void applyBeanPropertyValues(Object existingBean, String beanName) throws BeansException;

    Object initializeBean(Object existingBean, String beanName) throws BeansException;

    Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName) throws BeansException;

    Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName) throws BeansException;

    void destroyBean(Object existingBean);


    //-------------------------------------------------------------------------
    // 委托方法解決注入點(diǎn)
    //-------------------------------------------------------------------------

    <T> NamedBeanHolder<T> resolveNamedBean(Class<T> requiredType) throws BeansException;

    @Nullable
    Object resolveDependency(DependencyDescriptor descriptor, @Nullable String requestingBeanName) throws BeansException;

    @Nullable
    Object resolveDependency(DependencyDescriptor descriptor, @Nullable String requestingBeanName,@Nullable Set<String> autowiredBeanNames,@Nullable TypeConverter typeConverter) throws BeansException;

}

ListableBeanFactory,HierarchicalBeanFactory,AutowireCapableBeanFactory是BeanFactory的直接子接口,分別提供了對bean的枚舉能力,對父容器的訪問能力,對bean的自動裝配能力

1.4 ConfigurableBeanFactory--> HierarchicalBeanFactory-->BeanFactory
//擴(kuò)展了HierarchicalBeanFactory,SingletonBeanRegistry,主要提供了對BeanFactory的配置能力
//該接口擴(kuò)展的內(nèi)容較多,比如類加載器,類型轉(zhuǎn)化,屬性編輯器,BeanPostProcessor,
//作用域,bean定義,處理bean依賴關(guān)系,合并其他ConfigurableBeanFactory,bean如何銷毀等
public interface ConfigurableBeanFactory extends HierarchicalBeanFactory, SingletonBeanRegistry {

    標(biāo)準(zhǔn)單例范圍的范圍標(biāo)識符:“singleton”拗小。
    String SCOPE_SINGLETON = "singleton";

    //標(biāo)準(zhǔn)原型范圍的范圍標(biāo)識符:“prototype”重罪。
    String SCOPE_PROTOTYPE = "prototype";

    //設(shè)置父工廠,注意:不能更改父級工廠
    void setParentBeanFactory(BeanFactory parentBeanFactory) throws IllegalStateException;

    //設(shè)置類加載器以用于加載bean類。默認(rèn)是線程上下文類加載器。
    void setBeanClassLoader(@Nullable ClassLoader beanClassLoader);

    //返回該工廠的類加載器
    @Nullable
    ClassLoader getBeanClassLoader();

    //指定用于類型匹配目的的臨時ClassLoader剿配。
    void setTempClassLoader(@Nullable ClassLoader tempClassLoader);

    //獲取用于類型匹配目的的臨時ClassLoader搅幅。
    @Nullable
    ClassLoader getTempClassLoader();

    //設(shè)置是否緩存bean元數(shù)據(jù),例如給定的bean定義(以合并方式)和已解析的bean類呼胚。默認(rèn)打開茄唐。
    //關(guān)閉此標(biāo)志以啟用bean定義對象的熱刷新,特別是bean類蝇更。如果此標(biāo)志關(guān)閉沪编,則任何bean實(shí)例的創(chuàng)建都將為新解析的類重新查詢bean類加載器。
    void setCacheBeanMetadata(boolean cacheBeanMetadata);

    //返回是否緩存bean元數(shù)據(jù)
    boolean isCacheBeanMetadata();

    //為bean定義值中的表達(dá)式指定解析策略簿寂。
    //默認(rèn)情況下漾抬,BeanFactory中沒有活動表達(dá)式支持。ApplicationContext通常會在此處設(shè)置標(biāo)準(zhǔn)表達(dá)式策略常遂,支持Unified EL兼容樣式中的“#{...}”表達(dá)式纳令。
    void setBeanExpressionResolver(@Nullable BeanExpressionResolver resolver);

    //返回bean定義值中表達(dá)式的解析策略。
    @Nullable
    BeanExpressionResolver getBeanExpressionResolver();

    //指定用于轉(zhuǎn)換屬性值的Spring 3.0 ConversionService克胳,作為JavaBeans PropertyEditors的替代方法平绩。
    void setConversionService(@Nullable ConversionService conversionService);

    //返回關(guān)聯(lián)的ConversionService(如果有)。
    @Nullable
    ConversionService getConversionService();

    //添加PropertyEditorRegistrar以應(yīng)用于所有bean創(chuàng)建過程漠另。
    void addPropertyEditorRegistrar(PropertyEditorRegistrar registrar);

    //為給定類型的所有屬性注冊給定的自定義屬性編輯器捏雌。在工廠配置期間調(diào)用。
    void registerCustomEditor(Class<?> requiredType, Class<? extends PropertyEditor> propertyEditorClass);

    //使用已在此BeanFactory中注冊的自定義編輯器初始化給定的PropertyEditorRegistry笆搓。
    void copyRegisteredEditorsTo(PropertyEditorRegistry registry);

    //設(shè)置此BeanFactory應(yīng)用于轉(zhuǎn)換bean屬性值性湿,構(gòu)造函數(shù)參數(shù)值等的自定義類型轉(zhuǎn)換器。
    //這將覆蓋默認(rèn)的PropertyEditor機(jī)制满败,因此使任何自定義編輯器或自定義編輯器注冊表都無關(guān)緊要肤频。
    void setTypeConverter(TypeConverter typeConverter);

    //獲取此BeanFactory使用的類型轉(zhuǎn)換器。這可能是每次調(diào)用的新實(shí)例算墨,因?yàn)門ypeConverters通常不是線程安全的宵荒。
    //如果默認(rèn)的PropertyEditor機(jī)制處于活動狀態(tài),則返回的TypeConverter將知道已注冊的所有自定義編輯器净嘀。
    TypeConverter getTypeConverter();

    //為嵌入值(例如注釋屬性)添加String解析器报咳。
    void addEmbeddedValueResolver(StringValueResolver valueResolver);

    //確定是否已通過此Bean工廠注冊了嵌入值解析程序resolveEmbeddedValue(String)。
    boolean hasEmbeddedValueResolver();

    //解析給定的嵌入值挖藏,例如注釋屬性暑刃。
    @Nullable
    String resolveEmbeddedValue(String value);

    //添加一個新的BeanPostProcessor,它將應(yīng)用于此工廠創(chuàng)建的bean膜眠。在工廠配置期間調(diào)用岩臣。
    void addBeanPostProcessor(BeanPostProcessor beanPostProcessor);

    //返回已注冊的BeanPostProcessors的當(dāng)前數(shù)量(如果有)袁翁。
    int getBeanPostProcessorCount();

    //注冊給定范圍,由給定的Scope實(shí)現(xiàn)支持婿脸。
    void registerScope(String scopeName, Scope scope);

    //返回所有當(dāng)前注冊的范圍的名稱。
    String[] getRegisteredScopeNames();

    //返回給定范圍名稱的Scope實(shí)現(xiàn)(如果有)柄驻。
    @Nullable
    Scope getRegisteredScope(String scopeName);

    //提供與此工廠相關(guān)的安全訪問控制上下文狐树。
    AccessControlContext getAccessControlContext();

    //復(fù)制給定其他工廠的所有相關(guān)配置。
    //應(yīng)包括所有標(biāo)準(zhǔn)配置設(shè)置以及BeanPostProcessors鸿脓,Scopes和工廠特定的內(nèi)部設(shè)置抑钟。不應(yīng)包含實(shí)際bean定義的任何元數(shù)據(jù),例如BeanDefinition對象和bean名稱別名野哭。
    void copyConfigurationFrom(ConfigurableBeanFactory otherFactory);

    //給定bean名稱在塔,創(chuàng)建別名。
    void registerAlias(String beanName, String alias) throws BeanDefinitionStoreException;

    //解析在此工廠中注冊的所有別名目標(biāo)名稱和別名拨黔,將給定的StringValueResolver應(yīng)用于它們蛔溃。
    //例如,值解析器可以解析目標(biāo)bean名稱中的占位符篱蝇,甚至可以解析別名中的占位符贺待。
    void resolveAliases(StringValueResolver valueResolver);

    //返回給定bean名稱的合并BeanDefinition,如果需要零截,將子bean定義與其父bean合并麸塞。也考慮祖先工廠中的bean定義。
    BeanDefinition getMergedBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;

    //確定具有給定名稱的bean是否為FactoryBean涧衙。
    boolean isFactoryBean(String name) throws NoSuchBeanDefinitionException;

    //顯式控制指定bean的當(dāng)前創(chuàng)建狀態(tài)哪工。僅限容器內(nèi)部使用。
    void setCurrentlyInCreation(String beanName, boolean inCreation);

    //確定指定的bean當(dāng)前是否正在創(chuàng)建弧哎。
    boolean isCurrentlyInCreation(String beanName);

    //為給定的bean注冊一個依賴bean雁比,在銷毀給定bean之前銷毀它。
    void registerDependentBean(String beanName, String dependentBeanName);

    //返回依賴于指定bean的所有bean的名稱(如果有)傻铣。
    String[] getDependentBeans(String beanName);

    //返回指定bean所依賴的所有bean的名稱(如果有)章贞。
    String[] getDependenciesForBean(String beanName);

    //根據(jù)bean的定義,銷毀給定的bean實(shí)例(通常是從這個工廠獲得的原型實(shí)例)非洲。
    void destroyBean(String beanName, Object beanInstance);

    //銷毀當(dāng)前目標(biāo)作用域中指定的作用域bean(如果有)鸭限。
    void destroyScopedBean(String beanName);

    銷毀此工廠中的所有單例bean,包括已注冊為一次性的內(nèi)部bean两踏。
    void destroySingletons();

}
1.5 ConfigurableListableBeanFactory

ConfigurableListableBeanFactory--> ListableBeanFactory-->BeanFactory
ConfigurableListableBeanFactory--> AutowireCapableBeanFactory-->BeanFactory
ConfigurableListableBeanFactory--> ConfigurableBeanFactory-->HierarchicalBeanFactory-->BeanFactory

ConfigurableListableBeanFactory繼承了三個接口,并擴(kuò)展了忽略依賴,自動裝配判斷,凍結(jié)bean的定義,枚舉所有bean名稱的功能

public interface ConfigurableListableBeanFactory extends ListableBeanFactory, AutowireCapableBeanFactory, ConfigurableBeanFactory {

    //忽略給定的自動裝配依賴關(guān)系接口败京。
    void ignoreDependencyType(Class<?> type);

    //忽略給定的自動裝配依賴關(guān)系接口。
    void ignoreDependencyInterface(Class<?> ifc);

    //使用相應(yīng)的自動裝配值注冊特殊依賴關(guān)系類型梦染。
    void registerResolvableDependency(Class<?> dependencyType, @Nullable Object autowiredValue);

    //確定指定的bean是否有資格作為autowire候選者赡麦,注入到聲明匹配類型依賴關(guān)系的其他bean中朴皆。
    boolean isAutowireCandidate(String beanName, DependencyDescriptor descriptor) throws NoSuchBeanDefinitionException;

    //返回指定bean的已注冊BeanDefinition,允許訪問其屬性值和構(gòu)造函數(shù)參數(shù)值(可以在bean工廠后處理期間修改)泛粹。
    BeanDefinition getBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;

    //返回所有bean名稱的迭代對象
    Iterator<String> getBeanNamesIterator();

    //清除合并的bean定義緩存遂铡,刪除尚未被認(rèn)為有資格進(jìn)行完整元數(shù)據(jù)緩存的bean條目。
    void clearMetadataCache();

    //凍結(jié)所有bean定義晶姊,表明注冊的bean定義不會被修改或進(jìn)一步后處理扒接。
    void freezeConfiguration();

    //返回是否凍結(jié)此工廠的bean定義
    boolean isConfigurationFrozen();

    //確保所有非lazy-init單例都被實(shí)例化
    void preInstantiateSingletons() throws BeansException;

}
1.6 BeanFactory總結(jié)

分析了從BeanFactory到ConfigurableListableBeanFactory接口的概要功能

  • BeanFactory-->SpringIoC容器頂級接口,定義了對單個bean的獲取,對bean的作用域判斷,獲取bean類型,獲取bean別名的功能
  • ListableBeanFactory-->擴(kuò)展了BeanFactory接口,并提供了對bean的枚舉能力
  • HierarchicalBeanFactory-->擴(kuò)展了BeanFactory接口,并提供了訪問父容器的能力
  • AutowireCapableBeanFactory-->擴(kuò)展了BeanFactory接口,并提供了自動裝配能力
  • ConfigurableBeanFactory-->擴(kuò)展了HierarchicalBeanFactory,并提供了對容器的配置能力
  • ConfigurableListableBeanFactory-->擴(kuò)展了ListableBeanFactory, AutowireCapableBeanFactory, ConfigurableBeanFactory接口,并提供了忽略依賴,自動裝配判斷,凍結(jié)bean的定義,枚舉所有bean名稱的功能

以上介紹BeanFactory接口的分支,下面介紹AliasRegistry接口的分支,該分支下大部分都是實(shí)現(xiàn)類,代碼較多,也較為復(fù)雜,其中細(xì)節(jié),留在以后分析,下面只說下類的主要作用

2. AliasRegistry接口及其實(shí)現(xiàn)類簡介
  • AliasRegistry-->定義bean的別名管理
  • SimpleAliasRegistry-->實(shí)現(xiàn)別名管理接口
  • SingletonBeanRegistry-->提供單例注冊,查詢服務(wù)
  • DefaultSingletonBeanRegistry-->實(shí)現(xiàn)單例與DisposableBean的生命周期管理(創(chuàng)建,維護(hù),銷毀)
  • FactoryBeanRegistrySupport-->添加工廠方式創(chuàng)建類FactoryBean的支持

本篇主要從概念和功能上讓大家對BeanFactory有所了解,接下來幾篇介紹IoC容器的初始化及bean的獲取

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市们衙,隨后出現(xiàn)的幾起案子钾怔,更是在濱河造成了極大的恐慌,老刑警劉巖蒙挑,帶你破解...
    沈念sama閱讀 217,084評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件宗侦,死亡現(xiàn)場離奇詭異音诫,居然都是意外死亡叉袍,警方通過查閱死者的電腦和手機(jī)程储,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評論 3 392
  • 文/潘曉璐 我一進(jìn)店門弦聂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來港粱,“玉大人担忧,你說我怎么就攤上這事丽已〗海” “怎么了桃焕?”我有些...
    開封第一講書人閱讀 163,450評論 0 353
  • 文/不壞的土叔 我叫張陵剑肯,是天一觀的道長。 經(jīng)常有香客問我观堂,道長让网,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,322評論 1 293
  • 正文 為了忘掉前任师痕,我火速辦了婚禮溃睹,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘胰坟。我一直安慰自己因篇,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,370評論 6 390
  • 文/花漫 我一把揭開白布笔横。 她就那樣靜靜地躺著竞滓,像睡著了一般。 火紅的嫁衣襯著肌膚如雪吹缔。 梳的紋絲不亂的頭發(fā)上商佑,一...
    開封第一講書人閱讀 51,274評論 1 300
  • 那天,我揣著相機(jī)與錄音厢塘,去河邊找鬼茶没。 笑死肌幽,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的抓半。 我是一名探鬼主播喂急,決...
    沈念sama閱讀 40,126評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼笛求!你這毒婦竟也來了煮岁?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,980評論 0 275
  • 序言:老撾萬榮一對情侶失蹤涣易,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后冶伞,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體新症,經(jīng)...
    沈念sama閱讀 45,414評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,599評論 3 334
  • 正文 我和宋清朗相戀三年响禽,在試婚紗的時候發(fā)現(xiàn)自己被綠了徒爹。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,773評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡芋类,死狀恐怖隆嗅,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情侯繁,我是刑警寧澤胖喳,帶...
    沈念sama閱讀 35,470評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站贮竟,受9級特大地震影響丽焊,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜咕别,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,080評論 3 327
  • 文/蒙蒙 一技健、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧惰拱,春花似錦雌贱、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至翔冀,卻和暖如春导街,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背纤子。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評論 1 269
  • 我被黑心中介騙來泰國打工搬瑰, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留款票,地道東北人。 一個月前我還...
    沈念sama閱讀 47,865評論 2 370
  • 正文 我出身青樓泽论,卻偏偏與公主長得像艾少,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子翼悴,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,689評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 1.Spring整體架構(gòu) 1)核心容器(Core Container) Core模塊缚够,主要包含了Spring框架基...
    Sponge1128閱讀 1,062評論 0 1
  • 本文是我自己在秋招復(fù)習(xí)時的讀書筆記,整理的知識點(diǎn)鹦赎,也是為了防止忘記谍椅,尊重勞動成果,轉(zhuǎn)載注明出處哦古话!如果你也喜歡雏吭,那...
    波波波先森閱讀 12,291評論 6 86
  • 小毛蟲愛做夢,但是它用行動去實(shí)現(xiàn)夢想陪踩。 即使沒有漂亮的外表杖们,但如果能幫助別人,會收獲更多的愛和快樂肩狂。 每一個孩子摘完,...
    秀琴sukin閱讀 207評論 0 1
  • GeoJson格式數(shù)據(jù): TopoJson格式數(shù)據(jù): 兩個JSON數(shù)據(jù)展示是同一個矩形面,對比一下差異:GeoJs...
    宥_Hugh閱讀 10,557評論 2 8
  • 音樂巨星小永二三事 今天傻谁,換個聊法孝治,不聊詩歌,不聊文學(xué)审磁,聊一聊巨星音樂人—小永荆秦。 1、 我們的小永童鞋力图,有成為...
    藍(lán)瘦的詩人閱讀 464評論 2 5