此筆記主要是spring-boot-1.5.6版本的筆記,而且筆記都是博主本身一字一字編寫和記錄,有錯誤的地方歡迎你們指正。html
另:SpringBoot是最近幾年新出現的框架,簡便了Spring Framework框架的冗長配置,是的Spring於其餘框架的整合根更加的簡單。SpringBoot自己提供了一套默認的配置,使用約定大於配置的思想,使其開發人員的開發效率更高。博主在學習SpringBoot的時候,一邊學習一邊寫demo項目,demo項目能夠加博主建立的java交流羣(左上角公共欄),博主將會羣裏講demo項目共享給你們。demo項目主要整合了:Spring Boot+SpringMVC+Spring data jap +Hibernate+Shiro+Freemarker+Thymeleaf前端
1、基礎知識:
一、Spring Boot是由Spring的Pivotal團隊提供的全新框架,其設計目的是用來簡化新Spring應用的初始搭建以及開發過程。
Spring Boot的出現,不是代替Spring,而是簡化Spring的使用,爲Spring生態系統提供了一種固定的、約定優於配置風格
的框架,不須要配置大量的XMl文件來實現功能,同時提供了對不少框架的整合,只須要引入相關的依賴配置,便可實現對
某個框架的整合,從而省去不少配置工序。Spring Boot支持使用Maven的依賴配置或者是Groovy的Gradle配置。
官方網站: http://projects.spring.io/spring-boot/
快速建立基本項目:https://start.spring.io/
在線文檔:http://docs.spring.io/spring-boot/docs/1.5.6.RELEASE/reference/htmlsingle/#boot-documentation-about
附加:
Spring Boot內置支持Tomcat、Jetty等服務器,直接經過Main方法就能夠提供web服務。若是配合Docker虛擬容器技術,能夠方便快捷的搭建運行環境,實現簡單快捷的部署。
二、Spring Boot的簡便性,體如今定製了一套默認的規則,經過Maven引入相關的依賴包,Spring Boot檢測到依賴包導入後,就將
相應的bean加入IOC容器中,而使用者無需關係整合某個框架須要作的配置,直接獲取框架核心類便可使用。
三、demo目錄下是使用Spring Boot的案例。
spring-boot-basic.zip:是經過官方網站生成的最基本的Spring Boot項目,能夠直接在此項目上進行開發。
spring-boot-demo:是學習Spring Boot框架的練習項目。
四、Spring boot還提供了一個CTL(command line tool)命令行工具,能夠安裝此工具,而後經過命令來操做Spring項目,而且
可使用groovy的腳本,能夠根據須要進行安裝此工具。
五、Spring Boot在經過SpringApplication.run()方法啓動項目的時候,會判斷當前是否web環境(經過判斷是否存在javax.servlet.Servlet
或org.springframework.web.context.ConfigurableWebApplicationContext類並可否加載爲Class來判定),若是是web環境,則建立
StandardServletEnvironment類,不然建立StandardEnvironment類。
六、使用maven打包Spring Boot項目爲jar包後,會產生兩個jar包,例如 spring-boot-demo.jar 和 spring-boot-demo.jar.original
其中有original後綴的文件是maven編譯的原生jar包,裏面只有編譯後的項目文件和資源文件。而spring-boot-demo.jar包是
spring-boot-maven-plugin插件編譯的jar包,裏面除了項目文件和資源文件外,還有依賴的jar包和Spring Boot項目啓動增長
的額外class文件。部署項目時,應該使用spring-boot-demo.jar 這個jar包。
七、Spring Boot項目打包爲jar包後,會把依賴的jar包和Spring Boot項目啓動增長的額外class文件都加入此包,那麼就會出現jar包
裏面有jar包的狀況,即jar in jar的狀況,而JDK只能支持單個jar包加載的狀況,爲此Spring Boot作了擴展,定義了本身的
LaunchedURLClassLoader類加載器,以及相應的jar處理類進行了擴展。Spring Boot會把jar解壓方到臨時目錄(臨時目錄是讀取
System.getProperty("java.io.tmpdir")的屬性),而後在解壓的臨時文件讀取相應的jar包。
八、Spring Boot支持logback、log4j2,jdk (java util logging)三種日誌框架,其中默認是使用logback框架。默認會順序加載
classpath目錄下的logback-spring.xml、logback.xml,log4j2-spring.xml、log4j2.xml,logging.properties這幾種日誌配
置文件。官方建議優先使用-spring.xml的配置形式,以便讓spring徹底能夠控制日誌的初始化,使得日誌框架可使用Spring
的一些特殊功能和環境變量,例如可使用springProfile。
附加:若是application.properties和logback.xml定義了相同的配置,則以application.properties爲準。
2、使用筆記;
一、快速使用Spring框架,建立一個包含main方法入口類,增長SpringBootApplication配置便可。
@SpringBootApplication
public class SpringBootDemoApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootDemoApplication.class, args);
}
}
二、Spring Boot默認支持thymeleaf和freemarker模板,只須要在pom.xml文件中引入依賴的jar包便可。
<!--引入thymeleaf模板-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<!--引入freemarker模板-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
說明:對thymeleaf或者freemarker模板的配置,能夠在application.properties文件中進行相關的配置。
thymeleaf和freemarker模板是能夠共存的。即會優先使用freemarker判斷模板頁面是否存在,若是
存在,則使用freemarker模板,若是不存在,則再經過thymeleaf監測模板頁面是否存在,存在則解析
模板並返回給前端,反之拋出異常。
附加:一般Spring的ViewResolver視圖解析器是有多個的,將會根據Order順序來排序,按順序檢查是否有符合
解析的視圖,若是有則使用該視圖。freemarker和thymeleaf視圖的Order返回值都是2147483642,即優先級
是同樣的,此時是根據Bean的註冊順序來排序,freemarker是比thymeleaf優先註冊的,故能確保freemarker
視圖在thymeleaf視圖以前被解析。
注意:不能手動設置thymeleaf視圖的Order值,必需要保證其在freemarker視圖後面執行。由於thymeleaf不會判斷
模板頁面是否存在,當模板頁面不存在時,會直接拋出異常,而不會再嘗試使用其餘視圖解析器。
三、若是想增長Spring MVC的靜態資源或者是攔截器等配置,能夠新建一個配置類,繼承WebMvcConfigurerAdapter,而後
在此類增長@Configuration註解便可。代碼以下:
@Configuration
public class MyWebAppConfigurer extends WebMvcConfigurerAdapter {
//覆蓋須要增長配置的方法。
@Override
publicvoid addInterceptors(InterceptorRegistry registry) {
// 多個攔截器組成一個攔截器鏈
// addPathPatterns 用於添加攔截規則
// excludePathPatterns 用戶排除攔截
registry.addInterceptor(new MyInterceptor1()).addPathPatterns("/**");
registry.addInterceptor(new MyInterceptor2()).addPathPatterns("/**");
super.addInterceptors(registry);
}
}
四、在Spring Boot應用程序啓動後,若是想執行一些操做(例如加載數據),可實現CommandLineRunner接口,而且此類必須交給
Spring管理。在項目啓動完後,會依次遍歷執行實現CommandLineRunner接口的bean,bean執行順序能夠經過@Order註解或者
實現Order接口來設定(其中數值越小,優先級越高,默認是最大數值,即最小優先級)。
五、Spring Boot的application.properties配置文件是支持不一樣環境的配置的,命名形式爲application-環境標識.properties,
例如application-dev.properties 、 application-prd.properties 等形式。能夠在application.properties配置中指定
默認的環境,例如spring.profiles.active=dev。Spring Boot會加載application.properties配置,而後根據環境再加載
application-dev.properties配置,並覆蓋已經在application.properties中配置的內容。
指定環境的方式多種:
方式一(經過spring boot插件運行): mvn spring-boot:run -Drun.profiles=dev
方式二(經過命令運行jar文件):java -jar -Dspring.profiles.active=dev demo-0.0.1-SNAPSHOT.jar
方式三(經過IDE運行java類):在啓動的java類上,則增長Program arguments參數 --spring.profiles.active=dev
附加:(1)Spring框架自己就支持不一樣環境下的配置,若是是普通的javaee項目,能夠在web.xml文件下指定環境:
<context-param>
<param-name>spring.profiles.active</param-name>
<param-value>dev</param-value>
</context-param>
(2)Spring框架的bean自己也支持不一樣環境下生成不一樣的bean,若是是使用註解則在類上增長 @Profile("dev")配置,
若是是xml配置, 則聲明屬性<beans profile="dev">。
六、Spring Boot在啓動的時候的banner標語默認爲Spring,能夠本身進行個性化定製,定製方式有兩種:
第一種:src/main/resouces下新建banner.txt,經過banner.txt文件來定製標語。
第二種:實現org.springframework.boot.Banner接口,而後再也不使用SpringApplication.run()方法,
而是本身手動new SpringApplication()對象,經過此對象的setBanner(banner)方法指定實現類。
附加:若是不想顯示banner標語,還能夠在application.properties中配置spring.main.show-banner=false
七、Spring Boot默認只掃描啓動類的同包和子包下的註解類,其他包路徑下的註解將不會被掃描,能夠在啓動類中增長@ComponentScan註解
來指定掃描的包路徑。
八、默認狀況下,本身的項目pom.xml文件是繼承spring-boot-starter-parent的,若是自己本身項目有父maven項目,能夠將對Spring Boot
框架的繼承改成組合關係,修改以下:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>1.3.3.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
九、Spring Boot對jsp頁面的支持不友好,官方也不推薦使用jsp,推薦使用thymeleaf或者是freemarker模板。Spring Boot打包出來的
項目是jar包形式的,而使用jsp是基於標準的war包形式的規範,故使用Spring Boot打包成jar包時jsp頁面的存放路徑成了問題,
而且Spring Boot使用的是web3.0的標準,而jsp的jstl根據web3.0會出現兼容性問題。
十、在Spring Boot中使用Spring框架自帶的輕量級定時任務:
(1)增長@EnableScheduling註解,便可掃描@Scheduled註解。@Scheduled註解就是指定定時任務的方法和運行時間。
(2)Spring的定時任務,默認狀況下是同步串行執行的。所謂同步,是指同一個定時任務在執行完畢後纔開始從新計時,保證同一
個定時任務不會同時運行。串行執行,是指在執行多個定時任務時是按順序一個個執行的,而不是同時執行。
(3)若是要想將定時任務並行執行,可讓含有@EnableScheduling註解的類實現org.springframework.scheduling.annotation.SchedulingConfigurer
接口,根據接口的configureTasks方法的參數ScheduledTaskRegistrar.setScheduler設定自定義的Executor線程池。
(4)若是想將定時任務異步執行,可讓含有@EnableScheduling註解的類實現org.springframework.scheduling.annotation.AsyncConfigurer接口,
並在此實現類上增長@EnableAsync註解。同時,在含有@Scheduled註解的定時任務方法上,增長@Async註解。
附加:Spring定時任務能夠實現異步並行的模式,只須要同時知足(3)、(4)點的要求便可。但一般狀況下,定時任務都是要求同步執行的。
十一、Spring Boot對SpringMVC有着默認的配置,正常狀況下只須要直接配置@Controller或@RestController註解就可使用。在使用SpringMVC時,
若是須要制定Controller層的異常,只須要在控制層增長個異常處理方法,在方法上增長@ExceptionHandler註解便可。若是須要定製全局異常,
則在全局異常類上面增長@ControllerAdvice註解,而後定製@ExceptionHandler註解異常處理方法。
注意:詳細的異常處理方法優先於父類的異常方法(即若是是ArithmeticException異常,那麼定製有ArithmeticException異常將優先於Exception異常),
同時局部異常處理器又優先於全局異常處理器。即先以局部爲優先,若是局部有多個異常處理方法,則優先使用徹底匹配的異常。
十二、若是須要在freemarker中使用shiro標籤,引入以下依賴:
<dependency>
<groupId>net.mingsoft</groupId>
<artifactId>shiro-freemarker-tags</artifactId>
<version>0.1</version>
</dependency>
而後在Spring Boot啓動完畢後(可實現CommandLineRunner接口來肯定在啓動完畢後執行業務),注入FreeMarkerConfigurer對象,而後操做此對象,
增長siro標籤解析的模板 freeMarkerConfigurer.getConfiguration()setSharedVariable("shiro", new ShiroTags());
最終在ftl頁面相似於macro宏來使用,例如<@shiro.principal />。
/**********************************************************附加*********************************************************/
一、Spring Boot項目有兩種啓動方式:
方式一:經過IDE的run as - java application啓動。
方式二:經過maven執行命令 spring-boot:run方式啓動。
中止方式均可以直接在IDE的console輸出面板的 terminate 按鈕來終止服務。
二、Spring Boot默認狀況下是不支持熱部署的,但若是是在開發環境,能夠藉助springloaded設置爲熱部署狀態,從而減小服務器
的啓動次數。可是並非任何狀況下都能實現代碼的熱部署,若是發現部署不成功,則仍是須要從新啓動服務器。
方式一(經過IDE的run as啓動):
在啓動main方法的類中,配置run as的jvm啓動參數:
-javaagent:E:\javaSerial\springloaded-1.2.6\springloaded-1.2.6.RELEASE.jar -noverify
若是想運行debug模式,則直接執行debug as 方式便可。
方式二(經過maven啓動):
步驟一:配置pom.xml文件
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin </artifactId>
<!--若是不須要運行爲debug模式,則註釋掉jvmArguments標籤內容-->
<configuration>
<!--配置遠程debug模式-->
<jvmArguments>
-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005
</jvmArguments>
<!--配置啓動的main方法類-->
<mainClass>com.example.springbootdemo.SampleController</mainClass>
</configuration>
<dependencies>
<!--springloaded hot deploy -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>springloaded</artifactId>
<version>1.2.6.RELEASE</version>
</dependency>
</dependencies>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
<configuration>
<classifier>exec</classifier>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
步驟二:經過maven啓動項目,執行maven命令 spring-boot:run
步驟三:配置遠程deubg。在eclipse編輯器的Run-》Debug Configurations-》Remote Java Application -》new一個,
選擇正確的Project,而後修改Port端口爲5005,最後點擊Debug按鈕便可。
說明:使用方式二來執行debug模式時,使用eclipse輸出面板的terminate按鈕沒法終止服務器,須要經過系統的任務
管理器來終止java.exe進程,這是spring-boot-maven-plugin的一個bug,目前還未修復。故不推薦使用方式二
來執行debug模式,建議使用方式一經過IDE來運行,簡單又方便。
三、Spring Boot的項目默認是嵌入tomcat或jetty服務器,經過將項目打包爲jar包的形式運行的。若是想將項目外包爲war包,
部署到外部服務器上,能夠作如下處理:
步驟一:啓動類繼承SpringBootServletInitializer方法,並覆蓋configure方法指定啓動類,示例代碼以下:
@SpringBootApplication
public class SpringBootDemoApplication extends SpringBootServletInitializer {
public static void main(String[] args) {
SpringApplication.run(SpringBootDemoApplication.class, args);
}
/**
* 若是想把Spring Boot項目部署到外部的服務器,必需要覆蓋此方法,指定Spring Boot的啓動類。
*
*/
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(SpringBootDemoApplication.class);
}
}
步驟二:修改pom文件,將<packaging>jar</packaging>修改成<packaging>war</packaging>。
步驟三:修改pom文件,將tomcat或jetty服務器的jar包修改成provided的域,防止部署時與外部服務器的jar包衝突。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<!--修改域的依賴關係,打包時取出tomcat包-->
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<!--spring-boot-starter-web默認是依賴tomcat服務器的,預防衝突,最好在此排除tomcat包。-->
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
說明:Spring Boot項目生成的war包是沒有web.xml文件的,之因此能正常的部署到服務器中,並被正常的解析web項目,
是由於Spring Boot藉助了Servlet3.0版本的特性,使用javax.servlet.ServletContainerInitializer類來定製
Servlet容器的啓動,經過JDK的SPI來指定服務類(在/META-INF/services/目錄下配置),Spring MVC框架對此接
口有個實現類org.springframework.web.SpringServletContainerInitializer,此方法經過註解來指定獲取的
Class類型,@HandlesTypes(WebApplicationInitializer.class),會對因此實現了WebApplicationInitializer
接口的類都掃描出來,而後執行本身的初始化邏輯。SpringBootServletInitializer定義了抽象類來實現了此接口,
故須要咱們的啓動類來繼承SpringBootServletInitializer類,實現服務器的啓動邏輯。
四、Spring Boot中經常使用的註解:
@SpringBootApplication 負責啓動Spring Boot項目時的必要註解,聲明瞭註解掃描,註解配置,默認配置等功能。
@ControllerAdvice 對spring web中的Controller進行aop切入,一般是爲了執行Controller類的公共處理,配合
@ExceptionHandler, @InitBinder, or @ModelAttribute 等註解使用。
@ExceptionHandler 聲明異常處理,用在處理異常的方法,而且要求此類必須有@ControllerAdvice註解。
@RestController 聲明此Controller是提供RESTful接口的類,因此處理方法返回的結果都是寫入相應結果中。
可參照@ResponseBody的功能。
@ServletComponentScan 開始掃描是否有自定義的Servlet類(此類必須加@WebServlet註解)、過濾器類(此類必須加
@WebListener註解)和監聽器類(此類必須加@WebListener註解)
@Profile 根據不一樣環境來肯定是要生成此bean。
@Import 增長鬚要掃描的Bean,至關於xml的<import>元素。此實現類須要實現ImportBeanDefinitionRegistrar接口。
@ConfigurationProperties 讀取配置文件的信息並經過setter方法設置到當前bean中,能夠設定讀取的配置文件,
默認是讀取application.properties文件。此註解須要配合@EnableConfigurationProperties
註解來使用。
@EnableConfigurationProperties 開啓對@ConfigurationProperties註解的支持,並將指定的有@ConfigurationProperties類
做爲bean對象放入容器中,能夠注入到其餘bean。
@Configuration 指定某個類有經過@Bean註解來註冊的bean對象。
@ImportResource 指定xml配置文件,並加載。配置路徑時,支持classpath:前綴和file:前綴,一般使用classpath:前綴表示相對
目錄爲當前編譯目錄。
@SpringBootTest 運行junit單元測試的註解配置,會本身模擬web環境,而且會自動掃描啓動類並進行啓動。
五、Spring Boot的DAO層一般使用 Spring Data JPA來快速方便的操做數據庫,JPA的實現者一般爲Hibernate框架。在pom.xml文件增長
jpa依賴便可使用:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
關於Spring Data JPA的使用方式,能夠參考官方文檔:
https://docs.spring.io/spring-data/jpa/docs/1.11.7.RELEASE/reference/html/
java