Springboot 學習筆記
Springboot 學習筆記
一、springboot 入門
1、 Spring boot 簡介
2、 微服務
谷粒學院 學習idea
3、 環境準備
jdk1.8
maven 3.3以上
idea2017
SpringBoot 1.5.9
maven設置
給maven的settings.xml文件標簽添加
? profile jdk1.8
IDea設置 build > maven 設置自己的maven 和setting文件
4、Spring hello world
1、 創建一個maven工程(jar)
2、 導入依賴Springboot相關的依賴
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.9.RELEASE</version> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies>
<!--可以將應用打包成一個可執行的jar包--> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>
5、hello 探究
1、POM文件
1.父項目
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.9.RELEASE</version> </parent> 他的父項目是 <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>1.5.9.RELEASE</version> <relativePath>../../spring-boot-dependencies</relativePath> </parent> 他來真正管理Springboot應用裏面的所有依賴版本:
Spring Boot的版本仲裁中心:
以後導入依賴默認是不需要寫版本。(沒有在dependencies中管理的依賴自然需要聲明版本號)
2. 導入的依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
spring-boot-srarter-web
? springboot場景啟動器:導入了web模塊正常運行所依賴的組件;
Spring Boot將所有的功能場景都抽取出來,做成一個個的starters(啟動器),只需要在項目中引入這些starter相關場景的所有依賴都會導入進來,要用什麽功能,就導入什麽場景啟動器。
2、主程序類,主入口類
@SpringBootApplication
public class better {
public static void main(String[] args) {
SpringApplication.run(better.class,args);
}
}
@SpringBootApplication : Spring Boot 應用標註在某個類上,說明這個類是SpringBoot的主配置類,SpringBoot就應該運行這個類的main方法來啟動SpringBoot應用。
@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 @interface SpringBootApplication {
@SpringBootConfiguration : SpringBoot的配置類;
? 標註在某個類上,表示這是一個SpringBoot的配置類;
? @Configuration:配置類上來標註這個註解;
? 配置類------配置文件;配置類也是容器中的一個組件:@component
@EnableAutoConfiguration:開啟自動配置功能;
? 以前需要配置的東西,現在SpringBoot幫我們自動配置。
@AutoConfigurationPackage
@Import({EnableAutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {
@AutoConfigurationPackage:自動配置包
? @Import({Registrar.class})
? Spring的底層註解@Import,給容器中導入一個組件,導入的組件由Registrar.class
? 將主配置類(@SpringBootApplication標註的類)下面的包及下面所有組件掃描到Spring容器;
@Import({EnableAutoConfigurationImportSelector.class})
? 給容器中導入組件?
? EnableAutoConfigurationImportSelector:導入那些組件的選擇器:
? 將所有需要導入的組件以全類名的方式返回,這些組件就會被添加到容器中;
? 會給容器中導入非常多的自動配置類(xxxAutoConfiguration);就是給容器中導入這個場景需要的所有組件,並配置好這些組件;
有了自動配置類,免去手動編寫配置註入功能組件等工作;
SpringFactoriesLoader.loadFactoryNames(EnableAutoConfiguration.class,classLoader)
從類路徑下得META_INF/spring.factories中獲取EnableAutoConfiguration制定的值,將這些值作為自動配置陪導入到容器中,自動配置類就生效,幫我們進行自動配置工作。
6、 快速創建SpringBoot
- 默認生成的SpringBoot項目:
- 主程序已經生成好,只需要編輯自己的邏輯
- resources文件夾中的目錄結構
- static:保存所有的靜態資源;js css images;
- templates: 保存所有的模板頁面;(默認jar包,嵌入式tomcat,默認不支持jsp頁面),可以使用模板引擎(freemarker,thymeleaf);
- application.properties:SpringBoot應用的配置文件。可以修改一些默認設置。
二、配置文件
1、 配置文件properties比yml優先級高
SpringBoot使用一個全句的配置文件,配置文件名是固定的;
application.properties
application.yml
配置文件的作用:修改SpringBoot自動配置的默認值,SpringBoot在底層都給我們自動配置好了。
YAML, 是/不是一個標記語言
標記語言:
? 以前的配置文件:xxx.xml
? yaml:以數據為中心,比json、xml等更適合做配置文件。
2、YAML語法:
1.基本語法
? k: 空格V:表示一對鍵值對(空格必須有):
? 以空格的縮進來控制層級關系
server:
port: 8095
path: /hello
屬性和值也是大小寫敏感;
2.值的寫法
字面量:普通的值(數字、字符串,布爾)
? k: v: 字面直接來寫;
? 字符串默認不用加上單引號或者雙引號;
? ‘‘:會轉義特殊字符,特殊字符會被轉為一個普通的字符串輸出
? name: "zhangsan \n lisi"
? 輸出:zhangsan \n lisi
? "":不會轉義字符串裏面的特殊字符,特殊字符會作為本身想表示的意思
? name: "zhangsan \n lisi"
? 輸出:zhangsan
? lisi
對象(屬性和值)(鍵值對):
? k: v :在下一行來寫對象的屬性和值的關系,註意縮進
? 對象還是k: v的方式
friends:
lastName: zhangsan
age: 20
?
數組(list、set):
用-值表示數組中的一個元素
pets:
- cat
- dog
- pig
pets: [cat,dog,pig]
3.配置文件值註入
配置文件yml
person:
lastName: zhangsan
age: 18
boss: false
birth: 2018/10/10
maps: {
k1: v1,
k2: 12,
k3: 20
}
lists:
- lisi
- wangwu
dog:
name: 小狗
age: 2
javaBean:
/**
*通過@ConfigurationProperties(prefix = "person")註入
*/
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
private String lastName;
private Integer age;
private Boolean boos;
private Date birth;
private Map<String,Object> maps;
private List<Object> lists;
private Dog dog;
我們可以導入pom.xml配置文件處理器,這樣編寫yml就會有提示
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
@Value("${person.last-name}")
private String lastName;
@Value("#{11*2}")
private Integer age;
@Value("true")
private Boolean boos;
1.idea中yml配置文件默認utf-8有可能亂碼
2.@value獲取值與@configurationProperties獲取值比較
@configurationProperties | @value | |
---|---|---|
功能 | 批量註入配置文件中的屬性 | 一個個指定 |
松散綁定 | 支持 | 不支持 |
SpEL | 不支持 | 支持(#/${}...) |
JSR303數據校驗 | 支持 | 不支持 |
支持 | 不支持 |
配置文件yml還是properties他們都能獲取到值。
如果說,我們只是在某個業務邏輯中,需要獲取一下配置文件中的某項值,我們使用@value
如果為list或map或專門編寫了一個javaBean來和配置文件進行映射,使用@ConfigurationProperties。
3.配置文件註入值數據校驗
@ConfigurationProperties(prefix = "person")
@Validated
4.@PropertySource與ImportResource
/**
* 將配置文件中配置的每一個屬性的值,映射到這個組件中
* @ConfigurationProperties: 告訴springboot將奔雷中的所有屬性和配置文件中的相關的配置進行綁定
* prefix = "persion" : 配置文件中哪個下面的所有屬性進行一一映射
* 只有這個組件是容器中的組件,才能使用容器提供的ConfigurationProperties功能
* @ConfigurationProperties(prefix = "person")默認從全局配置文件中獲取值;
*/
@PropertySource(value = {"classpath:person.properties"})
@Component
@ConfigurationProperties(prefix = "person")
@Validated
public class Person {
// @Value("${person.last-name}")
private String lastName;
// @Value("#{11*2}")
private Integer age;
// @Value("true")
private Boolean boos;
private Date birth;
private Map<String,Object> maps;
private List<Object> lists;
private Dog dog;
@ImportResource: 導入Spring的配置文件,讓配置文件裏面的內容生效;
SpringBoot裏面沒有Spirng的配置文件,我們自己編寫的配置文件,也不能自動識別;
想讓Spring的配置文件生效,加載進來@importResource,標註在一個配置類上
@ImportResource(locations = {"classpath:beans.xml"})
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
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">
<bean id="helloService" class="com.better.springhelloword.service.HelloService"></bean>
</beans>
SpringBoot推薦給容器中添加組件的方式:
1.配置類===Spring配置文件
2.使用@Bean給容器中添加組件
/**
*@Configuration:指明當前類是一個配置類,就是來替代之前的Spring配置文件
* 在配置文件中用<bean><bean/> 標簽添加組件
*/
@Configuration
public class MyAppConfig {
//將方法的返回值添加到容器中
@Bean
public HelloService helloService(){
System.out.println("配置類:");
return new HelloService();
}
}
4、配置文件占位符
1.隨機數
person.last-name=李四${random.uuid}
person.age=${random.int}
2.占位符獲取之前的配置的值,如果沒有可以用:指定默認值
person.dog.name=${person.last-name}_dog
person.dog.name=${person.hello:hello}_dog
5、Profile
1、多Profile文件
我們在主配置文件編寫的時候,文件名可以是application-{profile}.properties/yml
2、yml支持多文檔塊方式
server:
port: 8095
spring:
profiles:
active: prod
---
server:
port: 8080
spring:
profiles: dev
---
server:
port: 8081
spring:
profiles: prod
3、激活指定profile
創建application-dev.properties
1.在配置文件(application.properties)中指定spring.profiles.active=dev
2.命令行參數:program arguments:
? --spring.profiles.active=dev
? 運行jar包
? java -jar spring-boot-02-config-0.1.1.jar --spring.profiles.active=dev
3.虛擬機參數 VM options:
? -Dspring.profiles.active=dev
6、配置文件加載位置(高>低)
-file:../config/
-file:../
-classpath:../config/
-classpath:../
高優先級的配置會覆蓋低優先級的配置。(所有配置文件都會加載,會形成互補機制)
我們還可以通過spring.config.location來改變默認的配置文件位置
項目打包好之後,我們可以使用命令行參數的形式,啟動項目的時候來指定配置文件的新位置;指定配置文件和默認加載的這些配置文件共同起作用形成互補配置;
7、外部配置加載順序
SpringBoot也可以從以下位置加載配置;優先級從高到低,高優先級的配置覆蓋低優先級的配置,所有的配置會形成互補配置。
java -jar spring.jar --參數 --參數...
多個參數可以用空格分開
由jar包外向jar包內進行尋找;優先加載帶profile,再來加載不帶profile的。
8、自動配置原理
配置文件到底能寫什麽?怎麽寫?自動配置原理;
springboot官方文檔
1、自動配置原理;
? 1) SpringBoot啟動的時候加載主配置類,開啟了自動配置功能==@EnableAutoConfiguration==
? 2) @EnableAutoConfiguration作用:
? 利用AutoConfigurationImportSelector給容器中導入了一些組件
? 可以查看selectImports()方法的內容;
? ==參照5.3 快速創建SpringBoot中的自動配置==
有了自動配置類,免去手動編寫配置註入功能組件等工作;
SpringFactoriesLoader.loadFactoryNames(EnableAutoConfiguration.class,classLoader)
從類路徑下得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.CloudServiceConnectorsAutoConfiguration,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.jdbc.JdbcRepositoriesAutoConfiguration,org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration,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.elasticsearch.rest.RestClientAutoConfiguration,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.SecurityRequestMatcherProviderAutoConfiguration,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.servlet.OAuth2ClientAutoConfiguration,org.springframework.boot.autoconfigure.security.oauth2.client.reactive.ReactiveOAuth2ClientAutoConfiguration,org.springframework.boot.autoconfigure.security.oauth2.resource.servlet.OAuth2ResourceServerAutoConfiguration,org.springframework.boot.autoconfigure.security.oauth2.resource.reactive.ReactiveOAuth2ResourceServerAutoConfiguration,org.springframework.boot.autoconfigure.solr.SolrAutoConfiguration,org.springframework.boot.autoconfigure.task.TaskExecutionAutoConfiguration,org.springframework.boot.autoconfigure.task.TaskSchedulingAutoConfiguration,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.ClientHttpConnectorAutoConfiguration,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,org.springframework.boot.autoconfigure.webservices.client.WebServiceTemplateAutoConfiguration
3)每一個自動配置了進行自動配置功能
4)以HttpEncodingAutoConfiguration為例解釋自動配置原理。
@Configuration //表示這是一個配置類,以前編寫的配置文件一樣,也可以給容器中添加組件
@EnableConfigurationProperties(HttpProperties.class) //啟動ConfigurationProperties功能,將配置文件中對應的值和HtppEncodingProperties綁定起來;
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET)//Spring底層的註解,根據不同的標間,如果滿足指定的條件,整個配置類裏面的配置就會生效 判斷是否web應用,是就生效
@ConditionalOnClass(CharacterEncodingFilter.class)//判斷當前項目有沒有這個類,CharacterEncodingFilter:SpringMVC中進行亂碼解決的過濾器
@ConditionalOnProperty(prefix = "spring.http.encoding", value = "enabled", matchIfMissing = true)//判斷配置文件中是或否存在某個配置,spring.http.encoding.enabled,如果不存在判斷也是成立的
public class HttpEncodingAutoConfiguration {
//只有一個有殘構造器的情況下,參數的值就會從容器中拿
public HttpEncodingAutoConfiguration(HttpProperties properties) {
this.properties = properties.getEncoding();
}
@Bean //給容器中添加一個組件,這個組件的某些值從properties中獲取
@ConditionalOnMissingBean
public CharacterEncodingFilter characterEncodingFilter() {
CharacterEncodingFilter filter = new OrderedCharacterEncodingFilter();
filter.setEncoding(this.properties.getCharset().name());
filter.setForceRequestEncoding(this.properties.shouldForce(Type.REQUEST));
filter.setForceResponseEncoding(this.properties.shouldForce(Type.RESPONSE));
return filter;
}
根據當前不同的條件判斷,決定這個配置類是否生效
一旦這個配置類生效,這個屬性類就會給容器中添加各種組件,這些組件的屬性是從對飲的properties類中獲取的,這些類裏面的每個屬性又是和配置類綁定的,
5) 所有在配置文件中能配置的屬性都是在xxxproperties類中封裝著,配置文件能配置什麽可以參照某個功能對應的屬性類
@ConfigurationProperties(prefix = "spring.http") //從配置文件中獲取指定的值和bean的屬性進行綁定
public class HttpProperties {
2、細節
1. @conditional派生註解(Spring註解版原生的@conditional作用)
作用:必須是@conditional指定的條件成立,才給容器中添加組件,配置類裏面的所有內容才生效。
自動配置類必須在一定的條件下才能生效。
如何查看生效的配置類:
我們可以通過啟用debug=true屬性,來讓控制臺答應自動配置報告,這樣我們就可以很方便的知道哪些自動配置類生效。
Positive matches: 自動配置類啟用的自動配置類
Negative matches:自動配置類未啟用的自動配置類
21日誌
四、SpringBoot與web開發
1、使用SpringBoot:
1)創建SpringBoot應用,選中我們需要的模塊;
2)SpringBoot已經默認將這些場景配置好了,只需要在配置文件中指定少量配置,就可以運行起來
3) 自己編寫業務代碼
自動配置原理?
這個場景SpringBoot幫我們配置了什麽?能不能修改?能修改哪些配置,能不能擴展?
xxxAutoConfiguration:幫我們給容器中自動配置組件
xxxProperties:配置類來封裝配置文件的內容
2、SpringBoot對靜態資源的映射規則
@ConfigurationProperties(prefix = "spring.resources", ignoreUnknownFields = false)
public class ResourceProperties {
// 可以設置和靜態資源有關的參數,緩存時間等
private static final String[] CLASSPATH_RESOURCE_LOCATIONS = {
"classpath:/META-INF/resources/", "classpath:/resources/",
"classpath:/static/", "classpath:/public/" };
@Override//映射所有靜態資源
public void addResourceHandlers(ResourceHandlerRegistry registry) {
if (!this.resourceProperties.isAddMappings()) {
logger.debug("Default resource handling disabled");
return;
}
Duration cachePeriod = this.resourceProperties.getCache().getPeriod();
CacheControl cacheControl = this.resourceProperties.getCache()
.getCachecontrol().toHttpCacheControl();
if (!registry.hasMappingForPattern("/webjars/**")) {
customizeResourceHandlerRegistration(registry
.addResourceHandler("/webjars/**")
.addResourceLocations("classpath:/META-INF/resources/webjars/")
.setCachePeriod(getSeconds(cachePeriod))
.setCacheControl(cacheControl));
}
String staticPathPattern = this.mvcProperties.getStaticPathPattern();
if (!registry.hasMappingForPattern(staticPathPattern)) {
customizeResourceHandlerRegistration(
registry.addResourceHandler(staticPathPattern)
.addResourceLocations(getResourceLocations(
this.resourceProperties.getStaticLocations()))
.setCachePeriod(getSeconds(cachePeriod))
.setCacheControl(cacheControl));
}
}
//映射所有圖標路徑 "**/favicon.ico"
@Bean
public SimpleUrlHandlerMapping faviconHandlerMapping() {
SimpleUrlHandlerMapping mapping = new SimpleUrlHandlerMapping();
mapping.setOrder(Ordered.HIGHEST_PRECEDENCE + 1);
mapping.setUrlMap(Collections.singletonMap("**/favicon.ico",
faviconRequestHandler()));
return mapping;
}
//映射歡迎首頁
@Bean
public WelcomePageHandlerMapping welcomePageHandlerMapping(
ApplicationContext applicationContext) {
return new WelcomePageHandlerMapping(
new TemplateAvailabilityProviders(applicationContext),
applicationContext, getWelcomePage(),
this.mvcProperties.getStaticPathPattern());
}
1) 所有/webjars/都去classpath:/META-INF/resources/webjars/找資源;
webjars:以jar包的方式引入靜態資源;
2) “/”訪問當前項目的任何資源(靜態資源的文件夾)
"classpath:/META-INF/resources/",
"classpath:/resources/",
"classpath:/static/",
"classpath:/public/"
"/" 當前項目的根路徑
如果自定義了,默認的路徑就失效
localhost:8080/abc 去類路徑下找abc
http://localhost:8005/static/admin/css/page.css
3) 歡迎頁;靜態資源文件夾下得所有index.html頁面,被“/”映射;
localhost:8080 / 找資源下的index頁面
4)所有頁面下“/favicon.ico” 都是在靜態資源文件下找‘
3、模板引擎
JSP、Velocity、Freemarker、Thymeleaf
Thymeleaf:語法更簡單,功能更強大;
1) 引入Thymeleaf;
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
可以通過手動修改版本,
2)Thymeleaf使用&語法
public class ThymeleafProperties {
private static final Charset DEFAULT_ENCODING = Charset.forName("UTF-8");
private static final MimeType DEFAULT_CONTENT_TYPE = MimeType.valueOf("text/html");
public static final String DEFAULT_PREFIX = "classpath:/templates/";
public static final String DEFAULT_SUFFIX = ".html";
//只要我們把Html頁面放在classpaath:/templates/,thymeleaf就能自動渲染
//只要我們把Html頁面放在classpaath:/templates/,thymeleaf就能自動渲染
Springboot 學習筆記