Spring Boot 核心(一)

ETFOX發表於2018-05-08

基本配置:

1.入口類和@SpringBootApplication

    springboot 通常有一個名為*Application 的入口類,入口類裡有一個 main 方法,這個 main 方法其實就是一個標準 Java 應用的入口方法。在 main 方法中使用    SpringApplication.run(Application.class, args); ,啟動 springboot 應用程式。

    @SpringBootApplication 是 springboot 的核心註解,它是一個組合註解,原始碼如下:

 * Copyright 2012-2017 the original author or authors.

package org.springframework.boot.autoconfigure;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import org.springframework.boot.SpringBootConfiguration;
import org.springframework.boot.context.TypeExcludeFilter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.ComponentScan.Filter;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.FilterType;
import org.springframework.core.annotation.AliasFor;

/**
 * Indicates a {@link Configuration configuration} class that declares one or more
 * {@link Bean @Bean} methods and also triggers {@link EnableAutoConfiguration
 * auto-configuration} and {@link ComponentScan component scanning}. This is a convenience
 * annotation that is equivalent to declaring {@code @Configuration},
 * {@code @EnableAutoConfiguration} and {@code @ComponentScan}.
 *
 * @author Phillip Webb
 * @author Stephane Nicoll
 * @since 1.2.0
 */
@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 {

	/**
	 * Exclude specific auto-configuration classes such that they will never be applied.
	 * @return the classes to exclude
	 */
	@AliasFor(annotation = EnableAutoConfiguration.class)
	Class<?>[] exclude() default {};

	/**
	 * Exclude specific auto-configuration class names such that they will never be
	 * applied.
	 * @return the class names to exclude
	 * @since 1.3.0
	 */
	@AliasFor(annotation = EnableAutoConfiguration.class)
	String[] excludeName() default {};

	/**
	 * Base packages to scan for annotated components. Use {@link #scanBasePackageClasses}
	 * for a type-safe alternative to String-based package names.
	 * @return base packages to scan
	 * @since 1.3.0
	 */
	@AliasFor(annotation = ComponentScan.class, attribute = "basePackages")
	String[] scanBasePackages() default {};

	/**
	 * Type-safe alternative to {@link #scanBasePackages} for specifying the packages to
	 * scan for annotated components. The package of each class specified will be scanned.
	 * <p>
	 * Consider creating a special no-op marker class or interface in each package that
	 * serves no purpose other than being referenced by this attribute.
	 * @return base packages to scan
	 * @since 1.3.0
	 */
	@AliasFor(annotation = ComponentScan.class, attribute = "basePackageClasses")
	Class<?>[] scanBasePackageClasses() default {};

}

    @SpringBootApplication 註解主要組合了 @Configuration 、@EnableAutoConfiguration、@ComponentScan;若不使用 @SpringBootApplication 註解則可以在入口類上面直接使用。

    其中,@EnableAutoConfiguration 讓 SpringBoot 根據類路徑中 jar 包依賴為當前專案進行自動配置。

    例如,新增了 spring-boot-starter-web 依賴,會自動新增 Tomcat 和 springmvc 的依賴,那麼 springboot 會對 Tomcat 和 springmvc 進行自動配置。

    又如,新增了 spring-boot-starter-data-jpa 依賴,springboot 會自動進行 jpa 相關的配置。

    springboot 會自動掃描 @SpringBootApplication  所在類的同級包以及包裡的 bean (若為 JPA 專案還可以掃描 @Entity 的實體類)。建議入口類放置的位置在 groupid+arctifactID  組合包下。


2.關閉特定的自動配置

    通過上面的 @SpringBootApplication 的原始碼我們可以看出,關閉特定的自動配置應該使用 @SpringBootApplication 註解的 exclude 引數,例如:

@SpringBootApplication(exclude = (xx.class))

3.定製 banner

1).修改 banner

    ①:在 springboot 啟動的時候會有一個預設的啟動圖案,見上篇文章截圖。

    ②:我們在 src/main/resources 下新建一個 banner.txt

    ③:通過 http://patorjk.com/software/taag 網站生成字元,複製到 banner.txt 




作者推薦 idea,個人還是偏愛 eclipse,用過 idea 還是不習慣!!!

4.springboot 的配置檔案

    springboot 使用一個全域性的配置檔案 application.properties 或 application.yml ,放置在 src/main/resource 目錄或者類路徑的 /config 下。


    springboot 不僅僅支援常規的 properties  配置檔案,還支援 yaml  語言的配置檔案。yaml 是以資料為中心的配置語言,在配置資料的時候具有物件導向的特徵。

    springboot 的全域性配置檔案的作用是對一些預設配置的配置值進行修改。

    ①:簡單示例:

            將 Tomcat 的預設埠 8080 改為 9090,並將預設的訪問路徑 / 修改為 /helloboot。

            可以在 application.properties 中新增:

            

        application.yml:

            

        從上面的配置可以看出,在 springboot 中,context-path、contextPath 或者 CONTEXT_PATH 形式其實是通用的。並且,yaml  的配置更加簡潔清晰。


5. starter pom

    spring boot 為我們提供了簡化企業級開發絕大多數場景的 starter pom, 只要使用了應用場景需要的 starter pom,相關的技術配置將會消除,就可以得到 springboot 為我們提供的自動配置的 bean。有官方和第三方提供的 starter pom.


6.使用 xml 配置

    springboot 提倡零配置,即無 xml 配置,但是實際專案中,可能有一些特殊要求你必須使用 xml 配置,這時我們可以通過 spring 提供的 @ImportResource 來載入 xml 配置,例如:

@ImportResource({"a.xml","b.xml"})

外部配置

    springboot 允許使用 properties 檔案、yaml 檔案或者命令列引數作為外部配置。

1. 命令列引數配置

    springboot 可以是基於 jar 包執行的,打成 jar 包的程式可以直接通過下面命令執行:

java -jar xx.jar

    可以通過一下命令修改 Tomcat 埠號

java -jar xx.jar --server.port=9090

2.常規屬性配置

    在 spring 環境下面,注入 properties 配置檔案,只需要通過註解 @PropertySource 指明 properties 檔案的位置,然後通過 @Value 注入值。在 springboot 裡,只需在 application.properties 裡定義屬性,然後直接使用 @Value 即可。




3.型別安全的配置(基於 properties)

    上例中使用@Value 注入每個配置在實際專案中會顯得格外麻煩,因為我們的配置通常會有許多個,若使用上例中的方式則要使用@Value 注入很多次。

    springboot 還提供了基於型別安全的配置方式,通過 @ConfigurationProperties 將 properties 屬性和一個 bean 及其屬性關聯,從而實現型別的安全的配置。




之前,按照作者的書一路看過來,碰到了第一個錯,springboot 會掃描所有的(或者同包下,猜測) Application 檔案,另外一個 @RequestMapping 也使用了 / ,本以為我啟動 SettingApplication  ,Application 不會有影響!小記。


日誌配置

    springboot 支援 Java Util Logging、Log4J、Log4J2 和 Logback 作為日誌框架,無論使用哪種日誌框架,springboot 已為當前使用日誌框架的控制檯輸出以及檔案輸出做好了配置。


Profile 配置

    Profile  是 spring 用來針對不同的環境對不同的配置提供支援,全域性 Profile 配置使用 application-{profile}.properties ( 如 application-prod.properties)。

通過 application.properties 中設定 spring.profiles.active= prod 來指定活動的 Profile。

下面我們做一個示例,我們分為生產環境和開發環境,生產環境埠號為 80, 開發環境為 8888。






相關文章