1. 程式人生 > >Springboot 學習筆記

Springboot 學習筆記

嵌入 ase redis 創建app thp liquibase html ons city

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 學習筆記