idea 導(dǎo)入spring5.2.x源碼并測試

相關(guān)資源版本

idea:2021
JDK:1.8
gradle:5.6.4(具體依據(jù)spring源碼中的要求版本)
spring:5.2.x(不建議使用最新版本)
git:2.7.3(無版本要求)
系統(tǒng):win10

獲取源碼

git clone -b 5.2.x https://github.com/spring-projects/spring-framework.git
或者使用
git clone https://github.com/spring-projects/spring-framework.git
然后切換到5.2.x的分支,容易忘記切換分支殷蛇,然后下載的是最新代碼,不容易導(dǎo)入成功
可以進(jìn)入spring-framework目錄戒幔,然后在gradle.properties文件中查看當(dāng)前使用的spring版本,

image.png

git checkout 5.2.x

配置gradle

1土童、打開https://gradle.org/releases進(jìn)行下載诗茎,一定要下載對應(yīng)版本的gradle,才能編譯成功献汗,可以進(jìn)入spring-framework-》gradle-》wrapper目錄中敢订,查看gradle-wrapper.properties文件中g(shù)radle版本信息

image.png

2王污、配置gradle環(huán)境變量GRADLE_HOME、GRADLE_USER_HOME楚午、path,GRADLE_USER_HOME可以使用maven的倉庫

使用idea打開源碼

1昭齐、打開idea,然后
image.png

選擇spring-project中的build.gradle文件醒叁,
image.png

導(dǎo)入項目后gradle使用jdk8司浪,
image.png

導(dǎo)入后,項目會構(gòu)建比較慢
2把沼、打開build.gradle文件,在文件頭部加上Spring插件庫
這個就相當(dāng)于是maven的pom文件)

repositories {
maven { url 'https://repo.spring.io/plugins-release-local' }
}
}
image.png

3吁伺、bulid.gradle文件添加阿里鏡像,注意添加文件的位置及順序

maven { url 'https://maven.aliyun.com/nexus/content/groups/public/' }
maven { url 'https://maven.aliyun.com/nexus/content/repositories/jcenter' }

maven { url "https://repo.springsource.org/plugins-release" }

4饮睬、保存后等待下載依賴
都修改好之后,保存一下篮奄,點擊頁面下圖刷新圖標(biāo)捆愁,等待項目下載依賴構(gòu)建即可,如果有報錯多刷新幾遍


image.png

對源碼進(jìn)行編譯

1窟却、先編譯spring-oxm下的compileTestjava昼丑,選中雙擊即可,編譯完成出現(xiàn)BUILD SUCCESSFUL代表編譯完成


image.png

2夸赫、再編譯下spring-core模塊菩帝,因為之后的spring-context依賴于core,方法同上


image.png

3茬腿、都編譯完成且成功之后呼奢,最后開始編譯整個工程(這個過程非常耗時間),打開頂層項目spring->build->build切平,雙擊開始編譯


image.png

測試基本功能

都編譯成功之后握础,可以添加一個測試模塊進(jìn)來,進(jìn)行測試源碼構(gòu)建編譯是否真的完成

1悴品、新建測試modle禀综,步驟:【File】->【New】->【Module…】 在Spring中添加自己的module模塊,同樣選擇gradle構(gòu)建苔严。


image.png

image.png

2定枷、添加依賴
找到我們自己的測試模塊test,打開build.gradle文件(相當(dāng)于是pom文件)邦蜜,默認(rèn) dependencies依賴(這里的dependencies和maven里的依賴是一樣的)我們需要手工添 加spring-context依鸥,spring-beans,spring-core悼沈,spring-aop這4個核心模塊贱迟,具體如下

dependencies {
    //添加完要構(gòu)建一下姐扮,否則代碼中無法引用,注意不要忘了
    compile(project(":spring-context"))
    compile(project(":spring-beans"))
    compile(project(":spring-core"))
    compile(project(":spring-aop"))

    testCompile group: 'junit', name: 'junit', version: '4.12'
}

3衣吠、添加完成依賴后茶敏,需要對測試modle進(jìn)行構(gòu)建,構(gòu)建完成后缚俏,才能正常使用


image.png

構(gòu)建后的項目情況截圖:


image.png

編寫測試代碼

下面編寫一個簡單的applicationContext獲取容器用的bean惊搏,主要是測試Spring源碼構(gòu)建編譯過程是否成功厕九!
1勃痴、下面編寫一個簡單的applicationContext獲取容器用的bean,主要是測試Spring源碼構(gòu)建編譯過程是否成功烤咧!

package com.clf;
public class User {
    private String id;
    private String userName;
    public User() {
    }
    public User(String id, String userName) {
        this.id = id;
        this.userName = userName;
    }
    public String getId() {
        return this.id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getUserName() {
        return this.userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
    @Override
    public String toString() {
        return "com.clf.User{" +
                "id='" + this.id + '\'' +
                ", userName='" + this.userName + '\'' +
                '}';
    }
}

2亚茬、新建JavaConfig.java


import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@ComponentScan
public class JavaConfig {
    @Bean
    public User user(){
        return new User("001","Jack");
    }
}

3酪耳、最后編寫一個測試類Test.java


import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class Test {
    public static void main(String[] args) {
        System.out.println("hello");
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(JavaConfig.class);
        User user = (User) context.getBean("user");
        System.out.println(user.toString());
    }

}

4、運行Test類
注意: 運行時可能會報如下錯誤:

> Checkstyle rule violations were found. See the report at: file:///C:/chenlf/private_workspace/spring-framework/myTest/build/reports/checkstyle/main.html
  Checkstyle files with violations: 3
  Checkstyle violations by severity: [error:5]

出現(xiàn)以上錯誤是因為spring使用了ant風(fēng)格的代碼檢查刹缝,所有的檢查規(guī)則都在src/checkstyle/checkstyle.xml里面做了配置碗暗,如果不想被這些檢查煩擾到,可以全部注釋掉:


image.png
<!DOCTYPE module PUBLIC "-//Checkstyle//DTD Checkstyle Configuration 1.3//EN" "https://checkstyle.org/dtds/configuration_1_3.dtd">
<module name="com.puppycrawl.tools.checkstyle.Checker">
    <!-- Suppressions -->
    <!--    <module name="SuppressionFilter">-->
    <!--        <property name="file" value="${config_loc}/checkstyle-suppressions.xml"/>-->
    <!--    </module>-->

    <!--    &lt;!&ndash; Root Checks &ndash;&gt;-->
    <!--    <module name="io.spring.javaformat.checkstyle.check.SpringHeaderCheck">-->
    <!--        <property name="fileExtensions" value="java" />-->
    <!--        <property name="headerType" value="apache2"/>-->
    <!--        <property name="headerCopyrightPattern" value="20\d\d-20\d\d"/>-->
    <!--        <property name="packageInfoHeaderType" value="none"/>-->
    <!--    </module>-->
    <!--    <module name="com.puppycrawl.tools.checkstyle.checks.NewlineAtEndOfFileCheck">-->
    <!--        <property name="lineSeparator" value="lf"/>-->
    <!--    </module>-->

    <!--    &lt;!&ndash; TreeWalker Checks &ndash;&gt;-->
    <!--    <module name="com.puppycrawl.tools.checkstyle.TreeWalker">-->
    <!--        &lt;!&ndash; Annotations &ndash;&gt;-->
    <!--        <module name="com.puppycrawl.tools.checkstyle.checks.annotation.AnnotationUseStyleCheck">-->
    <!--            <property name="elementStyle" value="compact" />-->
    <!--        </module>-->
    <!--        <module name="com.puppycrawl.tools.checkstyle.checks.annotation.MissingOverrideCheck" />-->
    <!--        <module name="com.puppycrawl.tools.checkstyle.checks.annotation.PackageAnnotationCheck" />-->
    <!--        <module name="com.puppycrawl.tools.checkstyle.checks.annotation.AnnotationLocationCheck">-->
    <!--            <property name="allowSamelineSingleParameterlessAnnotation"-->
    <!--                value="false" />-->
    <!--        </module>-->

    <!--        &lt;!&ndash; Block Checks &ndash;&gt;-->
    <!--        <module name="com.puppycrawl.tools.checkstyle.checks.blocks.EmptyBlockCheck">-->
    <!--            <property name="option" value="text" />-->
    <!--        </module>-->
    <!--        <module name="com.puppycrawl.tools.checkstyle.checks.blocks.LeftCurlyCheck" />-->
    <!--        <module name="com.puppycrawl.tools.checkstyle.checks.blocks.RightCurlyCheck">-->
    <!--            <property name="option" value="alone" />-->
    <!--        </module>-->
    <!--        <module name="com.puppycrawl.tools.checkstyle.checks.blocks.NeedBracesCheck" />-->
    <!--        <module name="com.puppycrawl.tools.checkstyle.checks.blocks.AvoidNestedBlocksCheck" />-->

    <!--        &lt;!&ndash; Class Design &ndash;&gt;-->
    <!--        <module name="com.puppycrawl.tools.checkstyle.checks.design.FinalClassCheck" />-->
    <!--        <module name="com.puppycrawl.tools.checkstyle.checks.design.InterfaceIsTypeCheck" />-->
    <!--        <module name="com.puppycrawl.tools.checkstyle.checks.design.HideUtilityClassConstructorCheck" />-->
    <!--        <module name="com.puppycrawl.tools.checkstyle.checks.design.MutableExceptionCheck">-->
    <!--            <property name="format" value="^.*Exception$" />-->
    <!--        </module>-->
    <!--        <module name="com.puppycrawl.tools.checkstyle.checks.design.InnerTypeLastCheck" />-->
    <!--        <module name="com.puppycrawl.tools.checkstyle.checks.design.OneTopLevelClassCheck" />-->

    <!--        &lt;!&ndash; Type Names &ndash;&gt;-->
    <!--        <module name="TypeName">-->
    <!--            <property name="format" value="^[A-Z][a-zA-Z0-9_]*(?&lt;!com.clf.Test)$" />-->
    <!--            <property name="tokens" value="CLASS_DEF" />-->
    <!--            <message key="name.invalidPattern"-->
    <!--                value="Class name ''{0}'' must not end with ''com.clf.Test'' (checked pattern ''{1}'')." />-->
    <!--        </module>-->

    <!--        &lt;!&ndash; Coding &ndash;&gt;-->
    <!--        <module name="com.puppycrawl.tools.checkstyle.checks.coding.CovariantEqualsCheck" />-->
    <!--        <module name="com.puppycrawl.tools.checkstyle.checks.coding.EmptyStatementCheck" />-->
    <!--        <module name="com.puppycrawl.tools.checkstyle.checks.coding.EqualsHashCodeCheck" />-->
    <!--        <module name="com.puppycrawl.tools.checkstyle.checks.coding.SimplifyBooleanExpressionCheck" />-->
    <!--        <module name="com.puppycrawl.tools.checkstyle.checks.coding.SimplifyBooleanReturnCheck" />-->
    <!--        <module name="com.puppycrawl.tools.checkstyle.checks.coding.StringLiteralEqualityCheck" />-->
    <!--        <module name="com.puppycrawl.tools.checkstyle.checks.coding.NestedForDepthCheck">-->
    <!--            <property name="max" value="3" />-->
    <!--        </module>-->
    <!--        <module name="com.puppycrawl.tools.checkstyle.checks.coding.NestedIfDepthCheck">-->
    <!--            <property name="max" value="5" />-->
    <!--        </module>-->
    <!--        <module name="com.puppycrawl.tools.checkstyle.checks.coding.NestedTryDepthCheck">-->
    <!--            <property name="max" value="3" />-->
    <!--        </module>-->
    <!--        <module name="com.puppycrawl.tools.checkstyle.checks.coding.MultipleVariableDeclarationsCheck" />-->

    <!--        <module name="io.spring.javaformat.checkstyle.filter.RequiresOuterThisFilter" />-->
    <!--        <module name="io.spring.javaformat.checkstyle.filter.IdentCheckFilter">-->
    <!--            <property name="names" value="logger" />-->
    <!--            <module-->
    <!--                name="com.puppycrawl.tools.checkstyle.checks.coding.RequireThisCheck">-->
    <!--                <property name="checkMethods" value="false" />-->
    <!--                <property name="validateOnlyOverlapping" value="false" />-->
    <!--            </module>-->
    <!--        </module>-->
    <!--        <module name="io.spring.javaformat.checkstyle.check.SpringNoThisCheck">-->
    <!--            <property name="names" value="logger" />-->
    <!--        </module>-->
    <!--        <module name="com.puppycrawl.tools.checkstyle.checks.coding.OneStatementPerLineCheck" />-->

    <!--        &lt;!&ndash; Imports &ndash;&gt;-->
    <!--        <module name="com.puppycrawl.tools.checkstyle.checks.imports.AvoidStarImportCheck" />-->
    <!--        <module name="com.puppycrawl.tools.checkstyle.checks.imports.RedundantImportCheck" />-->
    <!--        <module name="com.puppycrawl.tools.checkstyle.checks.imports.UnusedImportsCheck">-->
    <!--            <property name="processJavadoc" value="true" />-->
    <!--        </module>-->
    <!--        <module name="com.puppycrawl.tools.checkstyle.checks.imports.ImportOrderCheck">-->
    <!--            <property name="groups" value="java,javax,*,org.springframework" />-->
    <!--            <property name="ordered" value="true" />-->
    <!--            <property name="separated" value="true" />-->
    <!--            <property name="option" value="bottom" />-->
    <!--            <property name="sortStaticImportsAlphabetically" value="true" />-->
    <!--        </module>-->
    <!--        <module name="com.puppycrawl.tools.checkstyle.checks.imports.IllegalImportCheck">-->
    <!--            <property name="id" value="bannedImports"/>-->
    <!--            <property name="regexp" value="true" />-->
    <!--            <property name="illegalClasses"-->
    <!--                value="^reactor\.core\.support\.Assert,^org\.slf4j\.LoggerFactory" />-->
    <!--        </module>-->
    <!--        <module name="com.puppycrawl.tools.checkstyle.checks.imports.IllegalImportCheck">-->
    <!--            <property name="id" value="bannedJUnit3Imports"/>-->
    <!--            <property name="regexp" value="true" />-->
    <!--            <property name="illegalClasses" value="^junit\.framework\..+" />-->
    <!--        </module>-->
    <!--        <module name="com.puppycrawl.tools.checkstyle.checks.imports.IllegalImportCheck">-->
    <!--            <property name="id" value="bannedJUnit4Imports"/>-->
    <!--            <property name="regexp" value="true" />-->
    <!--            <property name="illegalClasses"-->
    <!--                value="^org\.junit\.(com.clf.Test|BeforeClass|AfterClass|Before|After|Ignore|FixMethodOrder|Rule|ClassRule|Assert|Assume)$,^org\.junit\.(Assert|Assume)\..+,^org\.junit\.(experimental|internal|matchers|rules|runner|runners|validator)\..+" />-->
    <!--        </module>-->
    <!--        <module name="com.puppycrawl.tools.checkstyle.checks.imports.IllegalImportCheck">-->
    <!--            <property name="id" value="bannedJUnitJupiterImports"/>-->
    <!--            <property name="regexp" value="true" />-->
    <!--            <property name="illegalClasses" value="^org\.junit\.jupiter\..+" />-->
    <!--        </module>-->
    <!--        <module name="com.puppycrawl.tools.checkstyle.checks.imports.IllegalImportCheck">-->
    <!--            <property name="id" value="bannedTestNGImports"/>-->
    <!--            <property name="regexp" value="true" />-->
    <!--            <property name="illegalClasses" value="^org\.testng\..+," />-->
    <!--        </module>-->
    <!--        <module name="com.puppycrawl.tools.checkstyle.checks.imports.IllegalImportCheck">-->
    <!--            <property name="id" value="bannedHamcrestImports"/>-->
    <!--            <property name="regexp" value="true" />-->
    <!--            <property name="illegalClasses" value="^org\.hamcrest\..+" />-->
    <!--        </module>-->

    <!--        &lt;!&ndash; Javadoc Comments &ndash;&gt;-->
    <!--        <module name="com.puppycrawl.tools.checkstyle.checks.javadoc.JavadocTypeCheck">-->
    <!--            <property name="scope" value="package"/>-->
    <!--            <property name="authorFormat" value=".+\s.+"/>-->
    <!--        </module>-->
    <!--        <module name="com.puppycrawl.tools.checkstyle.checks.javadoc.JavadocMethodCheck">-->
    <!--            <property name="allowMissingParamTags" value="true"/>-->
    <!--            <property name="allowMissingThrowsTags" value="true"/>-->
    <!--            <property name="allowMissingReturnTag" value="true"/>-->
    <!--            <property name="allowMissingJavadoc" value="true"/>-->
    <!--        </module>-->
    <!--        <module name="com.puppycrawl.tools.checkstyle.checks.javadoc.JavadocVariableCheck">-->
    <!--            <property name="scope" value="public"/>-->
    <!--        </module>-->
    <!--        <module name="com.puppycrawl.tools.checkstyle.checks.javadoc.JavadocStyleCheck">-->
    <!--            <property name="checkEmptyJavadoc" value="true"/>-->
    <!--        </module>-->
    <!--        <module name="com.puppycrawl.tools.checkstyle.checks.javadoc.NonEmptyAtclauseDescriptionCheck" />-->
    <!--        <module name="com.puppycrawl.tools.checkstyle.checks.javadoc.JavadocTagContinuationIndentationCheck">-->
    <!--            <property name="offset" value="0"/>-->
    <!--        </module>-->
    <!--        <module name="com.puppycrawl.tools.checkstyle.checks.javadoc.AtclauseOrderCheck">-->
    <!--            <property name="target" value="CLASS_DEF, INTERFACE_DEF, ENUM_DEF"/>-->
    <!--            <property name="tagOrder" value="@author, @since, @param, @see, @version, @serial, @deprecated"/>-->
    <!--        </module>-->
    <!--        <module name="com.puppycrawl.tools.checkstyle.checks.javadoc.AtclauseOrderCheck">-->
    <!--            <property name="target" value="METHOD_DEF, CTOR_DEF, VARIABLE_DEF"/>-->
    <!--            <property name="tagOrder" value="@param, @return, @throws, @since, @deprecated, @see"/>-->
    <!--        </module>-->

    <!--        &lt;!&ndash; Miscellaneous &ndash;&gt;-->
    <!--        <module name="com.puppycrawl.tools.checkstyle.checks.indentation.CommentsIndentationCheck">-->
    <!--            <property name="tokens" value="BLOCK_COMMENT_BEGIN"/>-->
    <!--        </module>-->
    <!--        <module name="com.puppycrawl.tools.checkstyle.checks.UpperEllCheck" />-->
    <!--        <module name="com.puppycrawl.tools.checkstyle.checks.ArrayTypeStyleCheck" />-->
    <!--        <module name="com.puppycrawl.tools.checkstyle.checks.OuterTypeFilenameCheck" />-->

    <!--        &lt;!&ndash; Regexp &ndash;&gt;-->
    <!--        <module name="com.puppycrawl.tools.checkstyle.checks.regexp.RegexpSinglelineJavaCheck">-->
    <!--            <property name="format" value="^\t* +\t*\S" />-->
    <!--            <property name="message"-->
    <!--                value="Line has leading space characters; indentation should be performed with tabs only." />-->
    <!--            <property name="ignoreComments" value="true" />-->
    <!--        </module>-->
    <!--        <module name="com.puppycrawl.tools.checkstyle.checks.regexp.RegexpCheck">-->
    <!--            <property name="format" value="[ \t]+$" />-->
    <!--            <property name="illegalPattern" value="true" />-->
    <!--            <property name="message" value="Trailing whitespace" />-->
    <!--        </module>-->
    <!--        <module-->
    <!--            name="com.puppycrawl.tools.checkstyle.checks.regexp.RegexpSinglelineJavaCheck">-->
    <!--            <property name="maximum" value="0" />-->
    <!--            <property name="format"-->
    <!--                value="assertThatExceptionOfType\((NullPointerException|IllegalArgumentException|IOException|IllegalStateException)\.class\)" />-->
    <!--            <property name="message"-->
    <!--                value="Please use specialized AssertJ assertThat*Exception method." />-->
    <!--            <property name="ignoreComments" value="true" />-->
    <!--        </module>-->
    <!--        <module name="com.puppycrawl.tools.checkstyle.checks.regexp.RegexpSinglelineJavaCheck">-->
    <!--            <property name="id" value="bddMockito"/>-->
    <!--            <property name="maximum" value="0"/>-->
    <!--            <property name="format" value="org\.mockito\.Mockito\.(when|doThrow|doAnswer)" />-->
    <!--            <property name="message" value="Please use BDDMockito." />-->
    <!--            <property name="ignoreComments" value="true" />-->
    <!--        </module>-->
    <!--        <module name="com.puppycrawl.tools.checkstyle.checks.regexp.RegexpSinglelineJavaCheck">-->
    <!--            <property name="id" value="expectedExceptionAnnotation"/>-->
    <!--            <property name="maximum" value="0"/>-->
    <!--            <property name="format" value="\@com.clf.Test\(expected" />-->
    <!--            <property name="message" value="Please use AssertJ assertions." />-->
    <!--            <property name="ignoreComments" value="true" />-->
    <!--        </module>-->
    <!--        <module name="com.puppycrawl.tools.checkstyle.checks.regexp.RegexpSinglelineJavaCheck">-->
    <!--            <property name="id" value="junit4Assertions"/>-->
    <!--            <property name="maximum" value="0"/>-->
    <!--            <property name="format" value="org\.junit\.Assert\.assert" />-->
    <!--            <property name="message" value="Please use AssertJ assertions." />-->
    <!--            <property name="ignoreComments" value="true" />-->
    <!--        </module>-->
    <!--        <module name="com.puppycrawl.tools.checkstyle.checks.regexp.RegexpSinglelineJavaCheck">-->
    <!--            <property name="id" value="junitJupiterAssertions"/>-->
    <!--            <property name="maximum" value="0"/>-->
    <!--            <property name="format" value="org\.junit\.jupiter\.api\.Assertions\.assert" />-->
    <!--            <property name="message" value="Please use AssertJ assertions." />-->
    <!--            <property name="ignoreComments" value="true" />-->
    <!--        </module>-->
    <!--        <module name="com.puppycrawl.tools.checkstyle.checks.regexp.RegexpSinglelineJavaCheck">-->
    <!--            <property name="id" value="testNGAssertions"/>-->
    <!--            <property name="maximum" value="0"/>-->
    <!--            &lt;!&ndash; should cover org.testng.Assert and org.testng.AssertJUnit &ndash;&gt;-->
    <!--            <property name="format" value="org\.testng\.Assert(JUnit)?\.assert" />-->
    <!--            <property name="message" value="Please use AssertJ assertions." />-->
    <!--            <property name="ignoreComments" value="true" />-->
    <!--        </module>-->

    <!--        &lt;!&ndash; Spring Conventions &ndash;&gt;-->
    <!--        <module name="io.spring.javaformat.checkstyle.check.SpringLambdaCheck">-->
    <!--            <property name="singleArgumentParentheses" value="false" />-->
    <!--        </module>-->
    <!--        <module name="io.spring.javaformat.checkstyle.check.SpringCatchCheck" />-->
    <!--        <module name="io.spring.javaformat.checkstyle.check.SpringJavadocCheck" />-->
    <!--        <module name="io.spring.javaformat.checkstyle.check.SpringJUnit5Check" />-->
    <!--    </module>-->
</module>

去掉這些錯誤梢夯,錯誤就能解決言疗,再次運行Test類,結(jié)果如下:



表明源碼導(dǎo)入成功

導(dǎo)入源碼颂砸,有太多的坑噪奄,參考文章:
https://blog.csdn.net/m0_37959155/article/details/126273608
https://blog.csdn.net/qq_25825005/article/details/122518377

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市沾凄,隨后出現(xiàn)的幾起案子梗醇,更是在濱河造成了極大的恐慌,老刑警劉巖撒蟀,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件叙谨,死亡現(xiàn)場離奇詭異,居然都是意外死亡保屯,警方通過查閱死者的電腦和手機(jī)手负,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來姑尺,“玉大人竟终,你說我怎么就攤上這事∏畜” “怎么了统捶?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我喘鸟,道長匆绣,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任什黑,我火速辦了婚禮崎淳,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘愕把。我一直安慰自己拣凹,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布恨豁。 她就那樣靜靜地躺著嚣镜,像睡著了一般。 火紅的嫁衣襯著肌膚如雪圣絮。 梳的紋絲不亂的頭發(fā)上祈惶,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天,我揣著相機(jī)與錄音扮匠,去河邊找鬼。 笑死凡涩,一個胖子當(dāng)著我的面吹牛棒搜,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播活箕,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼力麸,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了育韩?” 一聲冷哼從身側(cè)響起克蚂,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎筋讨,沒想到半個月后埃叭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡悉罕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年赤屋,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片壁袄。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡类早,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出嗜逻,到底是詐尸還是另有隱情涩僻,我是刑警寧澤,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站逆日,受9級特大地震影響嵌巷,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜屏富,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一晴竞、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧狠半,春花似錦噩死、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至已日,卻和暖如春垛耳,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背飘千。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工堂鲜, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人护奈。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓缔莲,卻偏偏與公主長得像,于是被迫代替她去往敵國和親霉旗。 傳聞我的和親對象是個殘疾皇子痴奏,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,486評論 2 348

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