02 SpringBoot配置

1弥喉、POM文件

1、父項(xiàng)目

org.springframework.bootspring-boot-starter-parent1.5.9.RELEASE他的父項(xiàng)目是org.springframework.bootspring-boot-dependencies1.5.9.RELEASE../../spring-boot-dependencies他來真正管理Spring Boot應(yīng)用里面的所有依賴版本;

Spring Boot的版本仲裁中心荷科;

以后我們導(dǎo)入依賴默認(rèn)是不需要寫版本笔链;(沒有在dependencies里面管理的依賴自然需要聲明版本號(hào))

2、啟動(dòng)器

org.springframework.bootspring-boot-starter-web

spring-boot-starter-==web==:

? spring-boot-starter:spring-boot場(chǎng)景啟動(dòng)器趣惠;幫我們導(dǎo)入了web模塊正常運(yùn)行所依賴的組件狸棍;

Spring Boot將所有的功能場(chǎng)景都抽取出來,做成一個(gè)個(gè)的starters(啟動(dòng)器)味悄,只需要在項(xiàng)目里面引入這些starter相關(guān)場(chǎng)景的所有依賴都會(huì)導(dǎo)入進(jìn)來草戈。要用什么功能就導(dǎo)入什么場(chǎng)景的啟動(dòng)器

2、主程序類侍瑟,主入口類

/** *@SpringBootApplication來標(biāo)注一個(gè)主程序類唐片,說明這是一個(gè)Spring Boot應(yīng)用 */@SpringBootApplicationpublicclassHelloWorldMainApplication{publicstaticvoidmain(String[] args){// Spring應(yīng)用啟動(dòng)起來SpringApplication.run(HelloWorldMainApplication.class,args);? ? }}

@SpringBootApplication: Spring Boot應(yīng)用標(biāo)注在某個(gè)類上說明這個(gè)類是SpringBoot的主配置類丙猬,SpringBoot就應(yīng)該運(yùn)行這個(gè)類的main方法來啟動(dòng)SpringBoot應(yīng)用;

@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的配置類费韭;

? 標(biāo)注在某個(gè)類上茧球,表示這是一個(gè)Spring Boot的配置類;

?@Configuration:配置類上來標(biāo)注這個(gè)注解揽思;

? 配置類 ----- 配置文件袜腥;配置類也是容器中的一個(gè)組件;@Component

@EnableAutoConfiguration:開啟自動(dòng)配置功能钉汗;

?以前我們需要配置的東西羹令,Spring Boot幫我們自動(dòng)配置;@EnableAutoConfiguration告訴SpringBoot開啟自動(dòng)配置功能损痰;這樣自動(dòng)配置才能生效福侈;

@AutoConfigurationPackage@Import(EnableAutoConfigurationImportSelector.class)public@interfaceEnableAutoConfiguration {

? @AutoConfigurationPackage:自動(dòng)配置包

?@Import(AutoConfigurationPackages.Registrar.class):

? Spring的底層注解@Import,給容器中導(dǎo)入一個(gè)組件卢未;導(dǎo)入的組件由AutoConfigurationPackages.Registrar.class肪凛;

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

?@Import(EnableAutoConfigurationImportSelector.class)辽社;

? 給容器中導(dǎo)入組件伟墙?

?EnableAutoConfigurationImportSelector:導(dǎo)入哪些組件的選擇器;

? 將所有需要導(dǎo)入的組件以全類名的方式返回滴铅;這些組件就會(huì)被添加到容器中戳葵;

?會(huì)給容器中導(dǎo)入非常多的自動(dòng)配置類(xxxAutoConfiguration);就是給容器中導(dǎo)入這個(gè)場(chǎng)景需要的所有組件汉匙,并配置好這些組件拱烁;

有了自動(dòng)配置類,免去了我們手動(dòng)編寫配置注入功能組件等的工作噩翠;

? SpringFactoriesLoader.loadFactoryNames(EnableAutoConfiguration.class,classLoader)戏自;

==Spring Boot在啟動(dòng)的時(shí)候從類路徑下的META-INF/spring.factories中獲取EnableAutoConfiguration指定的值,將這些值作為自動(dòng)配置類導(dǎo)入到容器中伤锚,自動(dòng)配置類就生效擅笔,幫我們進(jìn)行自動(dòng)配置工作;==以前我們需要自己配置的東西屯援,自動(dòng)配置類都幫我們猛们;

J2EE的整體整合解決方案和自動(dòng)配置都在spring-boot-autoconfigure-1.5.9.RELEASE.jar;

?

6玄呛、使用Spring Initializer快速創(chuàng)建Spring Boot項(xiàng)目

1阅懦、IDEA:使用 Spring Initializer快速創(chuàng)建項(xiàng)目

IDE都支持使用Spring的項(xiàng)目創(chuàng)建向?qū)Э焖賱?chuàng)建一個(gè)Spring Boot項(xiàng)目;

選擇我們需要的模塊徘铝;向?qū)?huì)聯(lián)網(wǎng)創(chuàng)建Spring Boot項(xiàng)目耳胎;

默認(rèn)生成的Spring Boot項(xiàng)目惯吕;

主程序已經(jīng)生成好了,我們只需要我們自己的邏輯

resources文件夾中目錄結(jié)構(gòu)

static:保存所有的靜態(tài)資源怕午; js css images废登;

templates:保存所有的模板頁面;(Spring Boot默認(rèn)jar包使用嵌入式的Tomcat郁惜,默認(rèn)不支持JSP頁面)堡距;可以使用模板引擎(freemarker、thymeleaf)兆蕉;

application.properties:Spring Boot應(yīng)用的配置文件羽戒;可以修改一些默認(rèn)設(shè)置;

2虎韵、STS使用 Spring Starter Project快速創(chuàng)建項(xiàng)目

二易稠、配置文件

1、配置文件

SpringBoot使用一個(gè)全局的配置文件包蓝,配置文件名是固定的驶社;

?application.properties

?application.yml

配置文件的作用:修改SpringBoot自動(dòng)配置的默認(rèn)值;SpringBoot在底層都給我們自動(dòng)配置好测萎;

YAML(YAML Ain't Markup Language)

? YAML A Markup Language:是一個(gè)標(biāo)記語言

? YAML isn't Markup Language:不是一個(gè)標(biāo)記語言亡电;

標(biāo)記語言:

?以前的配置文件;大多都使用的是?xxxx.xml文件硅瞧;

?YAML:以數(shù)據(jù)為中心份乒,比json、xml等更適合做配置文件零酪;

? YAML:配置例子

server:? port:8081

? XML:

8081

2冒嫡、YAML語法:

1拇勃、基本語法

k:(空格)v:表示一對(duì)鍵值對(duì)(空格必須有)四苇;

空格的縮進(jìn)來控制層級(jí)關(guān)系;只要是左對(duì)齊的一列數(shù)據(jù)方咆,都是同一個(gè)層級(jí)的

server:? ? port:8081? ? path:/hello

屬性和值也是大小寫敏感月腋;

2、值的寫法

字面量:普通的值(數(shù)字瓣赂,字符串榆骚,布爾)

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

? 字符串默認(rèn)不用加上單引號(hào)或者雙引號(hào)煌集;

? "":雙引號(hào)妓肢;不會(huì)轉(zhuǎn)義字符串里面的特殊字符;特殊字符會(huì)作為本身想表示的意思

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

? '':單引號(hào)碉钠;會(huì)轉(zhuǎn)義特殊字符纲缓,特殊字符最終只是一個(gè)普通的字符串?dāng)?shù)據(jù)

? name: ‘zhangsan \n lisi’:輸出;zhangsan \n lisi

對(duì)象喊废、Map(屬性和值)(鍵值對(duì)):

? k: v:在下一行來寫對(duì)象的屬性和值的關(guān)系祝高;注意縮進(jìn)

? 對(duì)象還是k: v的方式

friends:lastName:zhangsanage:20

行內(nèi)寫法:

friends:{lastName:zhangsan,age:18}

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

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

pets: -cat -dog -pig

行內(nèi)寫法

pets:[cat,dog,pig]

3污筷、配置文件值注入

配置文件

person:? ? lastName:hello? ? age:18? ? boss:false? ? birth:2017/12/12? ? maps:{k1:v1,k2:12}? ? lists:? ? ? -lisi? ? ? -zhaoliu? ? dog:? ? ? name:小狗? ? ? age:12

javaBean:

/** * 將配置文件中配置的每一個(gè)屬性的值工闺,映射到這個(gè)組件中 *@ConfigurationProperties:告訴SpringBoot將本類中的所有屬性和配置文件中相關(guān)的配置進(jìn)行綁定; *? ? ? prefix = "person":配置文件中哪個(gè)下面的所有屬性進(jìn)行一一映射 * * 只有這個(gè)組件是容器中的組件瓣蛀,才能容器提供的@ConfigurationProperties功能陆蟆; * */@Component@ConfigurationProperties(prefix ="person")publicclassPerson{privateString lastName;privateInteger age;privateBoolean boss;privateDate birth;privateMap maps;privateList lists;privateDog dog;

我們可以導(dǎo)入配置文件處理器窖壕,以后編寫配置就有提示了

<!--導(dǎo)入配置文件處理器品抽,配置文件進(jìn)行綁定就會(huì)有提示-->org.springframework.bootspring-boot-configuration-processortrue

1、properties配置文件在idea中默認(rèn)utf-8可能會(huì)亂碼

調(diào)整

2清笨、@Value獲取值和@ConfigurationProperties獲取值比較

@ConfigurationProperties@Value

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

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

SpEL不支持支持

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

復(fù)雜類型封裝支持不支持

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

如果說溪猿,我們只是在某個(gè)業(yè)務(wù)邏輯中需要獲取一下配置文件中的某項(xiàng)值,使用@Value纫塌;

如果說诊县,我們專門編寫了一個(gè)javaBean來和配置文件進(jìn)行映射,我們就直接使用@ConfigurationProperties措左;

3依痊、配置文件注入值數(shù)據(jù)校驗(yàn)

@Component@ConfigurationProperties(prefix ="person")@ValidatedpublicclassPerson{/**

? ? * <bean class="Person">

? ? *? ? ? <property name="lastName" value="字面量/${key}從環(huán)境變量、配置文件中獲取值/#{SpEL}"></property>

? ? * <bean/>

? ? *///lastName必須是郵箱格式@Email//@Value("${person.last-name}")privateString lastName;//@Value("#{11*2}")privateInteger age;//@Value("true")privateBoolean boss;privateDate birth;privateMap maps;privateList lists;privateDog dog;

4怎披、@PropertySource&@ImportResource&@Bean

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

/** * 將配置文件中配置的每一個(gè)屬性的值,映射到這個(gè)組件中 *@ConfigurationProperties:告訴SpringBoot將本類中的所有屬性和配置文件中相關(guān)的配置進(jìn)行綁定凉逛; *? ? ? prefix = "person":配置文件中哪個(gè)下面的所有屬性進(jìn)行一一映射 * * 只有這個(gè)組件是容器中的組件性宏,才能容器提供的@ConfigurationProperties功能; *@ConfigurationProperties(prefix = "person")默認(rèn)從全局配置文件中獲取值状飞; * */@PropertySource(value = {"classpath:person.properties"})@Component@ConfigurationProperties(prefix ="person")//@ValidatedpublicclassPerson{/**

? ? * <bean class="Person">

? ? *? ? ? <property name="lastName" value="字面量/${key}從環(huán)境變量毫胜、配置文件中獲取值/#{SpEL}"></property>

? ? * <bean/>

? ? *///lastName必須是郵箱格式// @Email//@Value("${person.last-name}")privateString lastName;//@Value("#{11*2}")privateInteger age;//@Value("true")privateBoolean boss;

@ImportResource:導(dǎo)入Spring的配置文件,讓配置文件里面的內(nèi)容生效诬辈;

Spring Boot里面沒有Spring的配置文件酵使,我們自己編寫的配置文件,也不能自動(dòng)識(shí)別焙糟;

想讓Spring的配置文件生效口渔,加載進(jìn)來;@ImportResource標(biāo)注在一個(gè)配置類上

@ImportResource(locations = {"classpath:beans.xml"})導(dǎo)入Spring的配置文件讓其生效

不來編寫Spring的配置文件

<?xml version="1.0"encoding="UTF-8"?>

SpringBoot推薦給容器中添加組件的方式穿撮;推薦使用全注解的方式

1缺脉、配置類**@Configuration**------>Spring配置文件

2瞧哟、使用**@Bean**給容器中添加組件

/** *@Configuration:指明當(dāng)前類是一個(gè)配置類;就是來替代之前的Spring配置文件 * * 在配置文件中用標(biāo)簽添加組件 * */@ConfigurationpublicclassMyAppConfig{//將方法的返回值添加到容器中枪向;容器中這個(gè)組件默認(rèn)的id就是方法名@BeanpublicHelloServicehelloService02(){? ? ? ? System.out.println("配置類@Bean給容器中添加組件了...");returnnewHelloService();? ? }}

##4勤揩、配置文件占位符

1、隨機(jī)數(shù)

${random.value}秘蛔、${random.int}陨亡、${random.long}${random.int(10)}、${random.int[1024,65536]}

2深员、占位符獲取之前配置的值负蠕,如果沒有可以是用:指定默認(rèn)值

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

person.age=${random.int}

person.birth=2017/12/15

person.boss=false

person.maps.k1=v1

person.maps.k2=14

person.lists=a,b,c

person.dog.name=${person.hello:hello}_dog

person.dog.age=15

5、Profile

1倦畅、多Profile文件

我們?cè)谥髋渲梦募帉懙臅r(shí)候遮糖,文件名可以是 application-{profile}.properties/yml

默認(rèn)使用application.properties的配置;

2叠赐、yml支持多文檔塊方式

server:? port:8081spring:? profiles:? ? active:prod---server:? port:8083spring:? profiles:dev---server:? port:8084spring:? profiles:prod#指定屬于哪個(gè)環(huán)境

3欲账、激活指定profile

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

? 2芭概、命令行:

? java -jar spring-boot-02-config-0.0.1-SNAPSHOT.jar --spring.profiles.active=dev赛不;

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

? 3罢洲、虛擬機(jī)參數(shù)踢故;

? -Dspring.profiles.active=dev

6、配置文件加載位置

springboot 啟動(dòng)會(huì)掃描以下位置的application.properties或者application.yml文件作為Spring boot的默認(rèn)配置文件

–file:./config/

–file:./

–classpath:/config/

–classpath:/

優(yōu)先級(jí)由高到底惹苗,高優(yōu)先級(jí)的配置會(huì)覆蓋低優(yōu)先級(jí)的配置殿较;

SpringBoot會(huì)從這四個(gè)位置全部加載主配置文件;互補(bǔ)配置桩蓉;

==我們還可以通過spring.config.location來改變默認(rèn)的配置文件位置==

項(xiàng)目打包好以后淋纲,我們可以使用命令行參數(shù)的形式,啟動(dòng)項(xiàng)目的時(shí)候來指定配置文件的新位置触机;指定配置文件和默認(rèn)加載的這些配置文件共同起作用形成互補(bǔ)配置帚戳;

java -jar spring-boot-02-config-02-0.0.1-SNAPSHOT.jar --spring.config.location=G:/application.properties

7玷或、外部配置加載順序

==SpringBoot也可以從以下位置加載配置儡首; 優(yōu)先級(jí)從高到低;高優(yōu)先級(jí)的配置覆蓋低優(yōu)先級(jí)的配置偏友,所有的配置會(huì)形成互補(bǔ)配置==

1.命令行參數(shù)

所有的配置都可以在命令行上進(jìn)行指定

java -jar spring-boot-02-config-02-0.0.1-SNAPSHOT.jar --server.port=8087 --server.context-path=/abc

多個(gè)配置用空格分開蔬胯; --配置項(xiàng)=值

2.來自java:comp/env的JNDI屬性

3.Java系統(tǒng)屬性(System.getProperties())

4.操作系統(tǒng)環(huán)境變量

5.RandomValuePropertySource配置的random.*屬性值

==由jar包外向jar包內(nèi)進(jìn)行尋找;==

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

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

7.jar包內(nèi)部的application-{profile}.properties或application.yml(帶spring.profile)配置文件

==再來加載不帶profile==

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

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

10.@Configuration注解類上的@PropertySource

11.通過SpringApplication.setDefaultProperties指定的默認(rèn)屬性

所有支持的配置加載來源位他;

參考官方文檔

8氛濒、自動(dòng)配置原理

配置文件到底能寫什么产场?怎么寫?自動(dòng)配置原理舞竿;

配置文件能配置的屬性參照

1京景、自動(dòng)配置原理:

1)、SpringBoot啟動(dòng)的時(shí)候加載主配置類骗奖,開啟了自動(dòng)配置功能 ==@EnableAutoConfiguration==

2)确徙、@EnableAutoConfiguration 作用:

利用EnableAutoConfigurationImportSelector給容器中導(dǎo)入一些組件?

可以查看selectImports()方法的內(nèi)容执桌;

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

SpringFactoriesLoader.loadFactoryNames()

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

把掃描到的這些文件的內(nèi)容包裝成properties對(duì)象

從properties中獲取到EnableAutoConfiguration.class類(類名)對(duì)應(yīng)的值鄙皇,然后把他們添加在容器中

?

==將 類路徑下 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.CassandraRepositoriesAutoConfiguration,\

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

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.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.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.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.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.flyway.FlywayAutoConfiguration,\

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

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

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

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.mobile.DeviceResolverAutoConfiguration,\

org.springframework.boot.autoconfigure.mobile.DeviceDelegatingViewResolverAutoConfiguration,\

org.springframework.boot.autoconfigure.mobile.SitePreferenceAutoConfiguration,\

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

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

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

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

org.springframework.boot.autoconfigure.reactor.ReactorAutoConfiguration,\

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

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

org.springframework.boot.autoconfigure.security.FallbackWebSecurityAutoConfiguration,\

org.springframework.boot.autoconfigure.security.oauth2.OAuth2AutoConfiguration,\

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

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

org.springframework.boot.autoconfigure.social.SocialWebAutoConfiguration,\

org.springframework.boot.autoconfigure.social.FacebookAutoConfiguration,\

org.springframework.boot.autoconfigure.social.LinkedInAutoConfiguration,\

org.springframework.boot.autoconfigure.social.TwitterAutoConfiguration,\

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.DispatcherServletAutoConfiguration,\

org.springframework.boot.autoconfigure.web.EmbeddedServletContainerAutoConfiguration,\

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

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

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

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

org.springframework.boot.autoconfigure.web.ServerPropertiesAutoConfiguration,\

org.springframework.boot.autoconfigure.web.WebClientAutoConfiguration,\

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

org.springframework.boot.autoconfigure.websocket.WebSocketAutoConfiguration,\

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

org.springframework.boot.autoconfigure.webservices.WebServicesAutoConfiguration

每一個(gè)這樣的 xxxAutoConfiguration類都是容器中的一個(gè)組件仰挣,都加入到容器中伴逸;用他們來做自動(dòng)配置;

3)膘壶、每一個(gè)自動(dòng)配置類進(jìn)行自動(dòng)配置功能错蝴;

4)、以**HttpEncodingAutoConfiguration(Http編碼自動(dòng)配置)**為例解釋自動(dòng)配置原理颓芭;

@Configuration//表示這是一個(gè)配置類漱竖,以前編寫的配置文件一樣,也可以給容器中添加組件@EnableConfigurationProperties(HttpEncodingProperties.class)//啟動(dòng)指定類的ConfigurationProperties功能畜伐;將配置文件中對(duì)應(yīng)的值和HttpEncodingProperties綁定起來馍惹;并把HttpEncodingProperties加入到ioc容器中@ConditionalOnWebApplication//Spring底層@Conditional注解(Spring注解版),根據(jù)不同的條件玛界,如果滿足指定的條件万矾,整個(gè)配置類里面的配置就會(huì)生效;? ? 判斷當(dāng)前應(yīng)用是否是web應(yīng)用慎框,如果是良狈,當(dāng)前配置類生效@ConditionalOnClass(CharacterEncodingFilter.class)//判斷當(dāng)前項(xiàng)目有沒有這個(gè)類CharacterEncodingFilter;SpringMVC中進(jìn)行亂碼解決的過濾器笨枯;@ConditionalOnProperty(prefix ="spring.http.encoding", value ="enabled", matchIfMissing =true)//判斷配置文件中是否存在某個(gè)配置? spring.http.encoding.enabled薪丁;如果不存在,判斷也是成立的//即使我們配置文件中不配置pring.http.encoding.enabled=true馅精,也是默認(rèn)生效的严嗜;publicclassHttpEncodingAutoConfiguration{//他已經(jīng)和SpringBoot的配置文件映射了privatefinalHttpEncodingProperties properties;//只有一個(gè)有參構(gòu)造器的情況下,參數(shù)的值就會(huì)從容器中拿publicHttpEncodingAutoConfiguration(HttpEncodingProperties properties){this.properties = properties;}@Bean//給容器中添加一個(gè)組件洲敢,這個(gè)組件的某些值需要從properties中獲取@ConditionalOnMissingBean(CharacterEncodingFilter.class)//判斷容器沒有這個(gè)組件漫玄?publicCharacterEncodingFiltercharacterEncodingFilter(){CharacterEncodingFilter filter =newOrderedCharacterEncodingFilter();filter.setEncoding(this.properties.getCharset().name());filter.setForceRequestEncoding(this.properties.shouldForce(Type.REQUEST));filter.setForceResponseEncoding(this.properties.shouldForce(Type.RESPONSE));returnfilter;}

根據(jù)當(dāng)前不同的條件判斷,決定這個(gè)配置類是否生效?

一但這個(gè)配置類生效睦优;這個(gè)配置類就會(huì)給容器中添加各種組件渗常;這些組件的屬性是從對(duì)應(yīng)的properties類中獲取的,這些類里面的每一個(gè)屬性又是和配置文件綁定的汗盘;

5)皱碘、所有在配置文件中能配置的屬性都是在xxxxProperties類中封裝者‘;配置文件能配置什么就可以參照某個(gè)功能對(duì)應(yīng)的這個(gè)屬性類

@ConfigurationProperties(prefix ="spring.http.encoding")//從配置文件中獲取指定的值和bean的屬性進(jìn)行綁定publicclassHttpEncodingProperties{publicstaticfinalCharset DEFAULT_CHARSET = Charset.forName("UTF-8");

精髓:

?1)隐孽、SpringBoot啟動(dòng)會(huì)加載大量的自動(dòng)配置類

?2)尸执、我們看我們需要的功能有沒有SpringBoot默認(rèn)寫好的自動(dòng)配置類;

?3)缓醋、我們?cè)賮砜催@個(gè)自動(dòng)配置類中到底配置了哪些組件如失;(只要我們要用的組件有,我們就不需要再來配置了)

?4)送粱、給容器中自動(dòng)配置類添加組件的時(shí)候褪贵,會(huì)從properties類中獲取某些屬性。我們就可以在配置文件中指定這些屬性的值抗俄;

xxxxAutoConfigurartion:自動(dòng)配置類脆丁;

給容器中添加組件

xxxxProperties:封裝配置文件中相關(guān)屬性;

2动雹、細(xì)節(jié)

1槽卫、@Conditional派生注解(Spring注解版原生的@Conditional作用)

作用:必須是@Conditional指定的條件成立,才給容器中添加組件胰蝠,配置配里面的所有內(nèi)容才生效歼培;

@Conditional擴(kuò)展注解作用(判斷是否滿足當(dāng)前指定條件)

@ConditionalOnJava系統(tǒng)的java版本是否符合要求

@ConditionalOnBean容器中存在指定Bean;

@ConditionalOnMissingBean容器中不存在指定Bean茸塞;

@ConditionalOnExpression滿足SpEL表達(dá)式指定

@ConditionalOnClass系統(tǒng)中有指定的類

@ConditionalOnMissingClass系統(tǒng)中沒有指定的類

@ConditionalOnSingleCandidate容器中只有一個(gè)指定的Bean躲庄,或者這個(gè)Bean是首選Bean

@ConditionalOnProperty系統(tǒng)中指定的屬性是否有指定的值

@ConditionalOnResource類路徑下是否存在指定資源文件

@ConditionalOnWebApplication當(dāng)前是web環(huán)境

@ConditionalOnNotWebApplication當(dāng)前不是web環(huán)境

@ConditionalOnJndiJNDI存在指定項(xiàng)

自動(dòng)配置類必須在一定的條件下才能生效;

我們?cè)趺粗滥男┳詣?dòng)配置類生效钾虐;

==我們可以通過啟用 debug=true屬性噪窘;來讓控制臺(tái)打印自動(dòng)配置報(bào)告==,這樣我們就可以很方便的知道哪些自動(dòng)配置類生效效扫;

=========================AUTO-CONFIGURATION REPORT=========================Positive matches:(自動(dòng)配置類啟用的)-----------------? DispatcherServletAutoConfiguration matched:? ? ? -@ConditionalOnClassfound requiredclass'org.springframework.web.servlet.DispatcherServlet';@ConditionalOnMissingClassdid not find unwantedclass(OnClassCondition)- @ConditionalOnWebApplication(required)foundStandardServletEnvironment(OnWebApplicationCondition)Negative matches:(沒有啟動(dòng)倔监,沒有匹配成功的自動(dòng)配置類)-----------------? ActiveMQAutoConfiguration:? ? ? Did not match:? ? ? ? - @ConditionalOnClass did not find required classes 'javax.jms.ConnectionFactory', 'org.apache.activemq.ActiveMQConnectionFactory'(OnClassCondition)AopAutoConfiguration:? ? ? Did not match:? ? ? ? - @ConditionalOnClass did not find required classes 'org.aspectj.lang.annotation.Aspect', 'org.aspectj.lang.reflect.Advice'(OnClassCondition)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市菌仁,隨后出現(xiàn)的幾起案子浩习,更是在濱河造成了極大的恐慌,老刑警劉巖掘托,帶你破解...
    沈念sama閱讀 206,602評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瘦锹,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡闪盔,警方通過查閱死者的電腦和手機(jī)弯院,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來泪掀,“玉大人听绳,你說我怎么就攤上這事∫旌眨” “怎么了椅挣?”我有些...
    開封第一講書人閱讀 152,878評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長塔拳。 經(jīng)常有香客問我鼠证,道長,這世上最難降的妖魔是什么靠抑? 我笑而不...
    開封第一講書人閱讀 55,306評(píng)論 1 279
  • 正文 為了忘掉前任量九,我火速辦了婚禮,結(jié)果婚禮上颂碧,老公的妹妹穿的比我還像新娘荠列。我一直安慰自己,他們只是感情好载城,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評(píng)論 5 373
  • 文/花漫 我一把揭開白布肌似。 她就那樣靜靜地躺著,像睡著了一般诉瓦。 火紅的嫁衣襯著肌膚如雪川队。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,071評(píng)論 1 285
  • 那天睬澡,我揣著相機(jī)與錄音呼寸,去河邊找鬼。 笑死猴贰,一個(gè)胖子當(dāng)著我的面吹牛对雪,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播米绕,決...
    沈念sama閱讀 38,382評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼瑟捣,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了栅干?” 一聲冷哼從身側(cè)響起迈套,我...
    開封第一講書人閱讀 37,006評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎碱鳞,沒想到半個(gè)月后桑李,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,512評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評(píng)論 2 325
  • 正文 我和宋清朗相戀三年贵白,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了率拒。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,094評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡禁荒,死狀恐怖猬膨,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情呛伴,我是刑警寧澤勃痴,帶...
    沈念sama閱讀 33,732評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站热康,受9級(jí)特大地震影響沛申,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜姐军,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評(píng)論 3 307
  • 文/蒙蒙 一铁材、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧庶弃,春花似錦衫贬、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至缴守,卻和暖如春葬毫,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背屡穗。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評(píng)論 1 262
  • 我被黑心中介騙來泰國打工贴捡, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人村砂。 一個(gè)月前我還...
    沈念sama閱讀 45,536評(píng)論 2 354
  • 正文 我出身青樓烂斋,卻偏偏與公主長得像,于是被迫代替她去往敵國和親础废。 傳聞我的和親對(duì)象是個(gè)殘疾皇子汛骂,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評(píng)論 2 345

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