Spring-Boot學習筆記

Spring-Boot 1.5 學習筆記

使用Spring Boot很容易建立一個獨立運行(運行jar,內嵌Servlet容器)、準生產級別的基於Spring框架的項目,使用Spring Boot你能夠不用或者只須要不多的Spring配置。 html

Spring將不少魔法帶入了Spring應用程序的開發之中,其中最重要的是如下四個核心。java

  • 自動配置:針對不少Spring應用程序常見的應用功能,Spring Boot能自動提供相關配置
  • 起步依賴:告訴Spring Boot須要什麼功能,它就能引入須要的庫。
  • 命令行界面:這是Spring Boot的可選特性,藉此你只需寫代碼就能完成完整的應用程序,無需傳統項目構建。
  • Actuator:讓你可以深刻運行中的Spring Boot應用程序,一探究竟。

Java版本:推薦使用java8mysql

構建一個Sping Boot的Maven項目,強烈推薦Spring Initializr,它從本質上來講就是一個Web應用程序,它能爲你生成Spring Boot項目結構。
Spring Initializr有幾種用法:git

@SpringBootApplication是Sprnig Boot項目的核心註解,主要目的是開啓自動配置。
使用命令 mvn spring-boot:run」在命令行啓動該應用github

配置文件

spring-boot配置文件application.properties支持的屬性列表:http://docs.spring.io/spring-...
一、直接在要使用的地方經過註解@Value(value=」${configName}」)就能夠綁定到你想要的屬性上面。
二、在application.properties中的各個參數之間也能夠直接引用來使用。web

com.name="111"
com.want="222"
com.dudu.yearhope=${com.name}-${com.want}

三、有時候屬性太多了,一個個綁定到屬性字段上太累,官方提倡綁定一個對象的bean,這裏咱們建一個ConfigBean.java類,頂部須要使用註解@ConfigurationProperties(prefix = 「com.xxx」)來指明使用哪一個.這點能夠參考:org.springframework.boot.autoconfigure.jdbc.DataSourceProperties類的寫法spring

這裏配置完還須要在spring Boot入口類加上@EnableConfigurationProperties並指明要加載哪一個bean
好比:@EnableConfigurationProperties(DataSourceProperties.class)sql

四、有時候咱們不但願把全部配置都放在application.properties裏面,這時候咱們能夠另外定義一個,如test.properties,路徑跟也放在src/main/resources下面。
咱們新建一個bean類,以下:shell

@Configuration
@ConfigurationProperties(prefix = "com.md") 
@PropertySource("classpath:test.properties")
public class ConfigTestBean {
    private String name;
    private String want;
    // 省略getter和setter
}

五、隨機值配置
配置文件中${random} 能夠用來生成各類不一樣類型的隨機值,從而簡化了代碼生成的麻煩,例如 生成 int 值、long 值或者 string 字符串。數據庫

dudu.number=${random.int}
dudu.uuid=${random.uuid}
dudu.number.less.than.ten=${random.int(10)}
dudu.number.in.range=${random.int[1024,65536]}

六、外部配置-命令行參數配置
如java -jar xx.jar --server.port=9090
其中server.port是application.properties裏面的選項

七、Profile-多環境配置
在Spring Boot中多環境配置文件名須要知足application-{profile}.properties的格式,其中{profile}對應你的環境標識,好比:
application-dev.properties:開發環境
application-prod.properties:生產環境
想要使用對應的環境,有兩種方式

  • 只須要在application.properties中使用spring.profiles.active屬性來設置,值對應上面提到的{profile},這裏就是指dev、prod這2個。
  • 固然你也能夠用命令行啓動的時候帶上參數:

java -jar xxx.jar --spring.profiles.active=dev

  • 還能夠像這樣設置SPRING_PROFILES_ACTIVE環境變量:

$ export SPRING_PROFILES_ACTIVE=production

在代碼裏,咱們還能夠直接用@Profile註解來進行配置
以下:

/**
  * 測試數據庫
  */
@Component
@Profile("testdb")
public class TestDBConnector implements DBConnector {
    @Override
    public void configure() {
        System.out.println("testdb");
    }
}
/**
 * 生產數據庫
 */
@Component
@Profile("devdb")
public class DevDBConnector implements DBConnector {
    @Override
    public void configure() {
        System.out.println("devdb");
    }
}

經過在配置文件激活具體使用哪一個實現類spring.profiles.active=testdb

啓動原理解析

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

@SpringBootApplication與@EnableAutoConfiguration

@SpringBootApplication背後:打開源碼看看,有三個Annotation原註解:

  • @Configuration(@SpringBootConfiguration點開查看發現裏面仍是應用了@Configuration)
  • @EnableAutoConfiguration
  • @ComponentScan(若是不指定basePackages等屬性,則默認Spring框架實現會從聲明@ComponentScan所在類的package進行掃描。)

@EnableAutoConfiguration這個Annotation最爲重要(點開源碼看看),Spring框架提供的各類名字爲@Enable開頭的Annotation定義?好比@EnableScheduling、@EnableCaching、@EnableMBeanExport等,@EnableAutoConfiguration的理念和作事方式其實一脈相承,簡單歸納一下就是,藉助@Import的支持,收集和註冊特定場景相關的bean定義。

  • @EnableScheduling是經過@Import將Spring調度框架相關的bean定義都加載到IoC容器。
  • @EnableMBeanExport是經過@Import將JMX相關的bean定義加載到IoC容器。
  • 而@EnableAutoConfiguration也是藉助@Import的幫助,將全部符合自動配置條件的bean定義加載到IoC容器,僅此而已!

藉助於Spring框架原有的一個工具類:SpringFactoriesLoader的支持,@EnableAutoConfiguration能夠智能的自動配置
SpringFactoriesLoader屬於Spring框架私有的一種擴展方案,其主要功能就是從指定的配置文件META-INF/spring.factories加載配置。
@EnableAutoConfiguration自動配置的魔法騎士是從classpath中搜尋全部的META-INF/spring.factories配置文件,並將其中org.springframework.boot.autoconfigure.EnableutoConfiguration對應的配置項(主要在SpringBoot的autoconfigure依賴包中)經過反射(Java Refletion)實例化爲對應的標註了@Configuration的JavaConfig形式的IoC容器配置類,而後彙總爲一個並加載到IoC容器。

SpringApplication執行流程

1) 若是使用的是SpringApplication.run靜態方法,那麼,這個方法裏面首先要建立一個SpringApplication實例,在初始化的時候,它會提早作幾件事情:

  • 根據classpath裏面是否存在某個特徵類(org.springframework.web.context.ConfigurableWebApplicationContext)來決定是否應該建立一個爲Web應用使用的ApplicationContext類型。
  • 使用SpringFactoriesLoader在應用的classpath中查找並加載全部可用的ApplicationContextInitializer,ApplicationListener

2)執行run方法的邏輯,首先遍歷執行全部經過SpringFactoriesLoader能夠查找到並加載的SpringApplicationRunListener。調用它們的started()方法。而後
建立並配置當前Spring Boot應用將要使用的Environment(包括配置要使用的PropertySource以及Profile)。而後遍歷調用全部SpringApplicationRunListener的environmentPrepared()的方法。以後,若是SpringApplication的showBanner屬性被設置爲true,則打印banner。

3) 根據用戶是否明確設置了applicationContextClass類型以及初始化階段的推斷結果,決定該爲當前SpringBoot應用建立什麼類型的ApplicationContext並建立完成,而後根據條件決定是否添加ShutdownHook,決定是否使用自定義的BeanNameGenerator,決定是否使用自定義的ResourceLoader,固然,最重要的,將以前準備好的Environment設置給建立好的ApplicationContext使用。

4) ApplicationContext建立好以後,遍歷調用先前找到的ApplicationContextInitializer的initialize(applicationContext)方法來對已經建立好的ApplicationContext進行進一步的處理。
5) 遍歷調用全部SpringApplicationRunListener的contextPrepared()方法。
6) 最核心的一步,將以前經過@EnableAutoConfiguration獲取的全部配置以及其餘形式的IoC容器配置加載到已經準備完畢的ApplicationContext。
7) 遍歷調用全部SpringApplicationRunListener的contextLoaded()方法。
8) 調用ApplicationContext的refresh()方法,完成IoC容器可用的最後一道工序。
9) 查找當前ApplicationContext中是否註冊有CommandLineRunner,若是有,則遍歷執行它們。
10) 正常狀況下,遍歷執行SpringApplicationRunListener的finished()方法.

模板引擎

Spring Boot爲Spring MVC提供適用於多數應用的自動配置功能。在Spring默認基礎上,自動配置添加了如下特性:

  • 引入ContentNegotiatingViewResolver和BeanNameViewResolver beans。
  • 對靜態資源的支持,包括對WebJars的支持。
  • 自動註冊Converter,GenericConverter,Formatter beans。
  • 對HttpMessageConverters的支持。
  • 自動註冊MessageCodeResolver。
  • 對靜態index.html的支持。
  • 對自定義Favicon的支持。

若是想全面控制Spring MVC,你能夠添加本身的@Configuration,並使用@EnableWebMvc對其註解。若是想保留Spring Boot MVC的特性,並只是添加其餘的MVC配置(攔截器,formatters,視圖控制器等),你能夠添加本身的WebMvcConfigurerAdapter類型的@Bean(不使用@EnableWebMvc註解)
例如:配置一個攔截器

@Configuration
public class WebConfiguration extends WebMvcConfigurerAdapter {
    @Bean    public RemoteIpFilter remoteIpFilter() {
        return new RemoteIpFilter();
    }

    @Bean    public LocaleChangeInterceptor localeChangeInterceptor() {
        return new LocaleChangeInterceptor();
    }
    @Override    public void addInterceptors(InterceptorRegistry registry {
        registry.addInterceptor(localeChangeInterceptor());
    }
}

Spring Boot 默認爲咱們提供了靜態資源處理,使用 WebMvcAutoConfiguration 中的配置各類屬性。
建議你們使用Spring Boot的默認配置方式,提供的靜態資源映射以下:

  • classpath:/META-INF/resources
  • classpath:/resources
  • classpath:/static
  • classpath:/public

這使用了Spring MVC的ResourceHttpRequestHandler.

Spring Boot支持多種模版引擎包括:

  • FreeMarker
  • Groovy
  • Thymeleaf(官方推薦)
  • Mustache

JSP技術Spring Boot官方是不推薦的,緣由有三:

  • tomcat只支持war的打包方式,不支持可執行的jar。
  • Jetty 嵌套的容器不支持jsp
  • 建立自定義error.jsp頁面不會覆蓋錯誤處理的默認視圖,而應該使用自定義錯誤頁面

當你使用上述模板引擎中的任何一個,它們默認的模板配置路徑爲:src/main/resources/templates。固然也能夠修改這個路徑

配置錯誤頁面

Spring Boot自動配置的默認錯誤處理器會查找名爲error的視圖,若是找不到就用默認的白標
錯誤視圖,如圖3-1所示。所以,最簡單的方法就是建立一個自定義視圖,讓解析出的視圖名爲
error。
這一點歸根到底取決於錯誤視圖解析時的視圖解析器。

  •  實現了Spring的View接口的Bean,其 ID爲error(由Spring的BeanNameViewResolver所解析)。
  •  若是配置了Thymeleaf,則有名爲error.html的Thymeleaf模板。
  •  若是配置了FreeMarker,則有名爲error.ftl的FreeMarker模板。
  •  若是配置了Velocity,則有名爲error.vm的Velocity模板。
  •  若是是用JSP視圖,則有名爲error.jsp的JSP模板。

Spring Boot會爲錯誤視圖提供以下錯誤屬性。

  •  timestamp:錯誤發生的時間。
  •  status:HTTP狀態碼。
  •  error:錯誤緣由。
  •  exception:異常的類名。
  •  message:異常消息(若是這個錯誤是由異常引發的)。
  •  errors:BindingResult異常裏的各類錯誤(若是這個錯誤是由異常引發的)。
  •  trace:異常跟蹤信息(若是這個錯誤是由異常引發的)。
  •  path:錯誤發生時請求的URL路徑。

默認日誌logback配置

spring-boot-starter-logging
根據不一樣的日誌系統,你能夠按以下規則組織配置文件名,就能被正確加載:

  • Logback:logback-spring.xml, logback-spring.groovy, logback.xml
  • Log4j:log4j-spring.properties, log4j-spring.xml, log4j.properties, log4j.xml
  • Log4j2:log4j2-spring.xml, log4j2.xml

若是你不想用logback.xml做爲Logback配置的名字,能夠經過logging.config屬性指定自定義的名字:
logging.config=classpath:logging-config.xml

多環境日誌輸出

據不一樣環境(prod:生產環境,test:測試環境,dev:開發環境)來定義不一樣的日誌輸出,在 logback-spring.xml中使用 springProfile 節點來定義,方法以下:
文件名稱不是logback.xml,想使用spring擴展profile支持,要以logback-spring.xml命名

<!-- 測試環境+開發環境. 多個使用逗號隔開. -->
<springProfile name="test,dev">
    <logger name="com.dudu.controller" level="info" />
</springProfile>
<!-- 生產環境. -->
<springProfile name="prod">
    <logger name="com.dudu.controller" level="ERROR" />
</springProfile>

能夠啓動服務的時候指定 profile (如不指定使用默認),如指定prod 的方式爲:
java -jar xxx.jar –spring.profiles.active=prod

數據源與事務配置

一、使用普通jdbc

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>

application.properties中配置數據源信息。

spring.datasource.url = jdbc:mysql://localhost:3306/spring?useUnicode=true&characterEncoding=utf-8
spring.datasource.username = root
spring.datasource.password = root
spring.datasource.driver-class-name = com.mysql.jdbc.Driver

自定義數據源

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.0.19</version>
</dependency>
@SpringBootApplication
public class Application {

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

    @Autowired
    private Environment env;

    //destroy-method="close"的做用是當數據庫鏈接不使用的時候,就把該鏈接從新放到數據池中,方便下次使用調用.
    @Bean(destroyMethod =  "close")
    public DataSource dataSource() {
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setUrl(env.getProperty("spring.datasource.url"));
        dataSource.setUsername(env.getProperty("spring.datasource.username"));//用戶名
        dataSource.setPassword(env.getProperty("spring.datasource.password"));//密碼
        dataSource.setDriverClassName(env.getProperty("spring.datasource.driver-class-name"));
        dataSource.setInitialSize(2);//初始化時創建物理鏈接的個數
        dataSource.setMaxActive(20);//最大鏈接池數量
        dataSource.setMinIdle(0);//最小鏈接池數量
        dataSource.setMaxWait(60000);//獲取鏈接時最大等待時間,單位毫秒。
        dataSource.setValidationQuery("SELECT 1");//用來檢測鏈接是否有效的sql
        dataSource.setTestOnBorrow(false);//申請鏈接時執行validationQuery檢測鏈接是否有效
        dataSource.setTestWhileIdle(true);//建議配置爲true,不影響性能,而且保證安全性。
        dataSource.setPoolPreparedStatements(false);//是否緩存preparedStatement,也就是PSCache
        return dataSource;
    }
}

覆蓋Spring Boot 配置

Spring Boot自動配置自帶了不少配置類,每個都能運用
在你的應用程序裏。它們都使用了Spring 4.0的條件化配置,能夠在運行時判斷這個配置是該被運
用,仍是該被忽略。如:

@Bean
@ConditionalOnMissingBean(JdbcOperations.class)
public JdbcTemplate jdbcTemplate() {
return new JdbcTemplate(this.dataSource);
}

條件註解有以下:

  • @ConditionalOnBean 配置了某個特定Bean
  • @ConditionalOnMissingBean 沒有配置特定的Bean
  • @ConditionalOnClass Classpath裏有指定的類
  • @ConditionalOnMissingClass Classpath裏缺乏指定的類
  • @ConditionalOnExpression 給定的Spring Expression Language(SpEL)表達式計算結果爲true
  • @ConditionalOnJava Java的版本匹配特定值或者一個範圍值
  • @ConditionalOnJndi 參數中給定的JNDI位置必須存在一個,若是沒有給參數,則要有JNDI
  • InitialContext
  • @ConditionalOnProperty 指定的配置屬性要有一個明確的值
  • @ConditionalOnResource Classpath裏有指定的資源
  • @ConditionalOnWebApplication 這是一個Web應用程序
  • @ConditionalOnNotWebApplication 這不是一個Web應用程序

單元測試

@RunWith(SpringRunner.class)
@SpringBootTest(classes = App.class)
public MyTest{
    @Test
    public void test1(){

    }
}

測試Web 應用程序

一、普通測試

@RunWith(SpringRunner.class)
@SpringBootTest(classes = App.class)
@WebAppConfiguration
public class MockMvcWebTests {
    @Autowired
    private WebApplicationContext webContext;
    private MockMvc mockMvc;
    @Before
    public void setupMockMvc() {
        mockMvc = MockMvcBuilders.webAppContextSetup(webContext).build();
    }
    @Test
    public void homePage() throws Exception {
        mockMvc.perform(MockMvcRequestBuilders.get("/readingList"))
                .andExpect(MockMvcResultMatchers.status().isOk())
                .andExpect(MockMvcResultMatchers.view().name("readingList"))
                .andExpect(MockMvcResultMatchers.model().attributeExists("books"))
                .andExpect(MockMvcResultMatchers.model().attribute("books",
            Matchers.is(Matchers.empty())));
    }
}

首先向/readingList發起一個GET請求,接下來但願該
請求處理成功(isOk()會判斷HTTP 200響應碼),而且視圖的邏輯名稱爲readingList。測試
還要判定模型包含一個名爲books的屬性,該屬性是一個空集合。全部的斷言都很直觀。

二、測試運行中的應用程序
在測試類上添加@Web-IntegrationTest註解,能夠聲明你不只但願Spring Boot爲測試建立應用程序上下文,還要啓動一個嵌入式的Servlet容器。一旦應用程序運行在嵌入式容器裏,你就能夠發起真實的HTTP請求,斷言結果了。
這裏採用@WebIntegration-Test,在服務器裏啓動了應用程序
, 以Spring的RestTemplate對應用程序發起HTTP請求。
Spring-boot 1.4之後推薦採用SpringBootTest(webEnvironment=WebEnvironment.DEFINED_PORT) (or RANDOM_PORT)來代替@WebIntegrationTest,而此類在1.5已經被移除了。https://github.com/spring-pro...

@RunWith(SpringRunner.class)
@SpringBootTest(classes = App.class,webEnvironment=WebEnvironment.RANDOM_PORT)
public class WebInRuntimeTest {
    @Value("${local.server.port}")
    private int port;
    @Autowired
    private TestRestTemplate template;
    @Test
    public void test1(){
//        Assert.state(true,"測試成功");
        System.out.println(port);
        ResponseEntity<String> response=template.getForEntity("/test/111", String.class);
        System.out.println(response.getStatusCodeValue());
        System.out.println(response.getHeaders());
        
        System.out.println(response.getBody());
        Assert.hasText("111","true");
    }
}

用隨機端口啓動服務器,@WebIntegrationTest的value屬性接受一個String數組,數組中的每項都是鍵值對,形如name=value,用來設置測試中使用的屬性。要設置server.port,你能夠這樣作:**@WebIntegrationTest("server.port:0") //使用0表示端口號隨機,也能夠具體指定如8888這樣的固定端口.
或者直接這樣@WebIntegrationTest(randomPort=true)**

Spring Boot將local.server.port的值設置爲了選中的端口。咱們只需使用Spring的@Value註解將其注入便可:

@Value("${local.server.port}")
private int port;

三、使用Selenium 測試HTML 頁面

@RunWith(SpringRunner.class)
@SpringBootTest(classes = App.class)
@WebIntegrationTest(randomPort=true)
public class ServerWebTests {
    private static FirefoxDriver browser;
    @Value("${local.server.port}")
    private int port;
    @BeforeClass
    public static void openBrowser() {
        browser = new FirefoxDriver();
        browser.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
    }
    @Test
    public void addBookToEmptyList() {
        String baseUrl = "http://localhost:" + port;
        browser.get(baseUrl);
        assertEquals("You have no books in your book list",browser.findElementByTagName("div").getText());
        browser.findElementByName("title").sendKeys("BOOK TITLE");
        browser.findElementByTagName("form").submit();
        WebElement dl =
            browser.findElementByCssSelector("dt.bookHeadline");
        assertEquals("BOOK TITLE by BOOK AUTHOR (ISBN: 1234567890)",dl.getText());
    }
    @AfterClass
    public static void closeBrowser() {
        browser.quit();
    }
}

外部tomcat部署war配置

當咱們不想使用內嵌tomcat部署時,咱們也可使用外部tomcat,並打包成war:
https://docs.spring.io/spring...

開發經常使用的熱部署方式彙總

  • Spring Loaded
  • spring-boot-devtools
  • IDE的JRebel插件

一、Spring Loaded 實現熱部署
Spring Loaded是一個用於在JVM運行時從新加載類文件更改的JVM代理,Spring Loaded容許你動態的新增/修改/刪除某個方法/字段/構造方法,一樣能夠修改做用在類/方法/字段/構造方法上的註解.也能夠新增/刪除/改變枚舉中的值。

spring-loaded是一個開源項目,項目地址:https://github.com/spring-pro...

Spring Loaded有兩種方式實現,分別是Maven引入依賴方式或者添加啓動參數方式

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <dependencies>
        <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>springloaded</artifactId>
        <version>1.2.6.RELEASE</version>
        </dependency>
    </dependencies>
</plugin>

啓動:mvn spring-boot:run
注意:maven依賴的方式只適合spring-boot:run的啓動方式,右鍵那種方式不行。

出現以下配置表實配置成功:
[INFO] Attaching agents: [C:Userstengj.m2repositoryorgspringframeworkspringloaded1.2.6.R

添加啓動參數方式
這種方式是右鍵運行啓動類.首先先下載對應的springloaded-xxx.RELEASE.jar,能夠去上面提到的官網獲取,在VM options中輸入-javaagent:< pathTo >/springloaded-{VERSION}.jar

上面2種方式隨便選擇一種便可,當系統經過 mvn spring-boot:run啓動或者 右鍵application debug啓動Java文件時,系統會監視classes文件,當有classes文件被改動時,系統會從新加載類文件,不用重啓啓動服務。
注:IDEA下須要從新編譯文件 Ctrl+Shift+F9或者編譯項目 Ctrl+F9

在 Spring Boot,模板引擎的頁面默認是開啓緩存,若是修改頁面內容,刷新頁面是沒法獲取修改後的頁面內容,因此,若是咱們不須要模板引擎的緩存,能夠進行關閉。

spring.freemarker.cache=false
spring.thymeleaf.cache=false
spring.velocity.cache=false
spring.mustache.cache=false

不過仍是有一些狀況下須要從新啓動,不可用的狀況以下:

  • 1:對於一些第三方框架的註解的修改,不能自動加載,好比:spring mvc的@RequestMapping
  • 2:application.properties的修改也不行
  • 3:log4j的配置文件的修改不能即時生效

二、spring-boot-devtools 實現熱部署
spring-boot-devtools爲應用提供一些開發時特性,包括默認值設置,自動重啓,livereload等。

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <optional>true</optional>
    </dependency>
</dependencies>

將依賴關係標記爲可選< optional >true< /optional>是一種最佳作法,能夠防止使用項目將devtools傳遞性地應用於其餘模塊。
在Spring Boot集成Thymeleaf時,spring.thymeleaf.cache屬性設置爲false能夠禁用模板引擎編譯的緩存結果。
如今,devtools會自動幫你作到這些,禁用全部模板的緩存,包括Thymeleaf, Freemarker, Groovy Templates, Velocity, Mustache等。

自動重啓的原理在於spring boot使用兩個classloader:不改變的類(如第三方jar)由base類加載器加載,正在開發的類由restart類加載器加載。應用重啓時,restart類加載器被扔掉重建,而base類加載器不變,這種方法意味着應用程序從新啓動一般比「冷啓動」快得多,由於base類加載器已經可用並已填充。

因此,當咱們開啓devtools後,classpath中的文件變化會致使應用自動重啓。
固然不一樣的IDE效果不同,Eclipse中保存文件便可引發classpath更新(注:須要打開自動編譯),從而觸發重啓。而IDEA則須要本身手動CTRL+F9從新編譯一下(感受IDEA這種更好,否則每修改一個地方就重啓,好蛋疼)

排除靜態資源文件
靜態資源文件在改變以後有時候不必觸發應用程序重啓,例如thymeleaf模板文件就能夠實時編輯,默認狀況下,更改/META-INF/maven, /META-INF/resources ,/resources ,/static ,/public 或/templates下的資源不會觸發重啓,而是觸發live reload(devtools內嵌了一個LiveReload server,當資源發生改變時,瀏覽器刷新,須要瀏覽器插件支持)。

可使用spring.devtools.restart.exclude屬性配置,例如

spring.devtools.restart.exclude=static/**,public/**

若是想保留默認配置,同時增長新的配置,則可以使用
spring.devtools.restart.additional-exclude屬性

觀察額外的路徑
若是你想觀察不在classpath中的路徑的文件變化並觸發重啓,則能夠配置 spring.devtools.restart.additional-paths 屬性。

不在classpath內的path能夠配置spring.devtools.restart.additionalpaths屬性來增長到監視中,同時配置spring.devtools.restart.exclude能夠選擇這些path的變化是致使restart仍是live reload。

關閉自動重啓
設置 spring.devtools.restart.enabled 屬性爲false,能夠關閉該特性。能夠在application.properties中設置,也能夠經過設置環境變量的方式。

public static void main(String[] args) {
    System.setProperty("spring.devtools.restart.enabled", "false");
    SpringApplication.run(MyApp.class, args);
}

使用一個觸發文件
若不想每次修改都觸發自動重啓,能夠設置spring.devtools.restart.trigger-file指向某個文件,只有更改這個文件時才觸發自動重啓。

自定義自動重啓類加載器
默認時,IDE中打開的項目都會由restart加載器加載,jar文件由Base加載器加載,可是若你使用multi-module的項目,而且不是全部模塊都被導入到IDE中,此時會致使加載器不一致。這時你能夠建立META-INF/spring-devtools.properties文件,並增長restart.exclude.XXX,restart.include.XXX來配置哪些jar被restart加載,哪些被base加載。如:

restart.include.companycommonlibs=/mycorp-common-[\\w-]+\.jar
restart.include.projectcommon=/mycorp-myproj-[\\w-]+\.jar

若是您不想在應用程序運行時啓動LiveReload服務器,則能夠將spring.devtools.livereload.enabled屬性設置爲false。
一次只能運行一個LiveReload服務器。開始應用程序以前,請確保沒有其餘LiveReload服務器正在運行。
若是你的IDE啓動多個應用程序,則只有第一個應用程序將支持LiveReload。

三、JRebel插件方式 :略

數據庫遷移庫支持

Spring Boot爲兩款流行的數據庫遷移庫提供了自動配置支持。
 Flyway(http://flywaydb.org
 Liquibase(http://www.liquibase.org

  1. 用Flyway定義數據庫遷移過程
<dependency>
<groupId>org.flywayfb</groupId>
<artifactId>flyway-core</artifactId>
</dependency>

Flyway是一個很是簡單的開源數據庫遷移庫,使用SQL來定義遷移腳本。它的理念是,每一個
腳本都有一個版本號,Flyway會順序執行這些腳本,讓數據庫達到指望的狀態。它也會記錄已執
行的腳本狀態,不會重複執行。
,Flyway腳本就是SQL。讓其發揮做用的是其在Classpath裏的位置和文件名。Flyway
腳本都遵循一個命名規範,V版本號__描述.sql,如V1__initdb.sql
Flyway腳本須要放在src/main/resources/db/migration裏。
你還須要將spring.jpa.hibernate.ddl-auto設置爲none,由此告知Hibernate不要建立
數據表。

原理:在應用程序部署並運行起來後,Spring Boot會檢測到Classpath裏的Flyway,自動配置所需的
Bean。Flyway會依次查看/db/migration裏的腳本,若是沒有執行過就運行這些腳本。每一個腳本都
執行事後,向schema_version表裏寫一條記錄。應用程序下次啓動時,Flyway會先看schema_version
裏的記錄,跳過那些腳本。

  1. 用Liquibase定義數據庫遷移過程

相比Flyway的優勢,數據庫無關性,腳本不是用sql寫,而是支持yaml,json,xml等格式。

<dependency>
<groupId>org.liquibase</groupId>
<artifactId>liquibase-core</artifactId>
</dependency>

具體介紹:略。

Actuator監控應用程序狀態

運行中的應用程序就像禮物盒。你能夠刺探它,做出合理的推測,猜想它的運行狀況。但如
何瞭解真實的狀況呢?有沒有一種辦法能讓你深刻應用程序內部一窺究竟,瞭解它的行爲,檢查
它的健康情況,甚至觸發一些操做來影響應用程序呢?
Spring Boot的Actuator。它提供了不少生產級的特性,好比監控和度
量Spring Boot應用程序。Actuator的這些特性能夠經過衆多REST端點、遠程shell和JMX得到。

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

一、Actuator的Web端點
端點能夠分爲三大類:配置端點、度量端點和其餘端點

  • GET /autoconfig 提供了一份自動配置報告,記錄哪些自動配置條件經過了,哪些沒經過
  • GET /configprops 描述配置屬性(包含默認值)如何注入Bean
  • GET /beans 描述應用程序上下文裏所有的Bean,以及它們的關係
  • GET /dump 獲取線程活動的快照
  • GET /env 獲取所有環境屬性
  • GET /env/{name} 根據名稱獲取特定的環境屬性值
  • GET /health 報告應用程序的健康指標,這些值由HealthIndicator的實現類提供
  • GET /info 獲取應用程序的定製信息,這些信息由info打頭的屬性提供
  • GET /mappings 描述所有的URI路徑,以及它們和控制器(包含Actuator端點)的映射關係
  • GET /metrics 報告各類應用程序度量信息,好比內存用量和HTTP請求計數
  • GET /metrics/{name} 報告指定名稱的應用程序度量值
  • POST /shutdown 關閉應用程序,要求endpoints.shutdown.enabled設置爲true
  • GET /trace 提供基本的HTTP請求跟蹤信息(時間戳、HTTP頭等)

/beans端點產生的報告能告訴你Spring應用程序上下文裏都有哪些Bean。
/autoconfig端點能告
訴你爲何會有這個Bean,或者爲何沒有這個Bean。
Spring Boot自動配置構建於Spring的條件化配置之上。它提供了衆多帶有
@Conditional註解的配置類,根據條件決定是否要自動配置這些Bean。/autoconfig端點提供了
一個報告,列出了計算過的全部條件,根據條件是否經過進行分組。

/env端點會生成應用程序可用的全部環境屬性的列表,不管這些屬性是否用到。這其中包括
環境變量、JVM屬性、命令行參數,以及applicaition.properties或application.yml文件提供的屬性。

/metrics端點提供了一些針對Web請求的基本計數器和計時器,但那些度量值缺乏詳細信
息。知道所處理請求的更多信息是頗有幫助的,尤爲是在調試時,因此就有了/trace這個端點。
/trace端點能報告全部Web請求的詳細信息,包括請求方法、路徑、時間戳以及請求和響應的
頭信息

二、使用:CRaSH shell

三、經過JMX 監控應用程序

參考:

Book: Spring-Boot In Action
嘟嘟獨立博客
https://github.com/tengj/Spri...

相關文章
相關標籤/搜索