Spring boot 提供了不少「starter」,它讓咱們能夠很是方便的把jar包添加到類路徑。
spring-boot-starter-parent是一個特殊的啓動器,提供了有用的mvn默認配置。另外,還提供了依賴管理的功能,所以添加依賴的時候能夠不用寫version。
其它的一些starter提供某一個類型的功能,若是使用了spring-boot-starter-web,那麼spring boot會假定這是一個web應用程序,並添加其相應的jar包(etc. hibernate、spring-mvc、jakson等)。
使用命令查看依賴圖
mvn dependency:treehtml
第一個類:java
@RestController @EnableAutoConfiguration public class Example { @RequestMapping("/") String home() { return "Hello World!"; } public static void main(String[] args) throws Exception { SpringApplication.run(Example.class, args); } }
@RestController and @RequestMapping annotations
@RestController:指定class扮演的角色,在這裏是指web @Controller,所以當接受到web 請求的時候,Spring 就會對該類進行相應處理。
@RequestMapping:提供路由信息,Spring將與之匹配的HTTP請求映射到其註解的方法。以後,@RestController告訴Spring將渲染結果返回給調用者。web
@EnableAutoConfiguration:Spring Boot會根據項目添加的jar包,進行spring相關配置。
Auto-configuration被設計爲根據 starter進行工做,可是,若是咱們使用非starter包,Spinrg Boot依然也能夠對其進行良好的自動配置功能。算法
main方法:就是一個程序入口點,經過調用run方法委託Spring boot的SpringApplication類進行。SpringApplication會啓動程序、自動配置(例如tomcat server)。Example.class告訴Spring boot 主程序是誰。spring
編譯程序、生成包,要在pom文件中加入:數據庫
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>
使用命令打包:
mvn package
api
推薦使用支持依賴管理,而且可使用maven central中組件的構建系統:maven或gradle。其它系統也可使用,可是支持效果不是很好。數組
每個Spring boot 發行版都提供了其支持的依賴項列表。由於咱們提供的依賴包,不須要指定使用的版本。spring-mvc
應用程序會從spring-boot-starter-parent項目繼承一些默認值。parent項目提供瞭如下功能:
1.默認JAVA1.6編譯器
2.utf8編碼的源碼
3.智能化的資源過濾
4.智能化的插件配置緩存
使用Spring boot ,一般是繼承parent pom:
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>SPRING BOOT RELEASE VERSION</version> </parent>
經過在pom文件中使用如下配置,來覆蓋默認的版本配置。
<properties> <spring-data-releasetrain.version>Fowler-SR2</spring-data-releasetrain.version> </proper
若是想使用顯示的方式進行maven管理,或者公司有本身的parent依賴要求。也能夠不繼承parent-starter來使用Spring Boot。詳情參考Using Spring Boot without the parent POM
爲了兼容性Spring boot默認使用較低的java版本。若是想使用本身的java版本,能夠這樣作:
<properties> <java.version>1.8</java.version> </properties>
starter是一組很方便使用的依賴描述符。使咱們能夠獲取一站式服務。例如:若是咱們須要spring-jpa來訪問數據庫,那麼只須要在pom中引入spring-boot-starter-data-jpa,而不須要將相關的jar包下載複製等繁瑣的操做。
若是不把類包含在package中,會被默認爲在"default package"中。這種狀況是要注意避免的,由於「default package」會致使Spring Boot中 @ComponentSacn ,@EntityScan or @SpringBootApplication註解掃描全部的java class,包括jar包。(推薦使用倒寫的域名)
將程序的main class 放在程序包的根路徑下(稱爲root package),@EnableAutoConfiguration一般做用在主類上,隱式的標識包搜索的基位置。例如:在編寫JPA應用程序的時候@EnableAutoConfiguration註釋類的包將用於搜索@Entity項目。
使用root package,咱們可用使用@ComponentScan註解而不須要制定Base package屬性。若是主類位於root package,也可使用@SpringBootApplication註釋main class。
Spring Boot支持基於Java的配置。雖然能夠用XML調用SpringApplication.run(),但咱們一般建議您的主要來源是@Configuration類。一般,用於將main class 定義爲 主@Configuration。
須要把全部的@Configuration放到一個類中。 @Import註釋可用於導入其餘配置類。或者,可使用@ComponentScan自動獲取全部Spring組件,包括@Configuration類。
若是必需要使用基於XML的配置,建議仍以@Configuration類開頭。而後您可使用@ImportResource註解來加載XML配置文件。
Spring Boot自動配置會嘗試根據添加的jar依賴項,自動配置應用程序。例如,若是類路徑中HSQLDB,而且您沒有手動配置任何數據庫鏈接Bean,那麼咱們將自動配置一個內存數據庫。
須要經過將@EnableAutoConfiguration或@SpringBootApplication註釋添加到其中一個@Configuration類來選擇自動配置。
[Tip]
您應該只添加一個@EnableAutoConfiguration註釋。咱們一般建議您將其添加到您的主要@Configuration類。
在任何位置均可以使用自定義配置來覆蓋掉自動配置。例如,若是添加了本身的DataSource bean,則默認的嵌入式數據庫支持將會失效。
若是想知道自動配置了什麼東西。使用--debug開關啓動程序。就會啓用選擇核心記錄器的調試日誌,並將自動配置報告打印到控制檯。
若是您發現正在應用您不須要的特定自動配置類,則可使用@EnableAutoConfiguration的exclude屬性來禁用它們。
@Configuration @EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class}) public class MyConfiguration { }
若是類不在類路徑中,能夠用註解的excludeName屬性,並指定其徹底限定名。 最後,還能夠經過spring.autoconfigure.exclude屬性來控制自動配置類的列表。
咱們可使用全部Spring 框架支持的技術,定義Bean和其依賴注入關係。爲了簡單、方便,咱們一般使用@ComponentScan查找Bean,結合@Autowired構造函數注入,來實現快速高效的依賴注入。
使用root package形式的代碼結構,咱們使用不帶任何參數的@ComponentScan註解,就能夠將(@Component,@Service,@Repository,@Controller等)全部應用程序組件自動註冊爲Spring Bean。
使用Spring Boot的推薦代碼結構,main class都會使用@Configuration, @EnableAutoConfiguration and @ComponentScan三個註解。如今Spring boot 提供了@SpringBootApplication註解用於和其三個註解進行等價替換。
因爲Spring Boot應用程序只是普通的Java應用程序,因此JVM熱插拔應該是開箱即用的。 JVM熱插拔在某種程度上受限於它能夠替換的字節碼,爲了得到更完整的解決方案,可使用JRebel或Spring Loaded項目。 spring-boot-devtools模塊還包括對快速應用程序從新啓動的支持。
詳情參考:https://docs.spring.io/spring-boot/docs/1.5.8.RELEASE/reference/htmlsingle/#using-boot-devtools
Spring Boot包含一組額外的工具,可使應用程序開發體驗更愉快。spring-boot-devtools模塊能夠包含在任何項目中以提供額外的開發時間功能。 要包含devtools支持,只需將模塊依賴關係添加到您的版本:
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional> </dependency> </dependencies>
Spring boot支持一些庫使用緩存機制來提升性能(如:模板、HTTP等緩存)。可是在調試、開發環節則會使咱們的代碼更改不能當即生效。spring-boot-devtools會禁用緩存選項。
任何類路徑下文件的更新、修改都會使spring-boot-devtools 重啓應用程序。
從新啓動vs從新加載
Spring Boot提供的重啓技術經過使用兩個類加載器來工做。不改變的類(例如來自第三方jar的類)被加載到 基類加載器中。您正在開發的類將加載到重啓 類加載器中。當應用程序從新啓動時,重啓 classloader被丟棄,並建立一個新的。這種方法意味着應用程序從新啓動一般比「冷啓動」快得多,由於基類加載器已經可用而且已經被填充了。
某些資源不必定須要在更改時觸發從新啓動。例如,Thymeleaf模板能夠就地編輯。默認狀況下,改變資源/META-INF/maven,/META-INF/resources,/resources,/static,/public或 /templates不會觸發從新啓動,但會引起 現場重裝。若是你想自定義這些排除,你可使用該spring.devtools.restart.exclude屬性。例如,要僅排除 /static,/public您將設置如下內容:
spring.devtools.restart.exclude=static/**,public/**
若是想讓不在類路徑裏的資源在更改的時候也能觸發重啓,配置spring.devtools.restart.additional-paths屬性來制定。
可使用上述的spring.devtools.restart.exclude屬性控制,在額外資源路徑下面 觸發restart仍是reload。
若是您不想使用從新啓動功能,則可使用該spring.devtools.restart.enabled屬性將其禁用 。在大多數狀況下,你能夠在你的設置 application.properties(這將仍然初始化重啓類加載器,但它不會監視文件的變化)。
若是您須要徹底禁用從新啓動支持,例如,由於它不適用於特定的庫,則須要在System調用SpringApplication.run(…)以前設置屬性 。例如:
public static void main(String[] args) { System.setProperty("spring.devtools.restart.enabled", "false"); SpringApplication.run(MyApp.class, args); }
對於自動重啓功能還有使用觸發文件、定製restart classloader、LiveReload、全局設置、遠程應用程序等,可參考官方文檔。
可執行的jar 程序可用於生產部署。 因爲它們是獨立的,所以它們也很是適合基於雲的部署。
對於額外的「生產就緒」功能,如健康,審計和度量REST或JMX端點; 考慮使用spring-boot-actuator
。
SpringApplication類提供了一個方便的方法來引導從main()方法啓動的Spring應用程序。 在不少狀況下,你能夠委託給靜態的SpringApplication.run方法:
public static void main(String[] args) { SpringApplication.run(MySpringConfiguration.class, args); }
若是程序沒法啓動,已註冊的FailureAnalyzers會提供錯誤消息和具體操做來解決問題。 咱們能夠定義本身的FailureAnalyzers:howto-failure-analyzer
1.經過在classpath 下添加banner.txt 文件。
若是默認的SpringApplication不符合本身的要求,咱們能夠建立一個本地實例,修改咱們想要使用、更改的配置。例如:關閉橫幅
public static void main(String[] args) { SpringApplication app = new SpringApplication(MySpringConfiguration.class); app.setBannerMode(Banner.Mode.OFF); app.run(args); }
傳遞給SpringApplication的構造函數參數是spring bean的配置源。 在大多數狀況下,這些將是對@Configuration類的引用,但也能夠是對XML配置或應掃描的包的引用。
也可使用application.properties文件來配置SpringApplication。 有關詳細信息參考:外部化配置。
以下:詳情可參考:SpringApplicationBuilder Javadoc
new SpringApplicationBuilder() .sources(Parent.class) .child(Application.class) .bannerMode(Banner.Mode.OFF) .run(args);
除了經常使用Spring框架事件,好比ContextRefreshedEvent,SpringApplication,Spring Boot還會發送一些其它應用程序事件。
[注意]
有些事件其實是在建立ApplicationContext以前觸發的,所以您不能將這些偵聽器註冊爲@Bean。您能夠經過SpringApplication.addListeners(...)或SpringApplicationBuilder.listeners(...)方法註冊它們。
若是您但願自動註冊這些監聽器而無論建立應用程序的方式如何,您能夠將META-INF / spring.factories文件添加到您的項目中,並使用org.springframework.context.ApplicationListener項來引用您的監聽器。
org.springframework.context.ApplicationListener = com.example.project.MyListener
事件會按照如下順序發送,就像您的應用程序運行同樣:
一、ApplicationStartingEvent:在運行開始時發送,但在除監聽器和初始化器註冊以外的任何處理以前發送。
二、ApplicationEnvironmentPreparedEvent:當在上下文中使用的環境是已知的,可是在建立上下文以前發送。
三、ApplicationPreparedEvent:在刷新開始以前發送,可是在bean定義加載以後。
四、ApplicationReadyEvent:在刷新以後發送,而且已經處理了任何相關的回調以指示應用程序已準備好爲請求提供服務。
五、ApplicationFailedEvent:若是啓動時出現異常,則發送
[Tip]
一般不須要使用應用程序事件,但要知道它們的存在。Spring Boot內部,使用事件來處理各類任務。
SpringApplication將會嘗試爲你建立正確類型的ApplicationContext。 默認狀況下,使用AnnotationConfigApplicationContext或AnnotationConfigEmbeddedWebApplicationContext,具體取決於您是否正在開發Web應用程序。
用於肯定「Web環境」的算法至關簡單(基於程序中存在的幾個類)。 若是您須要覆蓋默認值,可使用setWebEnvironment(boolean webEnvironment)。
也能夠經過調用setApplicationContextClass(...)來徹底控制ApplicationContext的類型。
[Tip]
在JUnit測試中使用SpringApplication時,一般須要調用setWebEnvironment(false)
。
@Component public class MyBean { @Autowired public MyBean(ApplicationArguments args) { boolean debug = args.containsOption("debug"); List<String> files = args.getNonOptionArgs(); // if run with "--debug logfile.txt" debug=true, files=["logfile.txt"] } }
若是你須要在SpringApplication啓動後運行一些特定的代碼,你能夠實現ApplicationRunner或者CommandLineRunner接口。 兩個接口都以相同的方式工做,並提供了一個將在SpringApplication.run(...)完成以前調用的單一運行方法。
CommandLineRunner接口做爲一個簡單的字符串數組提供對應用程序參數的訪問,而ApplicationRunner使用上面討論的ApplicationArguments接口。
[Tip]
若是定義了多個CommandLineRunner或ApplicationRunner bean,則能夠額外實現org.springframework.core.Ordered接口或使用org.springframework.core.annotation.Order註釋,而且必須按特定順序調用它們。
經過指定spring.application.admin.enabled屬性,能夠爲應用程序啓用與管理相關的功能。 這會致使在MBeanServer平臺上暴露SpringApplicationAdminMXBean。 您可使用此功能遠程管理您的Spring Boot應用程序。
Externalized Configuration
Spring boot支持外部化配置,所以能夠根據具體生產環境來配置本身的應用程序。可使用配置文件、環境變量、命令行參數、來進行配置。可使用@Value註解將屬性值直接注入Bean,使用Spring的 ?環境抽象? 或者@ConfigurationProperties註解的結構化對象。
import org.springframework.stereotype.* import org.springframework.beans.factory.annotation.* @Component public class MyBean { @Value("${name}") private String name; // ... }
屬性特徵通常寫在classpath下的application.properties文件。
my.secret=${random.value} my.number=${random.int} my.bignumber=${random.long} my.uuid=${random.uuid}
命令行以--server.port=9000
打頭便可。該類型的參數優先級高於配置文件。默認狀況下,spring boot會將其添加到應用程序環境中。
1.當前jar文件子目錄的/config文件
2.當前jar的跟目錄
3.類路徑下/config中的文件
spring: profiles: active: dev