成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專(zhuān)欄INFORMATION COLUMN

Spring-Boot學(xué)習(xí)筆記

curlyCheng / 2639人閱讀

摘要:學(xué)習(xí)筆記使用很容易創(chuàng)建一個(gè)獨(dú)立運(yùn)行運(yùn)行內(nèi)嵌容器準(zhǔn)生產(chǎn)級(jí)別的基于框架的項(xiàng)目,使用你可以不用或者只需要很少的配置。異常消息如果這個(gè)錯(cuò)誤是由異常引起的。錯(cuò)誤發(fā)生時(shí)請(qǐng)求的路徑。

Spring-Boot 1.5 學(xué)習(xí)筆記

使用Spring Boot很容易創(chuàng)建一個(gè)獨(dú)立運(yùn)行(運(yùn)行jar,內(nèi)嵌Servlet容器)、準(zhǔn)生產(chǎn)級(jí)別的基于Spring框架的項(xiàng)目,使用Spring Boot你可以不用或者只需要很少的Spring配置。

Spring將很多魔法帶入了Spring應(yīng)用程序的開(kāi)發(fā)之中,其中最重要的是以下四個(gè)核心。

自動(dòng)配置:針對(duì)很多Spring應(yīng)用程序常見(jiàn)的應(yīng)用功能,Spring Boot能自動(dòng)提供相關(guān)配置

起步依賴(lài):告訴Spring Boot需要什么功能,它就能引入需要的庫(kù)。

命令行界面:這是Spring Boot的可選特性,借此你只需寫(xiě)代碼就能完成完整的應(yīng)用程序,無(wú)需傳統(tǒng)項(xiàng)目構(gòu)建。

Actuator:讓你能夠深入運(yùn)行中的Spring Boot應(yīng)用程序,一探究竟。

Java版本:推薦使用java8

構(gòu)建一個(gè)Sping Boot的Maven項(xiàng)目,強(qiáng)烈推薦Spring Initializr,它從本質(zhì)上來(lái)說(shuō)就是一個(gè)Web應(yīng)用程序,它能為你生成Spring Boot項(xiàng)目結(jié)構(gòu)。
Spring Initializr有幾種用法:

1、通過(guò)Web界面使用,訪(fǎng)問(wèn):http://start.spring.io/

2、通過(guò)ide相關(guān)插件創(chuàng)建

@SpringBootApplication是Sprnig Boot項(xiàng)目的核心注解,主要目的是開(kāi)啟自動(dòng)配置。
使用命令 mvn spring-boot:run”在命令行啟動(dòng)該應(yīng)用

配置文件

spring-boot配置文件application.properties支持的屬性列表:http://docs.spring.io/spring-...
1、直接在要使用的地方通過(guò)注解@Value(value=”${configName}”)就可以綁定到你想要的屬性上面。
2、在application.properties中的各個(gè)參數(shù)之間也可以直接引用來(lái)使用。

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

3、有時(shí)候?qū)傩蕴嗔?,一個(gè)個(gè)綁定到屬性字段上太累,官方提倡綁定一個(gè)對(duì)象的bean,這里我們建一個(gè)ConfigBean.java類(lèi),頂部需要使用注解@ConfigurationProperties(prefix = “com.xxx”)來(lái)指明使用哪個(gè).這點(diǎn)可以參考:org.springframework.boot.autoconfigure.jdbc.DataSourceProperties類(lèi)的寫(xiě)法

這里配置完還需要在spring Boot入口類(lèi)加上@EnableConfigurationProperties并指明要加載哪個(gè)bean
比如:@EnableConfigurationProperties(DataSourceProperties.class)

4、有時(shí)候我們不希望把所有配置都放在application.properties里面,這時(shí)候我們可以另外定義一個(gè),如test.properties,路徑跟也放在src/main/resources下面。
我們新建一個(gè)bean類(lèi),如下:

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

5、隨機(jī)值配置
配置文件中${random} 可以用來(lái)生成各種不同類(lèi)型的隨機(jī)值,從而簡(jiǎn)化了代碼生成的麻煩,例如 生成 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]}

6、外部配置-命令行參數(shù)配置
如java -jar xx.jar --server.port=9090
其中server.port是application.properties里面的選項(xiàng)

7、Profile-多環(huán)境配置
在Spring Boot中多環(huán)境配置文件名需要滿(mǎn)足application-{profile}.properties的格式,其中{profile}對(duì)應(yīng)你的環(huán)境標(biāo)識(shí),比如:
application-dev.properties:開(kāi)發(fā)環(huán)境
application-prod.properties:生產(chǎn)環(huán)境
想要使用對(duì)應(yīng)的環(huán)境,有兩種方式

只需要在application.properties中使用spring.profiles.active屬性來(lái)設(shè)置,值對(duì)應(yīng)上面提到的{profile},這里就是指dev、prod這2個(gè)。

當(dāng)然你也可以用命令行啟動(dòng)的時(shí)候帶上參數(shù):

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

還可以像這樣設(shè)置SPRING_PROFILES_ACTIVE環(huán)境變量:

$ export SPRING_PROFILES_ACTIVE=production

在代碼里,我們還可以直接用@Profile注解來(lái)進(jìn)行配置
如下:

/**
  * 測(cè)試數(shù)據(jù)庫(kù)
  */
@Component
@Profile("testdb")
public class TestDBConnector implements DBConnector {
    @Override
    public void configure() {
        System.out.println("testdb");
    }
}
/**
 * 生產(chǎn)數(shù)據(jù)庫(kù)
 */
@Component
@Profile("devdb")
public class DevDBConnector implements DBConnector {
    @Override
    public void configure() {
        System.out.println("devdb");
    }
}

通過(guò)在配置文件激活具體使用哪個(gè)實(shí)現(xiàn)類(lèi)spring.profiles.active=testdb

啟動(dòng)原理解析
@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}
@SpringBootApplication與@EnableAutoConfiguration

@SpringBootApplication背后:打開(kāi)源碼看看,有三個(gè)Annotation原注解:

@Configuration(@SpringBootConfiguration點(diǎn)開(kāi)查看發(fā)現(xiàn)里面還是應(yīng)用了@Configuration)

@EnableAutoConfiguration

@ComponentScan(如果不指定basePackages等屬性,則默認(rèn)Spring框架實(shí)現(xiàn)會(huì)從聲明@ComponentScan所在類(lèi)的package進(jìn)行掃描。)

@EnableAutoConfiguration這個(gè)Annotation最為重要(點(diǎn)開(kāi)源碼看看),Spring框架提供的各種名字為@Enable開(kāi)頭的Annotation定義?比如@EnableScheduling、@EnableCaching、@EnableMBeanExport等,@EnableAutoConfiguration的理念和做事方式其實(shí)一脈相承,簡(jiǎn)單概括一下就是,借助@Import的支持,收集和注冊(cè)特定場(chǎng)景相關(guān)的bean定義。

@EnableScheduling是通過(guò)@Import將Spring調(diào)度框架相關(guān)的bean定義都加載到IoC容器。

@EnableMBeanExport是通過(guò)@Import將JMX相關(guān)的bean定義加載到IoC容器。

而@EnableAutoConfiguration也是借助@Import的幫助,將所有符合自動(dòng)配置條件的bean定義加載到IoC容器,僅此而已!

借助于Spring框架原有的一個(gè)工具類(lèi):SpringFactoriesLoader的支持,@EnableAutoConfiguration可以智能的自動(dòng)配置
SpringFactoriesLoader屬于Spring框架私有的一種擴(kuò)展方案,其主要功能就是從指定的配置文件META-INF/spring.factories加載配置。
@EnableAutoConfiguration自動(dòng)配置的魔法騎士是從classpath中搜尋所有的META-INF/spring.factories配置文件,并將其中org.springframework.boot.autoconfigure.EnableutoConfiguration對(duì)應(yīng)的配置項(xiàng)(主要在SpringBoot的autoconfigure依賴(lài)包中)通過(guò)反射(Java Refletion)實(shí)例化為對(duì)應(yīng)的標(biāo)注了@Configuration的JavaConfig形式的IoC容器配置類(lèi),然后匯總為一個(gè)并加載到IoC容器。

SpringApplication執(zhí)行流程

1) 如果使用的是SpringApplication.run靜態(tài)方法,那么,這個(gè)方法里面首先要?jiǎng)?chuàng)建一個(gè)SpringApplication實(shí)例,在初始化的時(shí)候,它會(huì)提前做幾件事情:

根據(jù)classpath里面是否存在某個(gè)特征類(lèi)(org.springframework.web.context.ConfigurableWebApplicationContext)來(lái)決定是否應(yīng)該創(chuàng)建一個(gè)為Web應(yīng)用使用的ApplicationContext類(lèi)型。

使用SpringFactoriesLoader在應(yīng)用的classpath中查找并加載所有可用的ApplicationContextInitializer,ApplicationListener

2)執(zhí)行run方法的邏輯,首先遍歷執(zhí)行所有通過(guò)SpringFactoriesLoader可以查找到并加載的SpringApplicationRunListener。調(diào)用它們的started()方法。然后
創(chuàng)建并配置當(dāng)前Spring Boot應(yīng)用將要使用的Environment(包括配置要使用的PropertySource以及Profile)。然后遍歷調(diào)用所有SpringApplicationRunListener的environmentPrepared()的方法。之后,如果SpringApplication的showBanner屬性被設(shè)置為true,則打印banner。

3) 根據(jù)用戶(hù)是否明確設(shè)置了applicationContextClass類(lèi)型以及初始化階段的推斷結(jié)果,決定該為當(dāng)前SpringBoot應(yīng)用創(chuàng)建什么類(lèi)型的ApplicationContext并創(chuàng)建完成,然后根據(jù)條件決定是否添加ShutdownHook,決定是否使用自定義的BeanNameGenerator,決定是否使用自定義的ResourceLoader,當(dāng)然,最重要的,將之前準(zhǔn)備好的Environment設(shè)置給創(chuàng)建好的ApplicationContext使用。

4) ApplicationContext創(chuàng)建好之后,遍歷調(diào)用先前找到的ApplicationContextInitializer的initialize(applicationContext)方法來(lái)對(duì)已經(jīng)創(chuàng)建好的ApplicationContext進(jìn)行進(jìn)一步的處理。
5) 遍歷調(diào)用所有SpringApplicationRunListener的contextPrepared()方法。
6) 最核心的一步,將之前通過(guò)@EnableAutoConfiguration獲取的所有配置以及其他形式的IoC容器配置加載到已經(jīng)準(zhǔn)備完畢的ApplicationContext。
7) 遍歷調(diào)用所有SpringApplicationRunListener的contextLoaded()方法。
8) 調(diào)用ApplicationContext的refresh()方法,完成IoC容器可用的最后一道工序。
9) 查找當(dāng)前ApplicationContext中是否注冊(cè)有CommandLineRunner,如果有,則遍歷執(zhí)行它們。
10) 正常情況下,遍歷執(zhí)行SpringApplicationRunListener的finished()方法.

模板引擎

Spring Boot為Spring MVC提供適用于多數(shù)應(yīng)用的自動(dòng)配置功能。在Spring默認(rèn)基礎(chǔ)上,自動(dòng)配置添加了以下特性:

引入ContentNegotiatingViewResolver和BeanNameViewResolver beans。

對(duì)靜態(tài)資源的支持,包括對(duì)WebJars的支持。

自動(dòng)注冊(cè)Converter,GenericConverter,F(xiàn)ormatter beans。

對(duì)HttpMessageConverters的支持。

自動(dòng)注冊(cè)MessageCodeResolver。

對(duì)靜態(tài)index.html的支持。

對(duì)自定義Favicon的支持。

如果想全面控制Spring MVC,你可以添加自己的@Configuration,并使用@EnableWebMvc對(duì)其注解。如果想保留Spring Boot MVC的特性,并只是添加其他的MVC配置(攔截器,formatters,視圖控制器等),你可以添加自己的WebMvcConfigurerAdapter類(lèi)型的@Bean(不使用@EnableWebMvc注解)
例如:配置一個(gè)攔截器

@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 默認(rèn)為我們提供了靜態(tài)資源處理,使用 WebMvcAutoConfiguration 中的配置各種屬性。
建議大家使用Spring Boot的默認(rèn)配置方式,提供的靜態(tài)資源映射如下:

classpath:/META-INF/resources

classpath:/resources

classpath:/static

classpath:/public

這使用了Spring MVC的ResourceHttpRequestHandler.

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

FreeMarker

Groovy

Thymeleaf(官方推薦)

Mustache

JSP技術(shù)Spring Boot官方是不推薦的,原因有三:

tomcat只支持war的打包方式,不支持可執(zhí)行的jar。

Jetty 嵌套的容器不支持jsp

創(chuàng)建自定義error.jsp頁(yè)面不會(huì)覆蓋錯(cuò)誤處理的默認(rèn)視圖,而應(yīng)該使用自定義錯(cuò)誤頁(yè)面

當(dāng)你使用上述模板引擎中的任何一個(gè),它們默認(rèn)的模板配置路徑為:src/main/resources/templates。當(dāng)然也可以修改這個(gè)路徑

配置錯(cuò)誤頁(yè)面

Spring Boot自動(dòng)配置的默認(rèn)錯(cuò)誤處理器會(huì)查找名為error的視圖,如果找不到就用默認(rèn)的白標(biāo)
錯(cuò)誤視圖,如圖3-1所示。因此,最簡(jiǎn)單的方法就是創(chuàng)建一個(gè)自定義視圖,讓解析出的視圖名為
error。
這一點(diǎn)歸根到底取決于錯(cuò)誤視圖解析時(shí)的視圖解析器。

? 實(shí)現(xiàn)了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會(huì)為錯(cuò)誤視圖提供如下錯(cuò)誤屬性。

? timestamp:錯(cuò)誤發(fā)生的時(shí)間。

? status:HTTP狀態(tài)碼。

? error:錯(cuò)誤原因。

? exception:異常的類(lèi)名。

? message:異常消息(如果這個(gè)錯(cuò)誤是由異常引起的)。

? errors:BindingResult異常里的各種錯(cuò)誤(如果這個(gè)錯(cuò)誤是由異常引起的)。

? trace:異常跟蹤信息(如果這個(gè)錯(cuò)誤是由異常引起的)。

? path:錯(cuò)誤發(fā)生時(shí)請(qǐng)求的URL路徑。

默認(rèn)日志logback配置

spring-boot-starter-logging
根據(jù)不同的日志系統(tǒng),你可以按如下規(guī)則組織配置文件名,就能被正確加載:

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作為L(zhǎng)ogback配置的名字,可以通過(guò)logging.config屬性指定自定義的名字:
logging.config=classpath:logging-config.xml

多環(huán)境日志輸出

據(jù)不同環(huán)境(prod:生產(chǎn)環(huán)境,test:測(cè)試環(huán)境,dev:開(kāi)發(fā)環(huán)境)來(lái)定義不同的日志輸出,在 logback-spring.xml中使用 springProfile 節(jié)點(diǎn)來(lái)定義,方法如下:
文件名稱(chēng)不是logback.xml,想使用spring擴(kuò)展profile支持,要以logback-spring.xml命名



    



    

可以啟動(dòng)服務(wù)的時(shí)候指定 profile (如不指定使用默認(rèn)),如指定prod 的方式為:
java -jar xxx.jar –spring.profiles.active=prod

數(shù)據(jù)源與事務(wù)配置

1、使用普通jdbc


    org.springframework.boot
    spring-boot-starter-jdbc


    mysql
    mysql-connector-java

application.properties中配置數(shù)據(jù)源信息。

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

自定義數(shù)據(jù)源


    com.alibaba
    druid
    1.0.19
@SpringBootApplication
public class Application {

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

    @Autowired
    private Environment env;

    //destroy-method="close"的作用是當(dāng)數(shù)據(jù)庫(kù)連接不使用的時(shí)候,就把該連接重新放到數(shù)據(jù)池中,方便下次使用調(diào)用.
    @Bean(destroyMethod =  "close")
    public DataSource dataSource() {
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setUrl(env.getProperty("spring.datasource.url"));
        dataSource.setUsername(env.getProperty("spring.datasource.username"));//用戶(hù)名
        dataSource.setPassword(env.getProperty("spring.datasource.password"));//密碼
        dataSource.setDriverClassName(env.getProperty("spring.datasource.driver-class-name"));
        dataSource.setInitialSize(2);//初始化時(shí)建立物理連接的個(gè)數(shù)
        dataSource.setMaxActive(20);//最大連接池?cái)?shù)量
        dataSource.setMinIdle(0);//最小連接池?cái)?shù)量
        dataSource.setMaxWait(60000);//獲取連接時(shí)最大等待時(shí)間,單位毫秒。
        dataSource.setValidationQuery("SELECT 1");//用來(lái)檢測(cè)連接是否有效的sql
        dataSource.setTestOnBorrow(false);//申請(qǐng)連接時(shí)執(zhí)行validationQuery檢測(cè)連接是否有效
        dataSource.setTestWhileIdle(true);//建議配置為true,不影響性能,并且保證安全性。
        dataSource.setPoolPreparedStatements(false);//是否緩存preparedStatement,也就是PSCache
        return dataSource;
    }
}
覆蓋Spring Boot 配置

Spring Boot自動(dòng)配置自帶了很多配置類(lèi),每一個(gè)都能運(yùn)用
在你的應(yīng)用程序里。它們都使用了Spring 4.0的條件化配置,可以在運(yùn)行時(shí)判斷這個(gè)配置是該被運(yùn)
用,還是該被忽略。如:

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

條件注解有如下:

@ConditionalOnBean 配置了某個(gè)特定Bean

@ConditionalOnMissingBean 沒(méi)有配置特定的Bean

@ConditionalOnClass Classpath里有指定的類(lèi)

@ConditionalOnMissingClass Classpath里缺少指定的類(lèi)

@ConditionalOnExpression 給定的Spring Expression Language(SpEL)表達(dá)式計(jì)算結(jié)果為true

@ConditionalOnJava Java的版本匹配特定值或者一個(gè)范圍值

@ConditionalOnJndi 參數(shù)中給定的JNDI位置必須存在一個(gè),如果沒(méi)有給參數(shù),則要有JNDI

InitialContext

@ConditionalOnProperty 指定的配置屬性要有一個(gè)明確的值

@ConditionalOnResource Classpath里有指定的資源

@ConditionalOnWebApplication 這是一個(gè)Web應(yīng)用程序

@ConditionalOnNotWebApplication 這不是一個(gè)Web應(yīng)用程序

單元測(cè)試
@RunWith(SpringRunner.class)
@SpringBootTest(classes = App.class)
public MyTest{
    @Test
    public void test1(){

    }
}
測(cè)試Web 應(yīng)用程序

1、普通測(cè)試

@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發(fā)起一個(gè)GET請(qǐng)求,接下來(lái)希望該
請(qǐng)求處理成功(isOk()會(huì)判斷HTTP 200響應(yīng)碼),并且視圖的邏輯名稱(chēng)為readingList。測(cè)試
還要斷定模型包含一個(gè)名為books的屬性,該屬性是一個(gè)空集合。所有的斷言都很直觀(guān)。

2、測(cè)試運(yùn)行中的應(yīng)用程序
在測(cè)試類(lèi)上添加@Web-IntegrationTest注解,可以聲明你不僅希望Spring Boot為測(cè)試創(chuàng)建應(yīng)用程序上下文,還要啟動(dòng)一個(gè)嵌入式的Servlet容器。一旦應(yīng)用程序運(yùn)行在嵌入式容器里,你就可以發(fā)起真實(shí)的HTTP請(qǐng)求,斷言結(jié)果了。
這里采用@WebIntegration-Test,在服務(wù)器里啟動(dòng)了應(yīng)用程序
, 以Spring的RestTemplate對(duì)應(yīng)用程序發(fā)起HTTP請(qǐng)求。
Spring-boot 1.4以后推薦采用SpringBootTest(webEnvironment=WebEnvironment.DEFINED_PORT) (or RANDOM_PORT)來(lái)代替@WebIntegrationTest,而此類(lèi)在1.5已經(jīng)被移除了。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,"測(cè)試成功");
        System.out.println(port);
        ResponseEntity 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");
    }
}

用隨機(jī)端口啟動(dòng)服務(wù)器,@WebIntegrationTest的value屬性接受一個(gè)String數(shù)組,數(shù)組中的每項(xiàng)都是鍵值對(duì),形如name=value,用來(lái)設(shè)置測(cè)試中使用的屬性。要設(shè)置server.port,你可以這樣做:**@WebIntegrationTest("server.port:0") //使用0表示端口號(hào)隨機(jī),也可以具體指定如8888這樣的固定端口.
或者直接這樣@WebIntegrationTest(randomPort=true)**

Spring Boot將local.server.port的值設(shè)置為了選中的端口。我們只需使用Spring的@Value注解將其注入即可:

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

3、使用Selenium 測(cè)試HTML 頁(yè)面

@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配置

當(dāng)我們不想使用內(nèi)嵌tomcat部署時(shí),我們也可以使用外部tomcat,并打包成war:
https://docs.spring.io/spring...

開(kāi)發(fā)常用的熱部署方式匯總

Spring Loaded

spring-boot-devtools

IDE的JRebel插件

1、Spring Loaded 實(shí)現(xiàn)熱部署
Spring Loaded是一個(gè)用于在JVM運(yùn)行時(shí)重新加載類(lèi)文件更改的JVM代理,Spring Loaded允許你動(dòng)態(tài)的新增/修改/刪除某個(gè)方法/字段/構(gòu)造方法,同樣可以修改作用在類(lèi)/方法/字段/構(gòu)造方法上的注解.也可以新增/刪除/改變枚舉中的值。

spring-loaded是一個(gè)開(kāi)源項(xiàng)目,項(xiàng)目地址:https://github.com/spring-pro...

Spring Loaded有兩種方式實(shí)現(xiàn),分別是Maven引入依賴(lài)方式或者添加啟動(dòng)參數(shù)方式


    org.springframework.boot
    spring-boot-maven-plugin
    
        
        org.springframework
        springloaded
        1.2.6.RELEASE
        
    

啟動(dòng):mvn spring-boot:run
注意:maven依賴(lài)的方式只適合spring-boot:run的啟動(dòng)方式,右鍵那種方式不行。

出現(xiàn)如下配置表實(shí)配置成功:
[INFO] Attaching agents: [C:Userstengj.m2repositoryorgspringframeworkspringloaded1.2.6.R

添加啟動(dòng)參數(shù)方式
這種方式是右鍵運(yùn)行啟動(dòng)類(lèi).首先先下載對(duì)應(yīng)的springloaded-xxx.RELEASE.jar,可以去上面提到的官網(wǎng)獲取,在VM options中輸入-javaagent:< pathTo >/springloaded-{VERSION}.jar

上面2種方式隨便選擇一種即可,當(dāng)系統(tǒng)通過(guò) mvn spring-boot:run啟動(dòng)或者 右鍵application debug啟動(dòng)Java文件時(shí),系統(tǒng)會(huì)監(jiān)視classes文件,當(dāng)有classes文件被改動(dòng)時(shí),系統(tǒng)會(huì)重新加載類(lèi)文件,不用重啟啟動(dòng)服務(wù)。
注:IDEA下需要重新編譯文件 Ctrl+Shift+F9或者編譯項(xiàng)目 Ctrl+F9

在 Spring Boot,模板引擎的頁(yè)面默認(rèn)是開(kāi)啟緩存,如果修改頁(yè)面內(nèi)容,刷新頁(yè)面是無(wú)法獲取修改后的頁(yè)面內(nèi)容,所以,如果我們不需要模板引擎的緩存,可以進(jìn)行關(guān)閉。

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

不過(guò)還是有一些情況下需要重新啟動(dòng),不可用的情況如下:

1:對(duì)于一些第三方框架的注解的修改,不能自動(dòng)加載,比如:spring mvc的@RequestMapping

2:application.properties的修改也不行

3:log4j的配置文件的修改不能即時(shí)生效

2、spring-boot-devtools 實(shí)現(xiàn)熱部署
spring-boot-devtools為應(yīng)用提供一些開(kāi)發(fā)時(shí)特性,包括默認(rèn)值設(shè)置,自動(dòng)重啟,livereload等。


    
        org.springframework.boot
        spring-boot-devtools
        true
    

將依賴(lài)關(guān)系標(biāo)記為可選< optional >true< /optional>是一種最佳做法,可以防止使用項(xiàng)目將devtools傳遞性地應(yīng)用于其他模塊。
在Spring Boot集成Thymeleaf時(shí),spring.thymeleaf.cache屬性設(shè)置為false可以禁用模板引擎編譯的緩存結(jié)果。
現(xiàn)在,devtools會(huì)自動(dòng)幫你做到這些,禁用所有模板的緩存,包括Thymeleaf, Freemarker, Groovy Templates, Velocity, Mustache等。

自動(dòng)重啟的原理在于spring boot使用兩個(gè)classloader:不改變的類(lèi)(如第三方j(luò)ar)由base類(lèi)加載器加載,正在開(kāi)發(fā)的類(lèi)由restart類(lèi)加載器加載。應(yīng)用重啟時(shí),restart類(lèi)加載器被扔掉重建,而base類(lèi)加載器不變,這種方法意味著應(yīng)用程序重新啟動(dòng)通常比“冷啟動(dòng)”快得多,因?yàn)閎ase類(lèi)加載器已經(jīng)可用并已填充。

所以,當(dāng)我們開(kāi)啟devtools后,classpath中的文件變化會(huì)導(dǎo)致應(yīng)用自動(dòng)重啟。
當(dāng)然不同的IDE效果不一樣,Eclipse中保存文件即可引起classpath更新(注:需要打開(kāi)自動(dòng)編譯),從而觸發(fā)重啟。而IDEA則需要自己手動(dòng)CTRL+F9重新編譯一下(感覺(jué)IDEA這種更好,不然每修改一個(gè)地方就重啟,好蛋疼)

排除靜態(tài)資源文件
靜態(tài)資源文件在改變之后有時(shí)候沒(méi)必要觸發(fā)應(yīng)用程序重啟,例如thymeleaf模板文件就可以實(shí)時(shí)編輯,默認(rèn)情況下,更改/META-INF/maven, /META-INF/resources ,/resources ,/static ,/public 或/templates下的資源不會(huì)觸發(fā)重啟,而是觸發(fā)live reload(devtools內(nèi)嵌了一個(gè)LiveReload server,當(dāng)資源發(fā)生改變時(shí),瀏覽器刷新,需要瀏覽器插件支持)。

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

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

如果想保留默認(rèn)配置,同時(shí)增加新的配置,則可使用
spring.devtools.restart.additional-exclude屬性

觀(guān)察額外的路徑
如果你想觀(guān)察不在classpath中的路徑的文件變化并觸發(fā)重啟,則可以配置 spring.devtools.restart.additional-paths 屬性。

不在classpath內(nèi)的path可以配置spring.devtools.restart.additionalpaths屬性來(lái)增加到監(jiān)視中,同時(shí)配置spring.devtools.restart.exclude可以選擇這些path的變化是導(dǎo)致restart還是live reload。

關(guān)閉自動(dòng)重啟
設(shè)置 spring.devtools.restart.enabled 屬性為false,可以關(guān)閉該特性??梢栽赼pplication.properties中設(shè)置,也可以通過(guò)設(shè)置環(huán)境變量的方式。

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

使用一個(gè)觸發(fā)文件
若不想每次修改都觸發(fā)自動(dòng)重啟,可以設(shè)置spring.devtools.restart.trigger-file指向某個(gè)文件,只有更改這個(gè)文件時(shí)才觸發(fā)自動(dòng)重啟。

自定義自動(dòng)重啟類(lèi)加載器
默認(rèn)時(shí),IDE中打開(kāi)的項(xiàng)目都會(huì)由restart加載器加載,jar文件由Base加載器加載,但是若你使用multi-module的項(xiàng)目,并且不是所有模塊都被導(dǎo)入到IDE中,此時(shí)會(huì)導(dǎo)致加載器不一致。這時(shí)你可以創(chuàng)建META-INF/spring-devtools.properties文件,并增加restart.exclude.XXX,restart.include.XXX來(lái)配置哪些jar被restart加載,哪些被base加載。如:

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

如果您不想在應(yīng)用程序運(yùn)行時(shí)啟動(dòng)LiveReload服務(wù)器,則可以將spring.devtools.livereload.enabled屬性設(shè)置為false。
一次只能運(yùn)行一個(gè)LiveReload服務(wù)器。開(kāi)始應(yīng)用程序之前,請(qǐng)確保沒(méi)有其他LiveReload服務(wù)器正在運(yùn)行。
如果你的IDE啟動(dòng)多個(gè)應(yīng)用程序,則只有第一個(gè)應(yīng)用程序?qū)⒅С諰iveReload。

3、JRebel插件方式 :略

數(shù)據(jù)庫(kù)遷移庫(kù)支持

Spring Boot為兩款流行的數(shù)據(jù)庫(kù)遷移庫(kù)提供了自動(dòng)配置支持。
? Flyway(http://flywaydb.org)
? Liquibase(http://www.liquibase.org)

用Flyway定義數(shù)據(jù)庫(kù)遷移過(guò)程


org.flywayfb
flyway-core

Flyway是一個(gè)非常簡(jiǎn)單的開(kāi)源數(shù)據(jù)庫(kù)遷移庫(kù),使用SQL來(lái)定義遷移腳本。它的理念是,每個(gè)
腳本都有一個(gè)版本號(hào),F(xiàn)lyway會(huì)順序執(zhí)行這些腳本,讓數(shù)據(jù)庫(kù)達(dá)到期望的狀態(tài)。它也會(huì)記錄已執(zhí)
行的腳本狀態(tài),不會(huì)重復(fù)執(zhí)行。
,F(xiàn)lyway腳本就是SQL。讓其發(fā)揮作用的是其在Classpath里的位置和文件名。Flyway
腳本都遵循一個(gè)命名規(guī)范,V版本號(hào)__描述.sql,如V1__initdb.sql
Flyway腳本需要放在src/main/resources/db/migration里。
你還需要將spring.jpa.hibernate.ddl-auto設(shè)置為none,由此告知Hibernate不要?jiǎng)?chuàng)建
數(shù)據(jù)表。

原理:在應(yīng)用程序部署并運(yùn)行起來(lái)后,Spring Boot會(huì)檢測(cè)到Classpath里的Flyway,自動(dòng)配置所需的
Bean。Flyway會(huì)依次查看/db/migration里的腳本,如果沒(méi)有執(zhí)行過(guò)就運(yùn)行這些腳本。每個(gè)腳本都
執(zhí)行過(guò)后,向schema_version表里寫(xiě)一條記錄。應(yīng)用程序下次啟動(dòng)時(shí),F(xiàn)lyway會(huì)先看schema_version
里的記錄,跳過(guò)那些腳本。

用Liquibase定義數(shù)據(jù)庫(kù)遷移過(guò)程

相比Flyway的優(yōu)點(diǎn),數(shù)據(jù)庫(kù)無(wú)關(guān)性,腳本不是用sql寫(xiě),而是支持yaml,json,xml等格式。


org.liquibase
liquibase-core

具體介紹:略。

Actuator監(jiān)控應(yīng)用程序狀態(tài)

運(yùn)行中的應(yīng)用程序就像禮物盒。你可以刺探它,作出合理的推測(cè),猜測(cè)它的運(yùn)行情況。但如
何了解真實(shí)的情況呢?有沒(méi)有一種辦法能讓你深入應(yīng)用程序內(nèi)部一窺究竟,了解它的行為,檢查
它的健康狀況,甚至觸發(fā)一些操作來(lái)影響應(yīng)用程序呢?
Spring Boot的Actuator。它提供了很多生產(chǎn)級(jí)的特性,比如監(jiān)控和度
量Spring Boot應(yīng)用程序。Actuator的這些特性可以通過(guò)眾多REST端點(diǎn)、遠(yuǎn)程shell和JMX獲得。


org.springframework.boot
spring-boot-starter-actuator

1、Actuator的Web端點(diǎn)
端點(diǎn)可以分為三大類(lèi):配置端點(diǎn)、度量端點(diǎn)和其他端點(diǎn)

GET /autoconfig 提供了一份自動(dòng)配置報(bào)告,記錄哪些自動(dòng)配置條件通過(guò)了,哪些沒(méi)通過(guò)

GET /configprops 描述配置屬性(包含默認(rèn)值)如何注入Bean

GET /beans 描述應(yīng)用程序上下文里全部的Bean,以及它們的關(guān)系

GET /dump 獲取線(xiàn)程活動(dòng)的快照

GET /env 獲取全部環(huán)境屬性

GET /env/{name} 根據(jù)名稱(chēng)獲取特定的環(huán)境屬性值

GET /health 報(bào)告應(yīng)用程序的健康指標(biāo),這些值由HealthIndicator的實(shí)現(xiàn)類(lèi)提供

GET /info 獲取應(yīng)用程序的定制信息,這些信息由info打頭的屬性提供

GET /mappings 描述全部的URI路徑,以及它們和控制器(包含Actuator端點(diǎn))的映射關(guān)系

GET /metrics 報(bào)告各種應(yīng)用程序度量信息,比如內(nèi)存用量和HTTP請(qǐng)求計(jì)數(shù)

GET /metrics/{name} 報(bào)告指定名稱(chēng)的應(yīng)用程序度量值

POST /shutdown 關(guān)閉應(yīng)用程序,要求endpoints.shutdown.enabled設(shè)置為true

GET /trace 提供基本的HTTP請(qǐng)求跟蹤信息(時(shí)間戳、HTTP頭等)

/beans端點(diǎn)產(chǎn)生的報(bào)告能告訴你Spring應(yīng)用程序上下文里都有哪些Bean。
/autoconfig端點(diǎn)能告
訴你為什么會(huì)有這個(gè)Bean,或者為什么沒(méi)有這個(gè)Bean。
Spring Boot自動(dòng)配置構(gòu)建于Spring的條件化配置之上。它提供了眾多帶有
@Conditional注解的配置類(lèi),根據(jù)條件決定是否要自動(dòng)配置這些Bean。/autoconfig端點(diǎn)提供了
一個(gè)報(bào)告,列出了計(jì)算過(guò)的所有條件,根據(jù)條件是否通過(guò)進(jìn)行分組。

/env端點(diǎn)會(huì)生成應(yīng)用程序可用的所有環(huán)境屬性的列表,無(wú)論這些屬性是否用到。這其中包括
環(huán)境變量、JVM屬性、命令行參數(shù),以及applicaition.properties或application.yml文件提供的屬性。

/metrics端點(diǎn)提供了一些針對(duì)Web請(qǐng)求的基本計(jì)數(shù)器和計(jì)時(shí)器,但那些度量值缺少詳細(xì)信
息。知道所處理請(qǐng)求的更多信息是很有幫助的,尤其是在調(diào)試時(shí),所以就有了/trace這個(gè)端點(diǎn)。
/trace端點(diǎn)能報(bào)告所有Web請(qǐng)求的詳細(xì)信息,包括請(qǐng)求方法、路徑、時(shí)間戳以及請(qǐng)求和響應(yīng)的
頭信息

2、使用:CRaSH shell

3、通過(guò)JMX 監(jiān)控應(yīng)用程序

參考:

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

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/70160.html

相關(guān)文章

  • SpringBoot學(xué)習(xí)筆記:Getting Started構(gòu)建第一個(gè)Spring Boot工程

    摘要:本文參考官方文檔部分特定版本如版本官方文檔地址注本文基于構(gòu)建話(huà)說(shuō)在上已經(jīng)有多顆星了,足見(jiàn)火爆程度簡(jiǎn)介以下介紹引自創(chuàng)建獨(dú)立的應(yīng)用程序直接嵌入,或無(wú)需部署文件提供自己的入門(mén)來(lái)簡(jiǎn)化你的配置盡可能自動(dòng)配置提供生產(chǎn)就緒功能,如指標(biāo),運(yùn)行 本文參考 Spring Boot官方文檔 Part II. Getting Started部分特定版本如1.5.10.RELEASE版本官方文檔地址:https...

    Drummor 評(píng)論0 收藏0
  • Thymeleaf 3學(xué)習(xí)筆記

    摘要:目前最新版本作為官方推薦模板引擎,而且支持純?yōu)g覽器展現(xiàn)模板表達(dá)式在脫離運(yùn)行環(huán)境下不污染結(jié)構(gòu)是時(shí)候了解一番了。當(dāng)前數(shù)目,從開(kāi)始。 Thymeleaf 目前最新版本3.0Thymeleaf作為Spring-Boot官方推薦模板引擎,而且支持純HTML瀏覽器展現(xiàn)(模板表達(dá)式在脫離運(yùn)行環(huán)境下不污染html結(jié)構(gòu)).是時(shí)候了解一番了。 安裝與初始化配置 與Spring集成 org.thyme...

    stonezhu 評(píng)論0 收藏0
  • SpringBoot 入門(mén)簡(jiǎn)介

    摘要:這里使用的是數(shù)據(jù)庫(kù)啟動(dòng)類(lèi)上加上注解在啟動(dòng)類(lèi)中添加對(duì)包掃描掃描多個(gè)包下的可以有以下幾種方法掃描會(huì)自動(dòng)加載相關(guān)配置,數(shù)據(jù)源就會(huì)自動(dòng)注入到中,會(huì)自動(dòng)注入到中,可以直接使用。有配置文件下的使用掃描多個(gè)包下的可以有以下幾種方法掃描 Spring-Boot 學(xué)習(xí)筆記 1 Spring-Boot 介紹 1.1 什么是Spring-Boot Spring-Boot是由Pivotal團(tuán)隊(duì)提供的全新框架...

    chuyao 評(píng)論0 收藏0
  • spring-boot日志

    摘要:這篇文章是邊聽(tīng)尚硅谷的課程邊記的筆記,也是為了之后方便查看,視頻鏈接精彩的故事小張負(fù)責(zé)一個(gè)大型系統(tǒng)的開(kāi)發(fā),為了監(jiān)控系統(tǒng)的運(yùn)行狀況,系統(tǒng)中包含大量的語(yǔ)句,為了更好地管理呢,小張決定寫(xiě)一個(gè)日志框架對(duì)日志進(jìn)行管理,他設(shè)想的日志框架應(yīng)該包含以下幾個(gè) 這篇文章是邊聽(tīng)尚硅谷的課程邊記的筆記,也是為了之后方便查看,視頻鏈接:https://www.bilibili.com/vide... 1. 精彩...

    nifhlheimr 評(píng)論0 收藏0
  • 近幾個(gè)月Github上最熱門(mén)的Java項(xiàng)目一覽

    摘要:今天逛了逛,順手精選出了一下近幾個(gè)月以來(lái)上最熱門(mén)的個(gè)項(xiàng)目。相關(guān)閱讀正式開(kāi)源,幫助應(yīng)用快速容器化未來(lái)可能會(huì)上熱門(mén)的項(xiàng)目地址介紹哈哈,皮一下很開(kāi)心。這是我自己開(kāi)源的一份文檔,目前仍在完善中,歡迎各位英雄好漢一起完善。 showImg(https://segmentfault.com/img/remote/1460000015766827?w=391&h=220);今天逛了逛Github,順...

    cyqian 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<