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)