SpringMVC

SpringMVC原理分析

Spring Boot學習

5娩梨、Hello World探究

1、POM文件

1、父項目

org.springframework.boot

spring-boot-starter-parent

2.0.2.RELEASE

?

他的父項目是:

org.springframework.boot

spring-boot-dependencies

2.0.2.RELEASE

../../spring-boot-dependencies

他才真正的管理springboot應用的所有依賴版本晴楔。

Spring Boot的版本仲裁中心:

以后我們導入依賴,默認不需要寫版本(沒有在dependencies里面的依賴需要我們手動寫上版本)峭咒;

2税弃、啟動器

org.springframework.boot

spring-boot-starter-web

spring-boot-starter-web

spring-boot-starter:spring-boot場景啟動器愈案;幫我們導入了web模塊正常運行所依賴的組件逆屡;

Spring Boot將所有的功能場景都抽取出來卖词,做成一個個starters(啟動器)拆火,只要在項目里面引入這些starter相關場景的所有依賴都會導入進來牡整。要用什么功能每辟,就導入什么場景的啟動器岩四。

2礼殊、主程序類才菠,主入口類

/**

* @author Alan

* @date 2018/5/12 16:11

* @SpringBootApplication 來標注一個主程序類茸时,說明這是一個Spring Boot應用

*/

@SpringBootApplication

publicclassHelloWorldApplication{

publicstaticvoidmain(String[]args) {

//spring應用啟動起來

SpringApplication.run(HelloWorldApplication.class,args);

?? }

}

@SpringBootApplication: Spring Boot應用標注在某個類上說明這個類是Spring Boot的主配置類,Spring Boot就應該運行這個類的main方法來啟動Spring Boot應用赋访。

@Target({ElementType.TYPE})

@Retention(RetentionPolicy.RUNTIME)

@Documented

@Inherited

@SpringBootConfiguration

@EnableAutoConfiguration

@ComponentScan(

excludeFilters={@Filter(

type=FilterType.CUSTOM,

classes={TypeExcludeFilter.class}

),@Filter(

type=FilterType.CUSTOM,

classes={AutoConfigurationExcludeFilter.class}

)}

)

public@interfaceSpringBootApplication{

@SpringBootConfiguration:Spring Boot的配置類

? 標注在某個類上可都,表示 這是一個Spring Boot的配置類;

? @Configuration:配置類上來標注這個注解蚓耽;

? 配置類----配置文件渠牲;配置類也是一個組件:@Component

@EnableAutoConfiguration:開啟自動配置功能;

? 以前我們需要配置的東西步悠,Spring Boot幫我們自動配置签杈;@EnableAutoConfiguration告訴Spring開啟自動配置功能,這樣自動配置才能生效鼎兽;

@AutoConfigurationPackage

@Import({AutoConfigurationImportSelector.class})

public@interfaceEnableAutoConfiguration{

? @AutoConfigurationPackage:自動配置包答姥;

? @Import({Registrar.class}):

? Spring底層注釋@Import,給容器中導入一個組件谚咬;導入的組件由AutoConfigurationImportSelector.class指定鹦付。

? 將主配置類(@SpringBootApplication標注的類)的所在包及下面的所有組件掃描到Spring容器;

? @Import({Registrar.class}):

? 給容器中導入組件择卦?

? AutoConfigurationImportSelector.class:導入哪些組件的選擇器

? 將所有需要的組件以全類名的方式返回敲长;這些組件就會被添加到容器中郎嫁;

? 會給容器中導入非常多的自動配置類(xxxAutoConfiguration);就是給容器中導入這個場景需要的所有組件祈噪,并配置好這些組件行剂;

有了自動配置類,免去了我們手動編寫配置注入功能組件等工作钳降;

? SpringFactoriesLoader.loadFactoryNames(EnableAutoConfiguration.class,class Loader)

? Spring Boot在啟動的時候,從類路徑 META-INFO/spring.facotries中獲取EnableAutoConfiguration指定的值腌巾;將這些值作為自動配置類導入到容器中遂填,自動配置類就生效了,幫我們自動配置工作澈蝙;

我們點一個webmvc進去吓坚,如下:

以前我們需要配置的東西都幫我們自動配置了,J2EE的整體整合解決方案和自動配置都在:

C:\Users\Alan.m2\repository\org\springframework\boot\spring-boot-autoconfigure\2.0.2.RELEASE\spring-boot-autoconfigure-2.0.2.RELEASE.jar

6灯荧、使用Spring Initializer快速創(chuàng)建Spring Boot項目

IDE都 支持使用Spring的創(chuàng)建向導快速創(chuàng)建一個Spring Boot項目礁击;

選擇我們需要的模塊,向導會聯(lián)網(wǎng)創(chuàng)建Spring Boot項目逗载;

默認生成的Spring Boot項目:

主程序已經(jīng)生成好了

resources文件夾目錄結構

static: 保存所有的靜態(tài)資源哆窿;js、css厉斟、images挚躯;

templates:保存所有的模板頁面:(Spring Boot默認jar包使用嵌入式的Tomcat,默認不支持JSP頁面)擦秽;可以使用模板引擎(thymeleaf码荔、freemarker);

applications.properties:Spring Boot應用的配置文件感挥;可以修改一些默認配置缩搅;

二、配置文件

1触幼、配置文件

Spring Boot使用一個全局的配置文件硼瓣,配置文件名是固定的:

application.properties

application.yml

配置文件的作用:修改Spring Boot自動配置的默認值;

Spring Boot在底層都給我們自動配置好了置谦;

YAML(YAML Ain't Markup Language)

? YAML A Markup Language:是一個標記語言巨双;

? YAML isn't Markup Language:不是一個標記語言;

標記語言:

? 以前的配置文件霉祸,大多是xxx.xml文件筑累;

? YAML:以數(shù)據(jù)為中心,比json丝蹭、xml更適合做配置文件慢宗;

YAML配置例子:

server:

? port: 8080

XML配置例子:

? ? 8080

2、YAML語法

1、基本語法

k:(空格)v :表示一對鍵值對(空格必須有)

以空格的縮進來控制層級關系镜沽;只要是左對齊的一列數(shù)據(jù)敏晤,都表示同一層級;

server:

? ? port: 8080

? ? path: /hello

屬性和值也是大小寫敏感的缅茉;

2嘴脾、值的寫法

字面量:普通的值(數(shù)字、字符串蔬墩、布爾)

? k: v :字面直接來寫译打;

? 字符串默認不用加上雙引號和單引號;

? “”:雙引號拇颅,不會轉義字符串里面的特殊字符奏司,特殊字符會作為本身想表示的意思

? name: "zhangsan \n lisi":輸出zhangsan 換行 lisi

? ’‘:單引號:會轉義特殊字符,特殊字符最終只是一個普通字符串數(shù)據(jù)

? name: 'zhangsan \n lisi':輸出zhangsan \n lisi

對象樟插、Map(屬性和值)(鍵值對):

? k: v:在下一行寫對象的屬性和值的關系韵洋,注意縮進;

? 對象還是k: v格式

friends:

? ? lastName: zhangsan

? ? age: 20

行內寫法:

friends: {lastName: zhangsan,age: 20}

數(shù)組(List黄锤、Set):

用- 值表示數(shù)組中的一個元素

pets:

- cat

- dog

- monkey

行內寫法:

pets: [cat,dog,monkey]

3搪缨、配置文件值注入

配置文件:

person:

? lastName: zhangsan

? age: 18

? boss: false

? birthday: 2017/12/12

? maps: {k1: v1,k2: v2}

? lists:

? - lisi

? - zhaoliu

? dog:

?? name: 小狗

?? age: 2

JavaBean:

/**

* @author Alan

* @date 2018/5/12 21:01

* 將配置文件中的每一個屬性值,映射到這個組件中

* @ConfigurationProperties:告訴SpringBoot將本類的所有屬性和配置文件中相關的配置綁定

* ? ?? prefix = "person" 配置文件中的哪個屬性進行一一映射

* 只有這個組件是容器中的組件鸵熟,才能使用容器提供的@ConfigurationProperties功能

*/

@Component

@ConfigurationProperties(prefix="person")

publicclassPerson{

privateStringlastName;

privateIntegerage;

privateBooleanboss;

privateDatebirthday;

?

privateMapmaps;

privateListlists;

privateDogdog;

我們可以導入導入配置文件處理器勉吻,以后編寫配置就有提示了:


? ? ? ?

? ? ? ? ? ? org.springframework.boot

? ? ? ? ? ? spring-boot-configuration-processor

? ? ? ? ? ? true


單元測試例子:

packagecom.example.demo;

?

importcom.example.demo.bean.Person;

importorg.junit.Test;

importorg.junit.runner.RunWith;

importorg.springframework.beans.factory.annotation.Autowired;

importorg.springframework.boot.test.context.SpringBootTest;

importorg.springframework.test.context.junit4.SpringRunner;

?

/**

* SpringBoot單元測試

* 可以在測試期間很方便的類似編碼一樣進行自動注入

*/

@RunWith(SpringRunner.class)

@SpringBootTest

publicclassDemoApplicationTests{

? ? @Autowired

? ? Personperson;

?

? ? @Test

? ? publicvoidcontextLoads() {

? ? ? ? System.out.println(person);

? ? }

?

}

?

1、properties文件在idea中默認utf-8可能會亂碼

結果發(fā)現(xiàn)中文亂碼旅赢,需要進行設置:勾選Transparent native-to-ascii conversion齿桃,轉出ascii碼

這樣就不會亂碼了:

2、@Value與@ConfigurationProperties獲取值比較

@ConfigurationProperties@Value

功能批量注入配置文件中的屬性一個一個指定

松散綁定(松散語法)支持不支持

SpEL不支持支持

JSR303數(shù)據(jù)校驗支持不支持

復雜類型封裝支持不支持

配置文件yml還是properties他們都能獲取到值煮盼;

如果說短纵,我們只是在業(yè)務邏輯中要獲取一下配置文件中的某項值,使用@Value僵控;

如果說香到,我們編寫了一個JavaBean和配置文件進行映射,我們就直接使用@ConfigurationProperties;

3报破、配置文件注入值數(shù)據(jù)校驗

@Component

@ConfigurationProperties(prefix="person")

@Validated

publicclassPerson{

//lastName必須是郵箱格式,default message [不是一個合法的電子郵件地址]

@Email

//@Value("${person.last-name}")

privateStringlastName;

privateIntegerage;

4悠就、@PropertySource與@ImportResource

@PropertySource:加載指定的配置文件

/**

* @author Alan

* @date 2018/5/12 21:01

* 將配置文件中的每一個屬性值,映射到這個組件中

* @ConfigurationProperties:告訴SpringBoot將本類的所有屬性和配置文件中相關的配置綁定

* ? ?? prefix = "person" 配置文件中的哪個屬性進行一一映射

* 只有這個組件是容器中的組件充易,才能使用容器提供的@ConfigurationProperties功能

* @ConfigurationProperties(prefix = "person")默認從全局配置文件中獲取值

*/

@PropertySource(value="classpath:person.properties")

@Component

@ConfigurationProperties(prefix="person")

//@Validated

publicclassPerson{

//lastName必須是郵箱格式,default message [不是一個合法的電子郵件地址]

//@Email

//@Value("${person.last-name}")

privateStringlastName;

privateIntegerage;

privateBooleanboss;

privateDatebirthday;

?

privateMapmaps;

privateListlists;

privateDogdog;

@ImportResource:導入Spring的配置文件梗脾,讓配置文件里面的內容生效

Spring Boot里面沒有Spring的配置文件,我們自己編寫的配置文件盹靴,也不能自動識別炸茧;

想讓Spring的配置文件生效瑞妇,加載進來,@ImportResource標注在一個配置類上梭冠;

beans.xml:


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">

SpringBootApplication類:

//導入Spring的配置文件辕狰,使其生效

@ImportResource(locations={"classpath:beans.xml"})

@SpringBootApplication

publicclassDemoApplication{

?

? ? publicstaticvoidmain(String[]args) {

? ? ? ? SpringApplication.run(DemoApplication.class,args);

? ? }

}

test類:

@RunWith(SpringRunner.class)

@SpringBootTest

publicclassDemoApplicationTests{

? ? @Autowired

? ? Personperson;

?

? ? @Autowired

? ? ApplicationContextioc;

?

? ? @Test

? ? publicvoidhelloservice(){

? ? ? ? Booleanb=ioc.containsBean("helloservice");

? ? ? ? System.out.println(b);

? ? }

單元測試結果:

不來編寫Spring的配置文件:


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">

Spring Boot推薦的給容器中添加組件的方式:推薦使用全注解的方式

1、配置類======Spring配置文件

2控漠、使用@Bean給容器中添加組件

/**

* @author Alan

* @date 2018/5/12 22:30

* @Configuration:指明當前類是一個配置文件蔓倍,就是來替代之前的Spring配置文件

* 配置文件使用標簽添加組件

*/

@Configuration

publicclassMyAppConfig{

//將方法的返回值添加到容器中,容器中這個組件默認的id就是方法名

@Bean

publicHelloServicehelloService(){

System.out.println("@Bean給容器添加組件了...");

returnnewHelloService();

?? }

}

4盐捷、配置文件占位符

1偶翅、隨機數(shù)

${random.value}、${random.int}毙驯、${random.long}

${random.int(10)}、${random.int[1024,65536]}

2灾测、占位符獲取之前配置的值爆价,如果沒有可以使用:指定默認值

person.last-name=張三${random.uuid}

person.age=${random.int}

person.boss=true

person.birthday=2019/02/03

person.maps.k1=v1

person.maps.k2=v2

person.lists=a,b,c

person.dog.name=${person.hello:hello}小狗

person.dog.age=2

5、Profile

1媳搪、多profile文件

我們在主配置文件編寫的時候铭段,文件名可以是application-{profile}.properties/yml

默認使用application.properties

2、yml支持多文檔塊方式

server:

? port: 8080

spring:

? profiles:

?? active: prod

---

server:

? port: 8083

spring:

? profiles: dev

---

server:

? port: 8084

spring:

? profiles: prod#指定屬于哪個環(huán)境

3秦爆、激活指定profile

? 1序愚、在配置文件中指定spring.profiles.active=dev

? 2、命令行:

? java -jar demo-0.0.1-SNAPSHOT.jar --spring.profiles.active=dev

? 可以直接在測試的時候等限,配置傳入命令行參數(shù)

?

利用idea的maven插件進行打包(雙擊package)

之后target目錄下會生成jar文件爸吮,target右鍵-show in explorer,然后地址欄輸入cmd望门,這樣就進入了target目錄形娇,然后輸入如下命令:java -jar demo-0.0.1-SNAPSHOT.jar --spring.profiles.active=dev

端口就啟動了dev下的端口號,而不是默認配置文件里面的prod端口號(8084)

3筹误、虛擬機參數(shù)

? -Dspring.profiles.active=dev

6桐早、配置文件的加載位置

Spring Boot啟動會掃描以下位置的application.properties或者application.yml文件作為Spring Boot的默認配置文件

-file:./config/

-file:./

-classpath:/config

-classpath:/

優(yōu)先級,由高到低厨剪,高優(yōu)先級的配置會覆蓋低優(yōu)先級的配置哄酝;

Spring Boot從4個位置全局加載主配置文件;互補配置

我們還可以通過spring.config.location來改變默認的配置文件位置

項目打包好后祷膳,我們可以使用命令行參數(shù)的形式陶衅,啟動項目的時候指定配置文件的新位置;指定配置文件和默認加載的這些配置文件共同起作用直晨,形成互補配置万哪。解釋:主要是針對運維侠驯,比如項目打包好后是8084,但是需要改變端口號奕巍,我們只要命令行運行時加上--spring.config.location=G:/application.properties吟策,這樣項目就可以通過8085訪問了,不需要重新打包jar包的止,通過加載外部配置文件即可辦到檩坚,比較方便。

比如在D盤新建一個配置文件诅福,更改端口為8085:

IDEA-terminal:

cd target

D:\idea project\SpringBoot-02-helloworld\target>java -jar demo-0.0.1-SNAPSHOT.jar --spring.config.location=D:/application.properties

項目啟動時的端口就是8085了:

7匾委、外部配置加載順序

1.命行參數(shù)

java -jar demo-0.0.1-SNAPSHOT.jar --server.port=8087 --server.context-path=/abc

多個配置用空格分開,--配置項=值

2.來自 java: comp/env的ND屬性3.Java系統(tǒng)屬性( System getproperties0)4.操作系統(tǒng)環(huán)境變量

Random Value Property Source配置的 random:*屬性值

由jar包外向jar包內進行尋找氓润;

優(yōu)先加載帶profile的

6.jar包外部的 application- Profile) properties或 application yml(帶 spring profile)配置文件7.jar包內部的 application- profile) properties或 application yml(帶 spring profile配置文件

再來加載不帶profile的

8.jar包外部的 application properties或 application yml(不帶 spring profile)配置文件9.jar包內部的 application properties或 application yml(不帶 spring profile)配置文件

10.@ Configuration注解類上的@ PropertySource11.通過 SpringApplication. setDefaultproperties指定的默認屬性

8赂乐、自動配置原理

配置文件能寫什么?怎么寫咖气?自動配置原理挨措,參見:

https://docs.spring.io/spring-boot/docs/2.0.2.RELEASE/reference/htmlsingle/#appendix

1、自動配置原理:

1)Spring Boot啟動的時候崩溪,加載主配置類浅役,開啟了自動配置功能@EnableAutoConfiguration

2)@EnableAutoConfiguration的作用:

利用AutoConfigurationImportSelector給容器中導入一些組件;

可以查看selectImports()方法的內容:

List configurations = this.getCandidateConfigurations(annotationMetadata, attributes);獲取候選的配置

SpringFactoriesLoader.loadFactoryNames

掃描所有jar包路徑下的META-INF/spring.factories

把這些掃描到的這些文件的內容包裝成properties對象

從properties獲取EnableAutoConfiguration.class類名對應的值伶唯,然后把他們添加在容器中

將類路徑下的META-INF/spring.factories里面配置的EnableAutoConfiguration值加入到容器中觉既;

# Auto Configure

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\

org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\

org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\

org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\

org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration,\

org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration,\

org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration,\

org.springframework.boot.autoconfigure.cloud.CloudAutoConfiguration,\

org.springframework.boot.autoconfigure.context.ConfigurationPropertiesAutoConfiguration,\

org.springframework.boot.autoconfigure.context.MessageSourceAutoConfiguration,\

org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration,\

org.springframework.boot.autoconfigure.couchbase.CouchbaseAutoConfiguration,\

org.springframework.boot.autoconfigure.dao.PersistenceExceptionTranslationAutoConfiguration,\

org.springframework.boot.autoconfigure.data.cassandra.CassandraDataAutoConfiguration,\

org.springframework.boot.autoconfigure.data.cassandra.CassandraReactiveDataAutoConfiguration,\

org.springframework.boot.autoconfigure.data.cassandra.CassandraReactiveRepositoriesAutoConfiguration,\

org.springframework.boot.autoconfigure.data.cassandra.CassandraRepositoriesAutoConfiguration,\

org.springframework.boot.autoconfigure.data.couchbase.CouchbaseDataAutoConfiguration,\

org.springframework.boot.autoconfigure.data.couchbase.CouchbaseReactiveDataAutoConfiguration,\

org.springframework.boot.autoconfigure.data.couchbase.CouchbaseReactiveRepositoriesAutoConfiguration,\

org.springframework.boot.autoconfigure.data.couchbase.CouchbaseRepositoriesAutoConfiguration,\

org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchAutoConfiguration,\

org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchDataAutoConfiguration,\

org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchRepositoriesAutoConfiguration,\

org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration,\

org.springframework.boot.autoconfigure.data.ldap.LdapDataAutoConfiguration,\

org.springframework.boot.autoconfigure.data.ldap.LdapRepositoriesAutoConfiguration,\

org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration,\

org.springframework.boot.autoconfigure.data.mongo.MongoReactiveDataAutoConfiguration,\

org.springframework.boot.autoconfigure.data.mongo.MongoReactiveRepositoriesAutoConfiguration,\

org.springframework.boot.autoconfigure.data.mongo.MongoRepositoriesAutoConfiguration,\

org.springframework.boot.autoconfigure.data.neo4j.Neo4jDataAutoConfiguration,\

org.springframework.boot.autoconfigure.data.neo4j.Neo4jRepositoriesAutoConfiguration,\

org.springframework.boot.autoconfigure.data.solr.SolrRepositoriesAutoConfiguration,\

org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration,\

org.springframework.boot.autoconfigure.data.redis.RedisReactiveAutoConfiguration,\

org.springframework.boot.autoconfigure.data.redis.RedisRepositoriesAutoConfiguration,\

org.springframework.boot.autoconfigure.data.rest.RepositoryRestMvcAutoConfiguration,\

org.springframework.boot.autoconfigure.data.web.SpringDataWebAutoConfiguration,\

org.springframework.boot.autoconfigure.elasticsearch.jest.JestAutoConfiguration,\

org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration,\

org.springframework.boot.autoconfigure.freemarker.FreeMarkerAutoConfiguration,\

org.springframework.boot.autoconfigure.gson.GsonAutoConfiguration,\

org.springframework.boot.autoconfigure.h2.H2ConsoleAutoConfiguration,\

org.springframework.boot.autoconfigure.hateoas.HypermediaAutoConfiguration,\

org.springframework.boot.autoconfigure.hazelcast.HazelcastAutoConfiguration,\

org.springframework.boot.autoconfigure.hazelcast.HazelcastJpaDependencyAutoConfiguration,\

org.springframework.boot.autoconfigure.http.HttpMessageConvertersAutoConfiguration,\

org.springframework.boot.autoconfigure.http.codec.CodecsAutoConfiguration,\

org.springframework.boot.autoconfigure.influx.InfluxDbAutoConfiguration,\

org.springframework.boot.autoconfigure.info.ProjectInfoAutoConfiguration,\

org.springframework.boot.autoconfigure.integration.IntegrationAutoConfiguration,\

org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration,\

org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\

org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration,\

org.springframework.boot.autoconfigure.jdbc.JndiDataSourceAutoConfiguration,\

org.springframework.boot.autoconfigure.jdbc.XADataSourceAutoConfiguration,\

org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration,\

org.springframework.boot.autoconfigure.jms.JmsAutoConfiguration,\

org.springframework.boot.autoconfigure.jmx.JmxAutoConfiguration,\

org.springframework.boot.autoconfigure.jms.JndiConnectionFactoryAutoConfiguration,\

org.springframework.boot.autoconfigure.jms.activemq.ActiveMQAutoConfiguration,\

org.springframework.boot.autoconfigure.jms.artemis.ArtemisAutoConfiguration,\

org.springframework.boot.autoconfigure.groovy.template.GroovyTemplateAutoConfiguration,\

org.springframework.boot.autoconfigure.jersey.JerseyAutoConfiguration,\

org.springframework.boot.autoconfigure.jooq.JooqAutoConfiguration,\

org.springframework.boot.autoconfigure.jsonb.JsonbAutoConfiguration,\

org.springframework.boot.autoconfigure.kafka.KafkaAutoConfiguration,\

org.springframework.boot.autoconfigure.ldap.embedded.EmbeddedLdapAutoConfiguration,\

org.springframework.boot.autoconfigure.ldap.LdapAutoConfiguration,\

org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration,\

org.springframework.boot.autoconfigure.mail.MailSenderAutoConfiguration,\

org.springframework.boot.autoconfigure.mail.MailSenderValidatorAutoConfiguration,\

org.springframework.boot.autoconfigure.mongo.embedded.EmbeddedMongoAutoConfiguration,\

org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration,\

org.springframework.boot.autoconfigure.mongo.MongoReactiveAutoConfiguration,\

org.springframework.boot.autoconfigure.mustache.MustacheAutoConfiguration,\

org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration,\

org.springframework.boot.autoconfigure.quartz.QuartzAutoConfiguration,\

org.springframework.boot.autoconfigure.reactor.core.ReactorCoreAutoConfiguration,\

org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration,\

org.springframework.boot.autoconfigure.security.servlet.UserDetailsServiceAutoConfiguration,\

org.springframework.boot.autoconfigure.security.servlet.SecurityFilterAutoConfiguration,\

org.springframework.boot.autoconfigure.security.reactive.ReactiveSecurityAutoConfiguration,\

org.springframework.boot.autoconfigure.security.reactive.ReactiveUserDetailsServiceAutoConfiguration,\

org.springframework.boot.autoconfigure.sendgrid.SendGridAutoConfiguration,\

org.springframework.boot.autoconfigure.session.SessionAutoConfiguration,\

org.springframework.boot.autoconfigure.security.oauth2.client.OAuth2ClientAutoConfiguration,\

org.springframework.boot.autoconfigure.solr.SolrAutoConfiguration,\

org.springframework.boot.autoconfigure.thymeleaf.ThymeleafAutoConfiguration,\

org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration,\

org.springframework.boot.autoconfigure.transaction.jta.JtaAutoConfiguration,\

org.springframework.boot.autoconfigure.validation.ValidationAutoConfiguration,\

org.springframework.boot.autoconfigure.web.client.RestTemplateAutoConfiguration,\

org.springframework.boot.autoconfigure.web.embedded.EmbeddedWebServerFactoryCustomizerAutoConfiguration,\

org.springframework.boot.autoconfigure.web.reactive.HttpHandlerAutoConfiguration,\

org.springframework.boot.autoconfigure.web.reactive.ReactiveWebServerFactoryAutoConfiguration,\

org.springframework.boot.autoconfigure.web.reactive.WebFluxAutoConfiguration,\

org.springframework.boot.autoconfigure.web.reactive.error.ErrorWebFluxAutoConfiguration,\

org.springframework.boot.autoconfigure.web.reactive.function.client.WebClientAutoConfiguration,\

org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration,\

org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration,\

org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration,\

org.springframework.boot.autoconfigure.web.servlet.HttpEncodingAutoConfiguration,\

org.springframework.boot.autoconfigure.web.servlet.MultipartAutoConfiguration,\

org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration,\

org.springframework.boot.autoconfigure.websocket.reactive.WebSocketReactiveAutoConfiguration,\

org.springframework.boot.autoconfigure.websocket.servlet.WebSocketServletAutoConfiguration,\

org.springframework.boot.autoconfigure.websocket.servlet.WebSocketMessagingAutoConfiguration,\

org.springframework.boot.autoconfigure.webservices.WebServicesAutoConfiguration

每一個這樣的xxxAutoConfiguration類都是容器中的一個組件,到加入到容器中乳幸;用他們來做自動配置瞪讼;

3)每一個自動配置類進行自動配置功能;

4)以HttpEncodingAutoConfiguration(Http編碼自動配置)為例解釋自動配置原理粹断;

@Configuration//表示這是一個配置類尝艘,以前的配置文件一樣,也可以給容器中添加組件

?

@EnableConfigurationProperties({HttpEncodingProperties.class})//啟用指定類的ConfigurationProperties功能姿染,將配置文件中對應的值和HttpEncodingProperties綁定起來背亥;并把HttpEncodingProperties加入到ioc容器中

?

@ConditionalOnWebApplication(//sping底層@Conditional注解,根據(jù)不同的條件悬赏,如果滿足指定的條件狡汉,整個配置類里面的配置就會生效:判斷當前應用是否為web應用,如果是闽颇,當前配置類生效

type=Type.SERVLET

)

?

@ConditionalOnClass({CharacterEncodingFilter.class})//判斷當前項目有沒CharacterEncodingFilte類:SpringMVC中進行亂碼解決的過濾器盾戴;

?

//判斷文件是否存在某個配置:spring.http.encoding.enabled,如果不存在兵多,判斷也是成立的尖啡,即使配置文件中不配置spring.http.encoding.enabled=true橄仆,也是默認生效的;

@ConditionalOnProperty(

prefix="spring.http.encoding",

value={"enabled"},

matchIfMissing=true

)

publicclassHttpEncodingAutoConfiguration{


? ? //他已經(jīng)和SpringBoot的配置文件映射了

privatefinalHttpEncodingPropertiesproperties;

?

//只有一個有參構造器的情況下衅斩,參數(shù)的值就會從容器中拿

publicHttpEncodingAutoConfiguration(HttpEncodingPropertiesproperties) {

this.properties=properties;

?? }

?

@Bean//給容器中添加一個組件盆顾,這個組件的某些值需要從properties中獲取

@ConditionalOnMissingBean

publicCharacterEncodingFiltercharacterEncodingFilter() {

CharacterEncodingFilterfilter=newOrderedCharacterEncodingFilter();

filter.setEncoding(this.properties.getCharset().name());

filter.setForceRequestEncoding(this.properties.shouldForce(org.springframework.boot.autoconfigure.http.HttpEncodingProperties.Type.REQUEST));

filter.setForceResponseEncoding(this.properties.shouldForce(org.springframework.boot.autoconfigure.http.HttpEncodingProperties.Type.RESPONSE));

returnfilter;

?? }

根據(jù)當前不同的條件判斷,決定這個配置類是否生效畏梆;

一旦這個配置類生效您宪,這個配置類就會給容器中添加各種組件,這些組件的屬性是從對應的properties類中獲取的奠涌,這些類里的每一個屬性又是和配置文件綁定的宪巨;

5)所有在配置文件中能配置的屬性都是在xxxProperties類中封裝著;配置文件能配置什么就可以參照某個功能 對應的屬性類溜畅;

@ConfigurationProperties(//從配置文件中獲取指定的值和bean的屬性進行綁定

prefix="spring.http.encoding"

)

publicclassHttpEncodingProperties{

publicstaticfinalCharsetDEFAULT_CHARSET;

精髓:

? 1)捏卓、Spring Boot啟動會加載大量的自動配置類;

? 2)慈格、我們看我們需要的功能有沒有Spring Boot默認寫好的自動配置類怠晴;

? 3)、我們再來看這個自動配置中到底配置了哪些組件峦椰;(只要我們要用的組件有龄寞,我們就不需要再來配置了)汰规;

? 4)汤功、給容器中自動配置類添加組件的時候,會從properties類中獲取某些屬性溜哮,我們就可以在配置文件中指定這些屬性的值滔金;

xxxAutoConfiguration:自動配置類;

會給容器中添加組件茂嗓;

xxxProperties:封裝配置文件中的相關屬性餐茵;

舉thymeleaf例子:ctrl+n:

@Configuration

@EnableConfigurationProperties({ThymeleafProperties.class})

@ConditionalOnClass({TemplateMode.class})

@AutoConfigureAfter({WebMvcAutoConfiguration.class,WebFluxAutoConfiguration.class})

publicclassThymeleafAutoConfiguration{

ThymeleafProperties.class:

@ConfigurationProperties(

prefix="spring.thymeleaf"

)

publicclassThymeleafProperties{

privatestaticfinalCharsetDEFAULT_ENCODING;

publicstaticfinalStringDEFAULT_PREFIX="classpath:/templates/";

publicstaticfinalStringDEFAULT_SUFFIX=".html";

privatebooleancheckTemplate=true;

privatebooleancheckTemplateLocation=true;

privateStringprefix="classpath:/templates/";

privateStringsuffix=".html";

privateStringmode="HTML";

privateCharsetencoding;

privatebooleancache;

privateIntegertemplateResolverOrder;

privateString[]viewNames;

privateString[]excludedViewNames;

privatebooleanenableSpringElCompiler;

privatebooleanenabled;

privatefinalThymeleafProperties.Servletservlet;

privatefinalThymeleafProperties.Reactivereactive;

這樣application.properties文件中可以加的配置可以有:

spring.thymeleaf.prefix=classpath:/templates/

spring.thymeleaf.suffi=.html

spring.thymeleaf.checkTemplate=true

2、細節(jié)

1述吸、@Conditional派生注解(Spring注解版@Conditional作用)

作用:必須是@Conditional指定的條件成立忿族,才給容器中添加組件,配置里面的內容才能生效蝌矛;

自動配置類在一定條件下才能生效道批;

我們可以在配置文件中啟動debug=true屬性來讓控制臺打印自動配置報告;這樣我們就可以方便知道哪些自動配置類生效入撒;

============================

CONDITIONSEVALUATIONREPORT

============================

?

?

Positivematches:(自動配置類啟用的)

-----------------

?

CodecsAutoConfigurationmatched:

-@ConditionalOnClassfoundrequiredclass'org.springframework.http.codec.CodecConfigurer';@ConditionalOnMissingClassdidnotfindunwantedclass(OnClassCondition)

?

Negativematches:(沒用啟用隆豹,沒有匹配成功的自動配置類)

-----------------

?

ActiveMQAutoConfiguration:

Didnotmatch:

-@ConditionalOnClassdidnotfindrequiredclasses'javax.jms.ConnectionFactory','org.apache.activemq.ActiveMQConnectionFactory'(OnClassCondition)

?

4、Web開發(fā)

2茅逮、Spring Boot對靜態(tài)資源的映射規(guī)則

@ConfigurationProperties(

prefix="spring.resources",

ignoreUnknownFields=false

)

publicclassResourcePropertiesimplementsResourceLoaderAware,InitializingBean{

//可以設置和靜態(tài)資源有關的參數(shù)璃赡、緩存時間等

publicvoidaddResourceHandlers(ResourceHandlerRegistryregistry) {

if(!this.resourceProperties.isAddMappings()) {

logger.debug("Default resource handling disabled");

}else{

IntegercachePeriod=this.resourceProperties.getCachePeriod();

if(!registry.hasMappingForPattern("/webjars/**")) {

this.customizeResourceHandlerRegistration(registry.addResourceHandler(newString[]{"/webjars/**"}).addResourceLocations(newString[]{"classpath:/META-INF/resources/webjars/"}).setCachePeriod(cachePeriod));

? ? ? ? ? ? ?? }

?

StringstaticPathPattern=this.mvcProperties.getStaticPathPattern();

if(!registry.hasMappingForPattern(staticPathPattern)) {

this.customizeResourceHandlerRegistration(registry.addResourceHandler(newString[]{staticPathPattern}).addResourceLocations(this.resourceProperties.getStaticLocations()).setCachePeriod(cachePeriod));

? ? ? ? ? ? ?? }

?

? ? ? ? ?? }

? ? ?? }

? ? ? ? //配置歡迎頁

? ? ? ? @Bean

? ? ? ? publicWelcomePageHandlerMappingwelcomePageHandlerMapping(

? ? ? ? ? ? ? ? ResourcePropertiesresourceProperties) {

? ? ? ? ? ? returnnewWelcomePageHandlerMapping(resourceProperties.getWelcomePage(),

? ? ? ? ? ? ? ? ? ? this.mvcProperties.getStaticPathPattern());

? ? ? ? }

? ? ? ? //配置喜歡的圖標

? ? ? ? @Configuration

? ? ? ? @ConditionalOnProperty(value="spring.mvc.favicon.enabled",matchIfMissing=true)

? ? ? ? publicstaticclassFaviconConfiguration{

?

? ? ? ? ? ? privatefinalResourcePropertiesresourceProperties;

?

? ? ? ? ? ? publicFaviconConfiguration(ResourcePropertiesresourceProperties) {

? ? ? ? ? ? ? ? this.resourceProperties=resourceProperties;

? ? ? ? ? ? }

?

? ? ? ? ? ? @Bean

? ? ? ? ? ? publicSimpleUrlHandlerMappingfaviconHandlerMapping() {

? ? ? ? ? ? ? ? SimpleUrlHandlerMappingmapping=newSimpleUrlHandlerMapping();

? ? ? ? ? ? ? ? mapping.setOrder(Ordered.HIGHEST_PRECEDENCE+1);

//所有**/favicon.ico

? ? ? ? ? ? ? ? mapping.setUrlMap(Collections.singletonMap("**/favicon.ico",

? ? ? ? ? ? ? ? ? ? ? ? faviconRequestHandler()));

? ? ? ? ? ? ? ? returnmapping;

? ? ? ? ? ? }

?

? ? ? ? ? ? @Bean

? ? ? ? ? ? publicResourceHttpRequestHandlerfaviconRequestHandler() {

? ? ? ? ? ? ? ? ResourceHttpRequestHandlerrequestHandler=newResourceHttpRequestHandler();

? ? ? ? ? ? ? ? requestHandler

? ? ? ? ? ? ? ? ? ? ? ? .setLocations(this.resourceProperties.getFaviconLocations());

? ? ? ? ? ? ? ? returnrequestHandler;

? ? ? ? ? ? }

?

? ? ? ? }

?

? ? }

1)判哥、所有webjars/*都去classpath:/META-INF/resources/webjars/找資源;

webjars:以jar包的形式引入靜態(tài)資源碉考;

http://www.webjars.org/

比如引入jquery3.3.1:


? ? ? ?

? ? ? ? ? ? org.webjars

? ? ? ? ? ? jquery

? ? ? ? ? ? 3.3.1-1


http://localhost:8080/webjars/jquery/3.3.1-1/jquery.js? ? 訪問時只要寫webjars下資源的名稱即可:

2)“/”訪問當前項目的任何資源:(靜態(tài)資源的文件夾)**

"/":當前項目的根目錄

"classpath:/META-INF/resources/",

"classpath:/resources/",

"classpath:/static/",

"classpath:/public/

localhost:8080/abc-->默認從靜態(tài)資源文件夾里找abc資源塌计;

3)、歡迎頁:靜態(tài)資源文件下的index.html頁面豆励,被"/"映射夺荒;**

localhost:8080/? 找index.html

比如在public文件夾下放index.html:

4)、所有的/favicon.ico都是在靜態(tài)資源文件下找良蒸;**

比如在resource文件夾下放一個自定義圖標:

3技扼、模板引擎

JSP、Velocity嫩痰、Freemarker剿吻、Thymeleaf;

SpringBoot推薦的Thymeleaf:

語法更簡單串纺、功能更強大丽旅;

1、引入Thymeleaf

切換thymeleaf版本

3.0.9.RELEASE



2.3.0

具體參見:

thymeleaf發(fā)布:https://github.com/thymeleaf/thymeleaf/releases

thymeleaf layout dialect:https://github.com/ultraq/thymeleaf-layout-dialect/releases

?

org.springframework.boot

spring-boot-starter-thymeleaf

Layout? 2.0.0的版本開始視頻thymeleaf3

2纺棺、Thymeleaf使用&語法

@ConfigurationProperties(prefix="spring.thymeleaf")

publicclassThymeleafProperties{

?

? ? privatestaticfinalCharsetDEFAULT_ENCODING=Charset.forName("UTF-8");

?

? ? privatestaticfinalMimeTypeDEFAULT_CONTENT_TYPE=MimeType.valueOf("text/html");

?

? ? publicstaticfinalStringDEFAULT_PREFIX="classpath:/templates/";

?

? ? publicstaticfinalStringDEFAULT_SUFFIX=".html";

//只要我們把html頁面放到classpath:/templates/路徑下榄笙,thymeleaf就能自動渲染

只要我們把html頁面放到classpath:/templates/路徑下,thymeleaf就能自動渲染

使用:

1祷蝌、導入Thymeleaf的名稱空間

2茅撞、使用Thymeleaf的使用

Title

success


這是歡迎信息

3、語法規(guī)則

1)巨朦、th:text:改變當前元素里面的文本內容米丘;

? th:任意html屬性:來替換原生屬性的值;參考官方pdf文檔第10章(Attribute Precedence:屬性優(yōu)先級)

2)糊啡、表達式拄查?

Simple expressions:(表達式語法)

Variable Expressions: ${...}:獲取變量值:OGNL

? ? 1)、獲取對象的屬性棚蓄,調用方法

? ? 2)堕扶、使用內置的基本對象

? ? #ctx : the context object.

?? #vars: the context variables.

?? #locale : the context locale.

?? #request : (only in Web Contexts) the HttpServletRequest object.

?? #response : (only in Web Contexts) the HttpServletResponse object.

?? #session : (only in Web Contexts) the HttpSession object.

?? #servletContext : (only in Web Contexts) the ServletContext object.


?? ${session.foo}

?? 3)、內置的一些工具對象

?? #execInfo : information about the template being processed.

#messages : methods for obtaining externalized messages inside variables expressions, in the? same way as they would be obtained using #{…} syntax.

?? #uris : methods for escaping parts of URLs/URIs

?? #conversions : methods for executing the configured conversion service (if any).

?? #dates : methods for java.util.Date objects: formatting, component extraction, etc.

?? #calendars : analogous to #dates , but for java.util.Calendar objects.

?? #numbers : methods for formatting numeric objects.

?? #strings : methods for String objects: contains, startsWith, prepending/appending, etc.

?? #objects : methods for objects in general.

?? #bools : methods for boolean evaluation.

?? #arrays : methods for arrays.

?? #lists : methods for lists.

?? #sets : methods for sets.

?? #maps : methods for maps.

?? #aggregates : methods for creating aggregates on arrays or collections.

#ids : methods for dealing with id attributes that might be repeated (for example, as a? ? result of an iteration).

Selection Variable Expressions: *{...} :選擇表達式梭依,和${}功能上是一樣的

? ? 補充:配合th:object=${session.user};

? ?

? ? ??

Name: Sebastian.

? ? ??

Surname: Pepper.

? ? ??

Nationality: Saturn.


? ? 等價于:

? ?

? ? ??

Name: Sebastian.

? ? ??

Surname: Pepper.

? ? ??

Nationality: Saturn.


Message Expressions: #{...}:獲取國際化內容

Link URL Expressions: @{...}:獲取URL:

? ? @{/order/process(execId=${execId},execType='FAST')}

Fragment Expressions: ~{...}:片段引用的表達式

? ?

...

Literals(字面量)

?? Text literals: 'one text' , 'Another one!' ,…

?? Number literals: 0 , 34 , 3.0 , 12.3 ,…

?? Boolean literals: true , false

?? Null literal: null

? ? Literal tokens: one , sometext , main ,…

Text operations:(文本操作)

?? String concatenation: +

?? Literal substitutions: |The name is ${name}|

Arithmetic operations:(數(shù)學運算)

?? Binary operators: + , - , * , / , %

?? Minus sign (unary operator): -

Boolean operations:(布爾運算)

?? Binary operators: and , or

?? Boolean negation (unary operator): ! , not

Comparisons and equality:(比較運算)

?? Comparators: > , < , >= , <= ( gt , lt , ge , le )

?? Equality operators: == , != ( eq , ne )

Conditional operators:(條件運算稍算,包括三元運算符)

?? If-then: (if) ? (then)

?? If-then-else: (if) ? (then) : (else)

?? Default: (value) ?: (defaultvalue)

Special tokens:

Page 17 of 104No-Operation:

4、SpringMVC自動配置

https://docs.spring.io/spring-boot/docs/2.0.2.RELEASE/reference/htmlsingle/#boot-features-developing-web-applications

27.1.1 Spring MVC Auto-configuration

SpringBoot自動配置好了SpringMVC

以下是SpringBoot對SpringMVC的默認配置:

Spring Boot provides auto-configuration for Spring MVC that works well with most applications.

The auto-configuration adds the following features on top of Spring’s defaults:

Inclusion of ContentNegotiatingViewResolver and BeanNameViewResolver beans.

自動配置了ViewResolver(視圖解析器:根據(jù)返回值得到視圖對象(View)睛挚,視圖對象決定如何渲染 (轉發(fā)邪蛔?重定向?))

ContentNegotiatingViewResolver :組合所有的視圖解析器扎狱;

如何定制:我們可以自己給容器中添加一個視圖解析器侧到;自動將其組合進來勃教;

@Bean

? ? publicViewResolvermyViewResolver(){

? ? ? ? returnnewmyViewResolver();

? ? }

?

? ? privatestaticclassmyViewResolverimplementsViewResolver{

?

? ? ? ? @Override

? ? ? ? publicViewresolveViewName(StringviewName,Localelocale)throwsException{

? ? ? ? ? ? returnnull;

? ? ? ? }

? ? }

在DispatcherServlet的doDispatch方法打斷點,調試:

隨便訪問一個地址:http://localhost:8080/success

通過控制臺的variable可以看到我們自己寫的視圖解析器添加到viewResolver了:

Support for serving static resources, including support for WebJars (covered later in this document)).

靜態(tài)資源文件夾路徑匠抗、webjars

Automatic registration of Converter, GenericConverter, and Formatter beans.

Converter:轉換器: public String sayHello(User user):類型轉換使用故源;

Formatter:格式化器:2017-12-01===Date;

@Bean

@ConditionalOnProperty(prefix="spring.mvc",name="date-format")//在文件中配置日期格式化規(guī)則

publicFormatterdateFormatter() {

returnnewDateFormatter(this.mvcProperties.getDateFormat());//日期格式化組件

}

自己添加的格式化器轉換器:我們只要放入容器中即可汞贸;

?

Support for HttpMessageConverters (covered later in this document).

HttpMessageConverters:SpringMVC用來轉換Http請求和響應的绳军;User---json;

HttpMessageConverters:是從容器中確定的矢腻;獲取所有的HttpMessageConverters门驾;自己給容器中添加HttpMessageConverters,只需要注冊到容器中即可(@Bean多柑,@Componet)奶是;

importorg.springframework.boot.autoconfigure.web.HttpMessageConverters;

importorg.springframework.context.annotation.*;

importorg.springframework.http.converter.*;

?

@Configuration

publicclassMyConfiguration{

?

? ? @Bean

? ? publicHttpMessageConverterscustomConverters() {

? ? ? ? HttpMessageConverteradditional=...

? ? ? ? HttpMessageConverteranother=...

? ? ? ? returnnewHttpMessageConverters(additional,another);

? ? }

?

}

Automatic registration of MessageCodesResolver (covered later in this document).定義錯誤代碼生成規(guī)則

Static index.html support.靜態(tài)首頁訪問

Custom Favicon support (covered later in this document). favicon.ico標簽圖標

Automatic use of a ConfigurableWebBindingInitializer bean (covered later in this document).

我們可以配置ConfigurableWebBindingInitializer來替換默認的;(要添加到容器中)

初始化WebDataBinder

請求數(shù)據(jù)綁定到javabean中

org.springframework.boot.autoconfigure.web:web所有的自動配置場景竣灌;

If you want to keep Spring Boot MVC features and you want to add additional MVC configuration (interceptors, formatters, view controllers, and other features), you can add your own @Configuration class of type WebMvcConfigurer but without @EnableWebMvc. If you wish to provide custom instances of RequestMappingHandlerMapping, RequestMappingHandlerAdapter, or ExceptionHandlerExceptionResolver, you can declare a WebMvcRegistrationsAdapter instance to provide such components.

If you want to take complete control of Spring MVC, you can add your own @Configuration annotated with @EnableWebMvc.

5聂沙、如何修改Spring Boot的默認配置

模式:

? 1)SpringBoot在配置很多組件的時候,先看容器中有無用戶配置的組件(@Bean初嘹、@Component)及汉,如果有就用用戶配置的,如果沒有屯烦,才自動配置坷随;如果有些組件可以有多個(ViewResolver)將用戶配置的和自己默認的組合起來;

2)漫贞、擴展SpringMVC

? ?

? ?

編寫一個配置類(@Configuration)甸箱,是WebMvcConfigurer 類型的育叁,不能標注EnableWebMvc注解迅脐。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市豪嗽,隨后出現(xiàn)的幾起案子谴蔑,更是在濱河造成了極大的恐慌,老刑警劉巖龟梦,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件隐锭,死亡現(xiàn)場離奇詭異,居然都是意外死亡计贰,警方通過查閱死者的電腦和手機钦睡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來躁倒,“玉大人荞怒,你說我怎么就攤上這事洒琢。” “怎么了褐桌?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵衰抑,是天一觀的道長。 經(jīng)常有香客問我荧嵌,道長呛踊,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任啦撮,我火速辦了婚禮谭网,結果婚禮上,老公的妹妹穿的比我還像新娘赃春。我一直安慰自己蜻底,他們只是感情好,可當我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布聘鳞。 她就那樣靜靜地躺著薄辅,像睡著了一般。 火紅的嫁衣襯著肌膚如雪抠璃。 梳的紋絲不亂的頭發(fā)上站楚,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天,我揣著相機與錄音搏嗡,去河邊找鬼窿春。 笑死,一個胖子當著我的面吹牛采盒,可吹牛的內容都是我干的旧乞。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼磅氨,長吁一口氣:“原來是場噩夢啊……” “哼尺栖!你這毒婦竟也來了?” 一聲冷哼從身側響起烦租,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤延赌,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后叉橱,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體挫以,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年窃祝,在試婚紗的時候發(fā)現(xiàn)自己被綠了掐松。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖大磺,靈堂內的尸體忽然破棺而出泻仙,到底是詐尸還是另有隱情,我是刑警寧澤量没,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布玉转,位于F島的核電站,受9級特大地震影響殴蹄,放射性物質發(fā)生泄漏究抓。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧树埠,春花似錦、人聲如沸橘茉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽畅卓。三九已至,卻和暖如春蟋恬,著一層夾襖步出監(jiān)牢的瞬間翁潘,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工歼争, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留拜马,地道東北人。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓沐绒,卻偏偏與公主長得像俩莽,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子乔遮,可洞房花燭夜當晚...
    茶點故事閱讀 42,901評論 2 345

推薦閱讀更多精彩內容

  • 你要知道的SpringMVC啟動流程和源碼分析都在這里 轉載請注明出處 http://www.jianshu.co...
    WWWWDotPNG閱讀 18,640評論 8 66
  • 此篇文章主要為了記錄他們之間的區(qū)別扮超,經(jīng)常聽到SpringSprintMVCStruts是什么呢? Spring: ...
    __Andy__閱讀 1,698評論 1 1
  • 要點 SpringMVC簡介 搭建環(huán)境入門程序 全注解J2EE三層使用的注解使用步驟對靜態(tài)資源的處理 傳參方式原始...
    CoderZS閱讀 10,057評論 5 18
  • 1.酸奶加水果堅果燕麥很好吃 2.十一月的第一天很愉快 3.keep正式打卡第一天
    背著太陽曬太陽閱讀 195評論 0 0
  • 大家知道抑郁癥兒的是很多人都存在的一種情緒申眼,有重有輕每個人都會有瞒津。這種情緒不好的時候蝉衣,但是嚴重了括尸,就形成抑郁癥了,...
    Helen_Qu閱讀 193評論 0 0