SpringBoot學習筆記--入門及配置

1、Spring Boot入門

1、 Srping Boot簡介

簡化Spring應用開發的一個框架

整個Spring技術棧的一個大整合css

J2EE開發的一站式解決方案html

二、微服務

martin fowler 總結說,微服務是一種架構風格java

一個應用應該是一組小型服務;能夠經過HTTP的方式進行互通react

每個功能元素最終都是一個可獨立替換和獨立升級的軟件單元。web

與之對應的是單體服務redis

詳細參照:spring

https://martinfowler.com/micr...

三、環境準備

一、maven配置

在maven的settings.xml配置文件的profiles標籤添加配置shell

<profile>
        <id>jdk-1.8</id>
        <activation>
            <activeByDefault>true</activeByDefault>
            <jdk>1.8</jdk>
        </activation>
        <properties>
            <maven.compiler.source>1.8</maven.compiler.source>
            <maven.compiler.target>1.8</maven.compiler.target>
            <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
        </properties>
    </profile>

二、IDEA設置

maven的相關配置json

四、Spring Boot HelloWorld

一個功能:數組

瀏覽器發送Hello請求,服務器接受請求並處理,響應Hello World字符串

一、 建立一個maven工程(jar)

二、導入相關依賴

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.1.RELEASE</version>
</parent>
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>

三、編寫一個主程序

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * @SpringBootApplication 來標註一個主程序,說明這是一個Spring Boot應用
 */
@SpringBootApplication
public class HelloWorldMainApplication {
    // spirng 應用啓動起來

    public static void main(String[] args) throws Exception {
        SpringApplication.run(HelloWorldMainApplication.class, args);
    }
}

四、建立Controller類

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class HelloController {
    @ResponseBody
    @RequestMapping("/hello")
    public String hello() {
        return "hello world";
    }
}

五、啓動服務

mvn spring-boot:run

六、打成一個可執行的jar包

pom.xml中增長,內容

<build>
        <plugins>
            <!-- 這個插件,能夠將應用打包成一個可執行的jar包 -->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

五、Hello World探究

一、POM文件

一、父項目

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

它來真正管理Spring Boot應用裏面的全部依賴版本,能夠稱之爲Spring Boot的版本仲裁中心,之後導入依賴默認不須要寫版本。

沒有在中心管理的依賴,天然須要聲明版本號。

二、導入的依賴

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

spring-boot-starter-web

spring-boot-starter : Spring Boot場景啓動器,幫咱們導入了web模塊正常運行所依賴的組件;

Spring Boot將全部的功能場景都抽取出來,作成一個個的starters(啓動器),只須要在項目裏引入這些starter,相關場景的全部依賴都會導入進來。須要什麼功能就導入什麼場景的啓動器

二、主程序類、主入口類

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * @SpringBootApplication 來標註一個主程序,說明這是一個spring boot應用
 */
@SpringBootApplication
public class HelloWorldMainApplication {
    // spirng 應用啓動起來

    public static void main(String[] args) throws Exception {
        SpringApplication.run(HelloWorldMainApplication.class, args);
    }
}

@SpringBootApplication: Spring Boot應用標註在某個類上,說明這個類是Spring Boot的主配置類,Spring Boot應該運行這個類的main方法來啓動Spring Boot應用

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Configuration
@EnableAutoConfiguration
@ComponentScan
public @interface SpringBootApplication

@Configuration

配置類上來標註這個註解

配置類----配置文件;配置類也是窗口中的一個組件,@Component

@EnableAutoConfiguration

​ 咱們須要配置的東西,Spring Boot幫咱們自動配置:@EnableAutoConfiguration告訴srpingboot開啓自動配置功能;這樣自動配置才能生效

@Target(value=TYPE)
@Retention(value=RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(value=EnableAutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration

@AutoConfigurationPackage

@Target(value=TYPE)
@Retention(value=RUNTIME)
@Documented
@Inherited
@Import(value=org.springframework.boot.autoconfigure.AutoConfigurationPackages.Registrar.class)
public @interface AutoConfigurationPackage
@**Import**(value=org.springframework.boot.autoconfigure.AutoConfigurationPackages.Registrar.class)

spring 的底層註解@Import,給容器中導入一個組件;導入的組件由AutoConfigurationPackages.Registrar.class管理;做用是<u>將主配置類所在包及下全部子包裏面的全部組件掃描到Spring容器中</u>

@Import(value=EnableAutoConfigurationImportSelector.class)

給容器導入組件:EnableAutoConfigurationImportSelector.class,導入哪些組件的選擇器;將全部須要導入的組件以全類名的方式返回;這些組件就會被添加到容器中。

有了自動配置類,免去了手動編寫配置和注入功能組件等工做

Spring Boot在啓動的時候,從類路徑下的META-INFO/spring.factories中獲取EnableAutoConfiguration指定的值,將這些值做爲自動配置類導入到容器中,自動配置類生效,從而能夠進行自動配置工做;之前須要本身配置的東西,自動配置類代爲完成了。

J2EE的總體整合解決方案和自動配置都在spring-boot-autoconfigure-**(此處爲版本號).jar

六、使用Spring Initializer快速建立Spring Boot應用

IDE都支持使用Spring項目建立嚮導快速建立一個Spring Boot項目

選擇須要的模塊,嚮導會聯網建立Spring Boot項目

默認生成的Spring Boot項目:

  • 主程序已經生成好了,只須要添加本身的邏輯
  • resources文件夾中的目錄結構

    • static:保存全部的靜態資源:js css images
    • templates:保存全部的模板頁面(Spring Boot默認jar包使用嵌入式的Tomcat,默認不支持JSP頁面);可使用模板引擎(freemarker、thymeleaf);
    • application.properties:Spring Boot應用的配置文件

2、Spring Boot配置

一、配置文件

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

  • application.properties
  • application.yml

配置文件的做用:修改Spring Boot自動配置的默認值;Spring是底層都給咱們配置好

YAML

標記語言

之前配置文件大多使用xml文件,YAML以數據爲中心,比json、xml等更適合作配置文件

配置例子

server:
    port: 8081

二、YAML語法

一、 基本語法

key:(空格)value表示一對鍵值對(必須有空格)

以空格的縮進來控制層級關係;只要是左對齊的一列數據,都是同一層級的

server:
    port: 8081
    path: /hello

屬性和值大小寫敏感

二、 值的寫法

字面量:普通的值(數字,字符串,布爾)

直接寫 k: v

​ 字符串默認不用加上單引號或者雙引號

​ 雙引號:不會轉義字符串裏面的特殊字符,特殊字符會做爲自己想表示的意思

對象、Map(屬性和值)(鍵值對)

k:v在下一行來寫對象的屬性和值的關係;注意縮進

對象仍是k: v的方式

friends:
    lastName: Zhang
    age: 20

數組(List、 Set)

用-值表示數組中的一個元素

pets: 
    - cat
    - dog
    - pig

三、配置文件值注入

yaml配置文件

person:
        lastName: zhangsan
        age: 18
        boss: false
        birth: 2017/12/12
        maps: {k1: v1, k2: v2}
        lists:
            - lisi
            - wangwu
            - zhaoliu
        dog:
            name: giggle
            age: 2

java bean

/**
 * 將配置文件中配置的每個屬性的值,映射到這個組件中
 * @ConfigurationProperties :告訴Spring Boot將本類中的全部屬性和配置文件中相關的配置進行綁定
 *     perfix = "person" : 配置文件中哪一個下面的全部屬性進行一一映射
 *      只要該組件是容器中的組件,才能使用容器中的功能
 */
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
    private String lastName;
    private Integer age;
    private Boolean boss;
    private Date birth;

    private Map<String, Object> maps;
    private List<Object> lists;
    private Dog dog;

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public Boolean getBoss() {
        return boss;
    }

    public void setBoss(Boolean boss) {
        this.boss = boss;
    }

    public Date getBirth() {
        return birth;
    }

    public void setBirth(Date birth) {
        this.birth = birth;
    }

    public Map<String, Object> getMaps() {
        return maps;
    }

    public void setMaps(Map<String, Object> maps) {
        this.maps = maps;
    }

    public List<Object> getLists() {
        return lists;
    }

    public void setLists(List<Object> lists) {
        this.lists = lists;
    }

    public Dog getDog() {
        return dog;
    }

    public void setDog(Dog dog) {
        this.dog = dog;
    }

    @Override
    public String toString() {
        return "Person{" +
                "lastName='" + lastName + '\'' +
                ", age=" + age +
                ", boss=" + boss +
                ", birth=" + birth +
                ", maps=" + maps +
                ", lists=" + lists +
                ", dog=" + dog +
                '}';
    }
}

單元測試

/**
 * Spring Boot 單元測試
 *
 * 能夠在測試期間很文件的相似編碼同樣進行自動注入到容器當中
 */
@RunWith(SpringRunner.class)
@SpringBootTest
public class HelloWorldMainApplicationTest {

    @Autowired
    Person person;

    @Test
    public void contextLoads() {
        System.out.println(person);
    }

}

能夠導入配置文件處理器,之後編寫配置文件就有提示了

<!-- 導入配置文件處理器,配置文件進行綁定就會有提示-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>

一、@Value獲取值和@ConfigurationProperties獲取值比較

@ConfigurationProperties @Value
功能 批量注入配置文件中的屬性 逐個指定
鬆散綁定(鬆散語法) 支持 不支持
SpEL 不支持 支持
JSR303數據校驗 支持 不支持
複雜類型封閉(如map) 支持 不支持

配置文件不論是yml仍是properties,兩種方式都能獲取到值;

若是隻是在某個業務邏輯中須要獲取一下配置文件中的某項值,就使用@Value;若是專門編寫了一個JavaBean來和配置文件進行映射,則使用@ConfigurationProperties

二、配置文件注入值數據校驗

@Component
@ConfigurationProperties(prefix = "person")
@Validated
public class Person {
    /**
     * <bean class="Person">
     * <property name="lastName" value="字面量/${key}/#{SpEL}從環境變量、配置文件中取值" />
     * </bean>
     */
    //lastName必須是email
    @Email
    private String lastName;
    private Integer age;
    private Boolean boss;
    private Date birth;

    private Map<String, Object> maps;
    private List<Object> lists;
    private Dog dog;
}

@PropertiesSource & @ImportResource

@PropertiesSource加載指定的配置文件

/**
 *      @ConfigurationProperties(prefix="person)  默認從全局配置文件中獲取值
 */
@Component
@ConfigurationProperties(prefix = "person")
@PropertySource(value = {"classpath:person.properties"})
public class Person {
    /**
     * <bean class="Person">
     * <property name="lastName" value="字面量/${key}/#{SpEL}從環境變量、配置文件中取值" />
     * </bean>
     */
    private String lastName;
    private Integer age;
    private Boolean boss;
    private Date birth;

    private Map<String, Object> maps;
    private List<Object> lists;
    private Dog dog;
}

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

Spring Boot裏面沒有Spring的配置文件,咱們本身編寫的配置文件,也不能自動識別;

若是須要讓Spring的配置文件生效,加載進來,須要將@ImportResource加到配置類上

@ImportResource(locations = {"classpath:beans.xml"})
導入spring配置文件使其生效,須要加在Spring配置類上

不來Spring配置文件

<?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.meituan.service.HelloService"></bean>

</beans>

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

配置類=========Spring配置文件

使用@Bean來給容器添加組件

/**
 * 指明當前類是一個配置類,用來替代以前的Spring配置文件
 *  在配置文件中用<bean></bean>標籤添加組件
 */
@Configuration
public class MyAppConfig {

    //將方法的返回值添加到容器中,容器中這個組件默認的id就是方法名
    @Bean
    public HelloService helloService() {
        return new HelloService();
    }
}

四、配置文件點位符

一、隨機數

${random.value}
${random.int}
${random.int(max)}
${random.int(min,max)}
${random.long}
${random.long(max)}
${random.long(min,max)}
${random.uuid}

二、佔位符獲取以前配置的值,若是沒有能夠指定默認值

dog:
            name: ${person.last-name:hello}_giggle
            age: 2
        last-name: zhangsan${random.uuid}

五、Profile

一、多Profile文件

在主配置文件編寫的時候,文件名能夠是application-{profile}.properties/yml,實現動態切換;默認使用application.properties/yml中的配置

二、yml支持多文檔塊方式

spring:
  profiles:
    active: dev

---
server:
  port: 8081
spring:
  profiles: dev

---
server:
  port: 8082
spring:
  profiles: prod

三、激活指定profile

  1. 在配置文件中指定spring.profiles.active=dev
spring:
  profiles:
    active: dev
  1. 命令行的方式激活
java -jar springboot.jar --spring.profile.active=dev
  1. 虛擬機參數
VM options:
    -Dspring.profiles.active=dev

六、配置文件加載位置

Spring Boot啓動會掃描如下位置的application.properties或者application.yml文件做爲Spring Boot的默認配置文件

    • file:./config/
    • file:./
    • classpath:/config/
    • classpath:/
    • 以上是按照優先級從高到低的順序,全部位置的文件都會被加載,高優先級配置會覆蓋低優先級配置內容;Spring Boot會從這個個位置所有加載主配置文件,實現互補配置
    • 能夠經過spring.config.location來改變默認配置;

    其中,file是指當前項目根目錄

    七、外部配置加載順序

    1. Devtools global settings properties on your home directory (~/.spring-boot-devtools.properties when devtools is active).
    2. @TestPropertySource annotations on your tests.
    3. @SpringBootTest#properties annotation attribute on your tests.
    4. Command line arguments.
    5. Properties from SPRING_APPLICATION_JSON (inline JSON embedded in an environment variable or system property)
    6. ServletConfig init parameters.
    7. ServletContext init parameters.
    8. JNDI attributes from java:comp/env.
    9. Java System properties (System.getProperties()).
    10. OS environment variables.
    11. A RandomValuePropertySource that only has properties in random.
    
    由jar包外向jar包內進行尋找,優先加載帶profile
    12. **Profile-specific application properties outside of your packaged jar (application-{profile}.properties and YAML variants)
    13. Profile-specific application properties packaged inside your jar (application-{profile}.properties and YAML variants)
    再加載不帶profile
    14. Application properties outside of your packaged jar (application.properties and YAML variants).
    15. Application properties packaged inside your jar (application.properties and YAML variants).**
    16. @PropertySource annotations on your @Configuration classes.
    17. Default properties (specified using SpringApplication.setDefaultProperties).

    八、 Spring Boot自動配置原理

    一、 精髓

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

    自動配置原理(很是重要)

    1)SpringBoot啓動的時候加載主配置類,開啓了自動配置功能

    2)@EnableAutoConfiguration做用:

    • 利用EnableAutoConfigurationImportSelector給容器中導入一些組件
    • List<String> configurations = this.getCandidateConfigurations(annotationMetadata, attributes);

    ​ 獲取候選的配置

    SpringFactoriesLoader.loadFactoryNames()
    掃描全部jar包類路徑下的文件:META-INF/spring.factories
    將掃描到的文件內容,包裝成Properties對象
    從Properties獲取到EnableAutoConfiguration.class(類名)對應的值,而後將其添加在容器中

    ​ 將類路徑下 META-INF/spring.factories 裏面配置的全部EnableAutoConfiguration的值加入到容器中。

    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

    3) 每個自動配置類自動配置

    4) 以HttpEncodingAutoConfiguration爲例解釋自動配置原理:

    @Configuration //表示這是一個配置類,與之前編寫的配置文件同樣,能夠給容器中添加組件
    @EnableConfigurationProperties({HttpEncodingProperties.class})//啓動指定類的ConfigurationProperties功能,將配置文件中對應的值和HttpEncodingProperties綁定起來,並加入到IOC容器中
    @ConditionalOnWebApplication//Spring底層有@Conditional註解,根據不一樣的條件,若是知足指定的條件,整個配置類纔會生效,當前註解判斷是否爲Web應用,若是是,當前配置類生效;
    @ConditionalOnClass({CharacterEncodingFilter.class})//判斷當前項目是否存在CharacterEncodingFilter類,是SpringMVC中亂碼解決的過濾器
    @ConditionalOnProperty(
        prefix = "spring.http.encoding",
        value = {"enabled"},
        matchIfMissing = true
    ) //判斷配置文件中是否存在某個配置
    public class HttpEncodingAutoConfiguration {
        
        //已經跟Spring配置文件映射起來了
        private final HttpEncodingProperties properties;
    
        //只有一個有參構造器時,參數的值會從容器中拿
        public HttpEncodingAutoConfiguration(HttpEncodingProperties properties) {
            this.properties = properties;
        }
        /**
        * 若是生效,則將下列組件添加到容器中
        */
        @Bean
        @ConditionalOnMissingBean({CharacterEncodingFilter.class})
        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) 全部在配置文件中能配置的屬性都在xxxxProperties類中封閉着,配置文件能配置什麼就能夠參照HttpEncodingProperties類

    @ConfigurationProperties(
        prefix = "spring.http.encoding"
    )
    public class HttpEncodingProperties

    Spring Boot 精髓:

    ​ 1)SpringBoot啓動會加載大量的自動配置類

    ​ 2) 須要的功能有沒有SpringBoot默認寫好的自動配置類

    ​ 3)再考察自動配置類中到底配置了哪些組件,若是已經有就不須要再配置了,若是沒有須要本身編寫配置類

    ​ 4)給容器中自動配置類添加組件的時候,會從Properties類中獲取某些屬性,此時能夠在配置文件中指定這些屬性的值

    xxxxAutoConfiguration:自動配置類,給容器添加組件

    xxxxProperties:封閉配置文件中的相關屬性

    二、細節

    @Conditional 派生註解

    @Conditional擴展註解 做用(判斷是否知足當前指定條件)
    @ConditionalOnJava 系統的java版本是否符合要求
    @ConditionalOnBean 容器中存在指定Bean;
    @ConditionalOnMissingBean 容器中不存在指定Bean;
    @ConditionalOnExpression 知足SpEL表達式指定
    @ConditionalOnClass 系統中有指定的類
    @ConditionalOnMissingClass 系統中沒有指定的類
    @ConditionalOnSingleCandidate 容器中只有一個指定的Bean,或者這個Bean是首選Bean
    @ConditionalOnProperty 系統中指定的屬性是否有指定的值
    @ConditionalOnResource 類路徑下是否存在指定資源文件
    @ConditionalOnWebApplication 當前是web環境
    @ConditionalOnNotWebApplication 當前不是web環境
    @ConditionalOnJndi JNDI存在指定項
    相關文章
    相關標籤/搜索