8丹诀、裝配Bean(spring筆記)

聲明:后面的章節(jié)是看了《Spring實(shí)戰(zhàn)》所做的筆記,相關(guān)內(nèi)容也是摘抄下來翁垂,這里只是自己做個記錄。

一硝桩、Spring配置的可選方案

Spring提供了三種主要的裝配機(jī)制:

  • XML中進(jìn)行顯示配置
  • Java中進(jìn)行顯示配置
  • 隱式的bean發(fā)現(xiàn)機(jī)制和自動裝配

建議是盡可能地使用自動配置的機(jī)制沿猜,顯示配置越少越好。當(dāng)必須要顯示配置的時候碗脊,推薦使用類型安全并且比XML更加強(qiáng)大的JavaConfig啼肩。只有當(dāng)想要使用便利的XML命名空間,并且在JavaConfig中沒有同樣的實(shí)現(xiàn)時衙伶,才應(yīng)該使用XML祈坠。

二、自動化裝配bean

Spring從兩個角度來實(shí)現(xiàn)自動化裝配:

  • 組件掃描:Spring會自動發(fā)現(xiàn)應(yīng)用上下文中所創(chuàng)建的bean
  • 自動裝配:Sping自動滿足bean之間的依賴

2.1 創(chuàng)建可被發(fā)現(xiàn)的bean

下面使用例子說明:
CompactDisc.java

package soundsystem;
//這是一個CD接口矢劲,表示CD
public interface CompactDisc {
  void play();
}

SgPeppers.java

package soundsystem;
import org.springframework.stereotype.Component;
//這是CD接口的一個實(shí)現(xiàn)類赦拘,其中包含CD名字和藝術(shù)家的名字
@Component
public class SgtPeppers implements CompactDisc {

  private String title = "Sgt. Pepper's Lonely Hearts Club Band";  
  private String artist = "The Beatles";
  
  public void play() {
    System.out.println("Playing " + title + " by " + artist);
  }
}

說明:@Component表示這個類是一個組件類,在裝配過程中要將其創(chuàng)建為一個bean芬沉。下面配置自動掃面:
CDPlayerConfig

package soundsystem;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@ComponentScan
public class CDPlayerConfig { 
}

說明:這里通過這個類定義了Spring裝配的規(guī)則躺同,其中@Configuration表明這是一個裝配規(guī)則,而雖然這里沒有顯示的聲明要裝配哪些bean丸逸,但是使用@ComponentScan就表示默認(rèn)掃面本包中的所有類蹋艺,如果發(fā)現(xiàn)某個類中配置了@Component注解,那么就將那些類裝配為bean黄刚。當(dāng)然也可以顯示注明掃面哪個包捎谨,下面先看使用XML的方式,之后會說明使用Java的方式:

<context:component-scan base-package="soundsystem" />

說明:<context:component-scan>元素還有一些屬性和子元素,這里不細(xì)說涛救,加入我們將之前的@ComponentScan去掉畏邢,而是使用上面的XML配置,那如何才能讓CDPlayerConfig知道呢州叠?這需要使用后面要講到的@Import注解棵红。下面看一個測試:

package soundsystem;
import static org.junit.Assert.*;
import ......

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes=CDPlayerConfig.class)
public class CDPlayerTest {
  
  @Autowired
  private CompactDisc cd;
  
  @Test
  public void cdShouldNotBeNull() {
    assertNotNull(cd);//斷言cd不為null
  }
}

說明:這里@RunWith(SpringJUnit4ClassRunner.class)表明讓Spring自動創(chuàng)建上下文。而@ContextConfiguration(classes=CDPlayerConfig.class)表明告訴此類要在CDPlayerConfig類中加載相關(guān)的配置咧栗,@Autowired表示自動注入實(shí)現(xiàn)了CompactDisc接口的實(shí)例逆甜。

2.1.1 為組件掃面的bean命名

在創(chuàng)建一個bean時,默認(rèn)使用組件類的類名為ID(但是將首字母小寫)致板,但是我們也可以自己顯示定義ID

@Component("longelyHeartsClub")
public class SgtPeppers implements CompactDisc {
......
}

說明:此時交煞,這個類在被創(chuàng)建為bean的時候的ID就為longelyHeartsClub

2.1.2 設(shè)置組件掃描的基礎(chǔ)包

之前我們沒有為@ComponentScan配置任何參數(shù)斟或,于是其默認(rèn)掃描的是類的包素征,同時也可以使用XML方式顯示的指明要掃描的包,下面我們?yōu)槠渑渲孟嚓P(guān)的屬性:

@Configuration
@ComponentScan("soundsystem")
public class CSPlayerConfig(){}

說明:這里就是配置了一個自動掃面的基礎(chǔ)包萝挤,當(dāng)然我們可以更清晰的指明這是一個掃描基礎(chǔ)包:

@ComponentScan(basePackeges="soundsystem")

說明:當(dāng)然這里也可以同時指定多個掃描的基礎(chǔ)包:

@ComponentScan(basePackeges={"soundsystem","vedio"})

說明:但是這里使用字符串的方式不夠安全御毅,我們推薦類的方式,就是將其指定為包中所含類或接口:

@ComponentScan(basePackegeClasses={CDPlayer.class, DVDPlayer.class})

說明:此時在掃描的時候就會掃描這兩個類或接口所在包的所有類和接口怜珍。即這些類或接口所在的包將被指定為掃描基礎(chǔ)包端蛆。我們還可以考慮在包中創(chuàng)建一個用來進(jìn)行掃描的空標(biāo)記接口,這樣不會影響業(yè)務(wù)類今后的重構(gòu)工作酥泛。

2.2.3 通過為bean添加注解實(shí)現(xiàn)自動裝配

有些組件類在被創(chuàng)建為bean的過程中可能依賴其他的bean今豆,可以通過注解的方式讓Spring自動幫我們注入進(jìn)來:

package soundsystem;
public interface MediaPlayer {
  void play();
}
package soundsystem;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class CDPlayer implements MediaPlayer {
  private CompactDisc cd;

  @Autowired
  public CDPlayer(CompactDisc cd) {
    this.cd = cd;
  }

  public void play() {
    cd.play();
  }
}

說明:這里CDPlayer類在被創(chuàng)建為bean時依賴一個CompactDisc的實(shí)現(xiàn)類,于是使用@Autowired將這個bean注入進(jìn)來柔袁。如果沒有匹配的bean或者有多個匹配的bean呆躲,將會產(chǎn)生異常。

三捶索、通過Java代碼裝配bean

前面說的是一種自動裝配和自動注入的方式插掂,但是有時候是沒辦法使用這種自動方式的,比如向?qū)⒌谌綆熘械慕M件裝配到你的應(yīng)用中腥例。此時必須使用顯示的方式燥筷,即JavaXML配置方式。而對于Java方式配置bean則可以直接在CDPlayerConfig.java中配置院崇,而對于XML方式的bean肆氓,可以使用@Import引用。

3.1 創(chuàng)建配置類

首先修改之前的配置類底瓣,讓其不要自動掃描裝配了:

package soundsystem;
@Configuration
public class CDPlayerConfig { 
}

說明:此時沒有配置@ComponentScan則就不會自動創(chuàng)建相關(guān)的bean了谢揪。

3.2 聲明簡單的bean

要在JavaConfig中聲明bean蕉陋,我們需要編寫一個方法,這個方法創(chuàng)建所需類型的實(shí)例拨扶,然后給這個方法添加@Bean注解:

@Bean
public CompactDisc sgtPeppers(){
  return new SgtPeppers();
}

說明:這里注解會告訴Spring這個方法會返回一個對象凳鬓,該對象要注冊為Spring易用上下文中的bean。默認(rèn)的ID和帶有@Bean注解的方法名一樣患民,當(dāng)然也可以自己指定:

@Bean(name="lonelyHeartsClubBand")

3.3 借助JavaConfig實(shí)現(xiàn)注入

有些bean的創(chuàng)建可能依賴于其他bean的創(chuàng)建缩举,我們需要將多個bean裝配在一起,在JavaConfig中裝配bean的最簡單的方式就是引用創(chuàng)建bean的方法匹颤,如:

@Bean
public CDPlayer cdPlayer() {
  return new CDPlayer(sgtPeppers());
}

說明:這里可以看到CDPlayer bean的創(chuàng)建依賴于CompactDisc bean仅孩,于是我們調(diào)用了能夠產(chǎn)生CompactDisc bean的方法。但是這里注意印蓖,看起來辽慕,CompactDisc是通過sgtPeppers()得到的,但是并不是如此赦肃,因?yàn)檫@個方法上添加了@Bean注解溅蛉,Spring會攔截所有對它的實(shí)際調(diào)用,確保直接返回該方法所創(chuàng)建的bean他宛,比如此時還有另一個bean的創(chuàng)建依賴CompactDisc bean

@Bean
public CDPlayer anotherCDPlayer() {
  return new CDPlayer(sgtPeppers());
}

說明:如果每次創(chuàng)建bean都是實(shí)際調(diào)用sgtPeppers()方法船侧,那么每個bean都擁有自己特有的CompactDisc bean厅各,但其實(shí)不是镜撩,默認(rèn)情況下讯检,Spring中的bean都是單例的顾翼。當(dāng)然還有一種更為簡單的方式:

@Bean
public CDPlayer cdPlayer(CompactDisc compactDisc){
  return new CDPlayer(compactDisc);
}

說明:這種方式可能更容易理解,這里不用明確引用CompactDisc@Bean方法拜姿,通過這種方式引用其他的bean通常是最佳的選擇烙样。此時,不管CompactDisc是采用什么方式創(chuàng)建出來的蕊肥,Spring都會將其傳入到配置方法中谒获,并用來創(chuàng)建CDPlayer bean。這里我們使用的是CDPlayer的構(gòu)造器實(shí)現(xiàn)了DI功能,但是還有其他方式可以實(shí)現(xiàn)批狱,比如通過Setter方式:

@Bean
public CDPlayer cdPlayer(CompactDisc compactDisc){
  CDPlayer cdPlayer = new CDPlayer(compactDisc);
  cdPlayer.setCompactDisc(compactDisc);//這里實(shí)現(xiàn)了DI功能
  return cdPlayer;
}

說明:我們可以采用任何必要的Java功能來產(chǎn)生bean實(shí)例裸准,僅僅收到Java語言的限制。

四赔硫、通過XML裝配bean

4.1 聲明一個簡單的<bean>

這里我們需要添加一個<bean>元素炒俱,其類似于JavaConfig中的@Bean

<bean class="soundsystem.SgtPeppers" />

說明:這里聲明了一個簡單的bean,創(chuàng)建這個bean的類通過class屬性來指定爪膊,并且要使用全限定的類型权悟。而這里沒有明確指定ID,所以這個bean將會根據(jù)全限定類名來進(jìn)行命名惊完,這里即為"soundsystem.SgtPeppers#0"僵芹,其中"#0"是一個計(jì)數(shù)的形式,用來區(qū)分相同類型的其他bean小槐,如果另外聲明一個SgtPeppers拇派,并且沒有明確指定ID,那么其ID即為"soundsystem.SgtPeppers#1"凿跳。

4.2 借助構(gòu)造器注入初始化bean

XML中聲明DI時件豌,會有多種可選的配置方案和風(fēng)格,具體到構(gòu)造器注入控嗜,有兩種基本的配置方案:

  • <constructor-age>元素
  • 使用spring3.0所引入的c-命名空間

4.2.1 構(gòu)造器注入bean引用

之前我們已經(jīng)聲明了一個SgtPeppersbean茧彤,并且這個類實(shí)現(xiàn)了CompactDisc接口,所以實(shí)際上我們已經(jīng)有了一個可以注入到CDPlayer bean中的bean疆栏,所以現(xiàn)在要做的就是通過DI引用SgtPeppers

<bean id="cdPlayer" class="soundsystem.CDPlayer">
  <constructor-age ref="compactDisc"/>
</bean>

說明:spring會創(chuàng)建一個CDPlayer實(shí)例曾掂,同時 <constructor-age>會告知spring要將一個IDcompactDiscbean引用傳遞到CDPlayer的構(gòu)造器中。
當(dāng)然作為替代方案壁顶,可以使用c-命名空間珠洗,只是需要在XML配置的頂部聲明其模式:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"

    xmlns:c="http://www.springframework.org/schema/c" 
    
    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">
    
    ......
</beans>

說明:于是可以將之前的配置方法改為如下:

<bean id="cdPlayer" class="soundsystem.CDPlayer" c:cd-ref="compactDisc" />

說明:屬性名以"c-"開頭,也就是命名空間的前綴若专。接下來就是要裝配的構(gòu)造器參數(shù)名许蓖,在此之后是"-ref",它會告訴spring调衰,正在裝配的是一個bean的引用膊爪,這個bean名字是comapactDisc,而不是字面量"comapactDisc"嚎莉。
注意:這里的"cd"是構(gòu)造器參數(shù)名米酬,但是直接使用參數(shù)名可能不太好,我們也可以這樣:

<bean id="cdPlayer" class="soundsystem.CDPlayer" c:_0-ref="compactDisc" />

說明:這里使用數(shù)字表示構(gòu)造器參數(shù)的位置趋箩,也就是第幾個參數(shù)淮逻,由于在XML中不允許數(shù)字作為屬性的第一個字符琼懊,所以在前面加了一個下劃線。當(dāng)然如果只有一個構(gòu)造器參數(shù)爬早,可以將數(shù)字拿掉也可以哼丈。

<bean id="cdPlayer" class="soundsystem.CDPlayer" c:_-ref="compactDisc" />

4.2.2 將字面量注入到構(gòu)造器中

這里先給出一個CompactDisc的新實(shí)例:

package soundsystem.properties;
import soundsystem.CompactDisc;

public class BlankDisc implements CompactDisc {

  private String title;
  private String artist;

  public BlankDisc (String title,String artist) {
    this.artist = artist;
    this.title = title;
  }

  public void play() {
    System.out.println("Playing " + title + " by " + artist);
  }
}

說明:在之前的SgtPeppers類中,唱片名稱和藝術(shù)家的名字都是硬編碼的筛严,這里我們讓其更加靈活:

<bean id="compactDisc" class="soundsystem.BlankDisc">
  <constructor-arg value="Sgt.Peppers's Lonely Hearts Club Band"/>
  <constructor-arg value="The Beatles"/>
</bean>

說明:這里使用value屬性醉旦,就是表示給定的值要以字面量的行駛證注入到構(gòu)造器中。如果要使用"c-"命名空間桨啃,則配置如下:

<bean id="compactDisc" class="soundsystem.BlankDisc"
  c:_title="Sgt.Peppers's Lonely Hearts Club Band"
  c:_artist="The Beatles"/>

當(dāng)然亦可以這樣:

<bean id="compactDisc" class="soundsystem.BlankDisc"
  c:_0="Sgt.Peppers's Lonely Hearts Club Band"
  c:_1="The Beatles"/>

4.2.3 裝配集合

這里先將上面的BlankDisc類改動:

package soundsystem.properties;
import java.util.List;
import soundsystem.CompactDisc;

public class BlankDisc implements CompactDisc {

  private String title;
  private String artist;
  private List<String> tracks;

  public BlankDisc (String title,String artist,List<String> tracks) {
    this.artist = artist;
    this.title = title;
    this.tracks= tracks;
  }

  public void play() {
    System.out.println("Playing " + title + " by " + artist);
    for (String track : tracks) {
      System.out.println("-Track: " + track);
    }
  }
}

說明:這里增加了一個磁道集合屬性车胡,這個屬性在配置時必須配置,如果沒有具體的值傳遞照瘾,可以配置為null匈棘,但是這在調(diào)用play()方法時會拋出空指針異常,于是我們需要配置一個List列表:

<bean id="compactDisc" class="soundsystem.BlankDisc">
  <constructor-arg value="Sgt.Peppers's Lonely Hearts Club Band"/>
  <constructor-arg value="The Beatles"/>
  <constructor-arg>
  <list>
    <value>Sgt. Pepper's Lonely Hearts Club Band</value>
    <value>With a Little...</value>
    <value>Getting Better</value>
    ...
  </list>
  </constructor-arg>
</bean>

說明:當(dāng)然集合列表也可以配置為bean引用:

<bean id="compactDisc" class="soundsystem.BlankDisc">
  <constructor-arg value="Sgt.Peppers's Lonely Hearts Club Band"/>
  <constructor-arg value="The Beatles"/>
  <constructor-arg>
  <list>
    <ref bean="sgtPeppers"/>
    <ref bean="whiteAlbum"/>
    <ref bean="revolver"/>
    ...
  </list>
  </constructor-arg>
</bean>

說明:也可以使用Set集合析命。而目前使用c-命名空間的屬性無法實(shí)現(xiàn)裝配集合的功能主卫。

4.3 設(shè)置屬性

在之前的注入中都是使用構(gòu)造器注入的,沒有使用Setter方法鹃愤,這里看看如何使用XML配置實(shí)現(xiàn)屬性注入:

package soundsystem;
import org.springframework.beans.factory.annotation.Autowired;
public class CDPlayer implements MediaPlayer {
  private CompactDisc cd;

  @Autowired
  public CDPlayer(CompactDisc cd) {
    this.cd = cd;
  }

  public void play() {
    cd.play();
  }
}

說明:可能我們會覺得即使沒有將CompactDisc裝入進(jìn)來簇搅,CDPlayer依然還能具備一些有限的功能,但是在測試相關(guān)功能時可能會出現(xiàn)空指針異常软吐,使用XML配置實(shí)現(xiàn)屬性配置的方式如下:

<bean id="cdPlayer" class="soundsystem.cdPlayer">
  <property name="compactDisc" ref="compactDisc"/>
</bean>

說明:<property> 元素為屬性的Setter 方法所提供的功能與<constructor-arg> 元素為構(gòu)造器提供的功能是一樣的瘩将。使用命名空間的方式為:

<bean id="cdPlayer" class="soundsystem.cdPlayer"
  p:compactDisc-ref="compactDisc"/>

說明:當(dāng)然和之前一樣,也要在配置文件頭部加上:

xmlns:p="http://www.springframework.org/schema/p"

相關(guān)內(nèi)容和之前的c- 命名空間類似凹耙。

4.3.1 將字面量注入到屬性中

相關(guān)配置基本上和c-命名空間一致姿现,這里不再細(xì)說。雖然也不能使用p-命名空間來裝配集合肖抱,但是可以使用spring util-命名空間中的一些功能類簡化BlankDisc bean备典,首先在配置文件頭部加上:

xmlns:util="http://www.springframework.org/schema/util"

說明:util-命名空間所提供的功能之一就是<util:list>元素,它會創(chuàng)建一個列表bean虐沥。如下:

  <util:list id="trackList">
    <value>Sgt. Pepper's Lonely Hearts Club Band</value>
    <value>With a Little...</value>
    <value>Getting Better</value>
    ...
  </util:list>

于是我們就可以使用p-命名空間簡化屬性配置了:

<bean id="compactDisc" class="soundsystem.BlankDisc"
  p:title="Sgt.Peppers's Lonely Hearts Club Band"
  p:artist="The Beatles"
  p:tracks-ref="trackList"/>

說明:util-命名空間中還有很多其他元素:

元素 描述
<util:constant> 引用某個類型的public static域熊经,并將其暴露為bean
<util:list> 創(chuàng)建一個java.util.List類型的bean泽艘,其中包含值或引用
<util:map> 創(chuàng)建一個java.util.Map類型的bean欲险,其中包含值或引用
<util:properties> 創(chuàng)建一個java.util.Properties類型的bean
<util:property-path> 引用一個bean屬性(或內(nèi)嵌屬性),并將其暴露為bean
<util:set> 創(chuàng)建一個java.util.Set類型的bean匹涮,其中包含值或引用

五天试、導(dǎo)入和混合配置

5.1 在JavaConfig中引用XML配置

現(xiàn)在假設(shè)CDPlayerConfig已經(jīng)變得很復(fù)雜,需要將其拆分為多個配置:

package soundsystem;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class CDConfig {
    
    @Bean
    public CompactDisc compactDisc(){
        return new SgtPeppers();
    }
}

說明:此時compactDisc()方法已經(jīng)從CDPlayerConfig中移除掉了然低,這里需要將兩個配置組合在一起:

package soundsystem;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;

@Configuration
@Import(CDConfig.class)
public class CDPlayerConfig {
  
  @Bean
  public CDPlayer cdPlayer() {
    return new CDPlayer(compactDisc());
  }
}

這樣便使用@Import將兩個配置組合在了一起喜每,當(dāng)然更好的方法是創(chuàng)建一個更高級別的SoundSystemConfig务唐,在其中將兩個配置組合在一起:

package soundsystem;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;

@Configuration
@Import(CDPlayerConfig.class, CDConfig.class)
public class SoundSystemConfig{
}

說明:如果此時BlankDisc配置在了XML中(cd-config.xml),如何讓spring同時加載它和其他基于Java的配置呢带兜?如下:

@Configuration
@Import(CDPlayerConfig.class)
@ImportResource("classpath:cd-config.xml")
public class SoundSystemConfig{
}

5.2 在XMl中配置引用JavaConfig

XML導(dǎo)入XML配置如下:

<import resource="cd-config.xml">

XML中導(dǎo)入JavaConfig配置如下:

<bean class="soundsystem.CDConfig">
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末枫笛,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子刚照,更是在濱河造成了極大的恐慌刑巧,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,820評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件无畔,死亡現(xiàn)場離奇詭異啊楚,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)浑彰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評論 3 399
  • 文/潘曉璐 我一進(jìn)店門恭理,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人郭变,你說我怎么就攤上這事颜价。” “怎么了饵较?”我有些...
    開封第一講書人閱讀 168,324評論 0 360
  • 文/不壞的土叔 我叫張陵拍嵌,是天一觀的道長。 經(jīng)常有香客問我循诉,道長横辆,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,714評論 1 297
  • 正文 為了忘掉前任茄猫,我火速辦了婚禮狈蚤,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘划纽。我一直安慰自己脆侮,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,724評論 6 397
  • 文/花漫 我一把揭開白布勇劣。 她就那樣靜靜地躺著靖避,像睡著了一般。 火紅的嫁衣襯著肌膚如雪比默。 梳的紋絲不亂的頭發(fā)上幻捏,一...
    開封第一講書人閱讀 52,328評論 1 310
  • 那天,我揣著相機(jī)與錄音命咐,去河邊找鬼篡九。 笑死,一個胖子當(dāng)著我的面吹牛醋奠,可吹牛的內(nèi)容都是我干的榛臼。 我是一名探鬼主播伊佃,決...
    沈念sama閱讀 40,897評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼沛善!你這毒婦竟也來了航揉?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,804評論 0 276
  • 序言:老撾萬榮一對情侶失蹤金刁,失蹤者是張志新(化名)和其女友劉穎迷捧,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體胀葱,經(jīng)...
    沈念sama閱讀 46,345評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡漠秋,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,431評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了抵屿。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片庆锦。...
    茶點(diǎn)故事閱讀 40,561評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖轧葛,靈堂內(nèi)的尸體忽然破棺而出搂抒,到底是詐尸還是另有隱情,我是刑警寧澤尿扯,帶...
    沈念sama閱讀 36,238評論 5 350
  • 正文 年R本政府宣布求晶,位于F島的核電站,受9級特大地震影響衷笋,放射性物質(zhì)發(fā)生泄漏芳杏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,928評論 3 334
  • 文/蒙蒙 一辟宗、第九天 我趴在偏房一處隱蔽的房頂上張望爵赵。 院中可真熱鬧,春花似錦泊脐、人聲如沸空幻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽秕铛。三九已至,卻和暖如春缩挑,著一層夾襖步出監(jiān)牢的瞬間但两,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評論 1 272
  • 我被黑心中介騙來泰國打工调煎, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留镜遣,地道東北人己肮。 一個月前我還...
    沈念sama閱讀 48,983評論 3 376
  • 正文 我出身青樓士袄,卻偏偏與公主長得像悲关,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子娄柳,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,573評論 2 359

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