主頁 > 後端開發 > Spring Boot系列 – 2. Spring Boot提供的特性

Spring Boot系列 – 2. Spring Boot提供的特性

2020-10-10 02:08:56 後端開發

一、導覽

本文主要按以下模塊介紹spring Boot(1.4.2.RELEASE)提供的特性,

SpringApplication類

外部化配置

Profiles

日志

開發WEB應用

Security

使用SQL

使用NoSQL

快取

訊息

發送郵件

JTA處理分布式事務

Spring Session

測驗

Actuator

部署

二、SpringApplication類

在主類——即帶有@SpringBootApplication注解類,的main方法里呼叫SpringApplication.run(應用的Configration配置類.class,引數串列) 會啟動spring應用,默認log級別是INFO,會顯示一些相關的啟動詳情,比如啟動應用的用戶等,

  1. 使用SpringApplicationBuilder類可以創建分層的

ApplicationContext
new SpringApplicationBuilder()
.bannerMode(Banner.Mode.OFF)
.sources(Parent.class)
.child(Application.class)
.run(args);

  1. Application事件和監聽器
    除了常用的Spring framework事件,例如ContextRefreshedEvent等,SpringApplication也會發送一些其他的應用事件,
    一些事件在ApplicationContext被創建之前就被觸發,因此無法將監聽器注冊為bean來監聽,但是可以使用SpringApplication.addListeners(…) 或SpringApplicationBuilder.listeners(…)來注冊監聽器,也可以在META-INF/spring.factories檔案定義監聽器:

org.springframework.context.ApplicationListener=com.example.project.MyListener

應用運行時,應用事件發送順序如下:
① 在監聽器和初始化器被初始化之后,任何其他應用之前,應用剛開始運行時會發送一個ApplicationStartedEvent,
② 在context被創建之前,context中要使用的Environment被知道時,一個ApplicationEnvironmentPreparedEvent被發送,
③ 在bean定義被加載之后,refresh啟動之前,一個ApplicationPreparedEvent被發送,
④ 在refresh以及任何相關的回呼被處理之后,一個ApplicationReadyEvent被發送,表明應用已準備好服務requests,
⑤ 啟動時如果發生例外,一個ApplicationFailedEvent被發送,

  1. web環境
    SpringApplication會根據應用是否為web來創建不同的ApplicationContext: AnnotationConfigApplicationContext或AnnotationConfigEmbeddedWebApplicationContext,
    可以呼叫setWebEnvironment(boolean webEnvironment)復寫默認實作(在junit測驗時置為false最好),更可以使用setApplicationContextClass(…).完全控制ApplicationContext的創建,

  2. 在SpringApplication.run完成前執行特定代碼
    使用ApplicationRunner或CommandLineRunner,并配合Order注解指定呼叫順序,
    CommandLineRunner的run(String …args)方法直接訪問SpringApplication.run傳遞的引數,ApplicationRunner的run方法則使用ApplicationArguments訪問引數,例如:

import org.springframework.boot.*
import org.springframework.stereotype.*
@Component
public class MyBean implements CommandLineRunner {
public void run(String... args) {
// Do something...
}
}

三、外部化配置

  1. 如何參考配置的屬性
    可使用properties檔案,YAML檔案,環境變數,命令列引數(如 –name=”fuck”)來外部化配置,屬性值可以使用@Value注解直接注入到bean中,并通過Spring的Environment抽象或經過@ ConfigurationProperties 注解系結到結構化物件來訪問,
    示例:

YAML檔案:
yml 屬性
或者等效的properties檔案:
properties屬性

使用@Value注入單個屬性:
單個屬性

使用@ ConfigurationProperties注入屬性族:
屬性組
※ 注意里面使用了JSR-303注解來校驗屬性值,

@ ConfigurationProperties還可以用到@Bean注解的方法上,
bean定義

  1. 屬性加載順序
    Spring按照如下順序設定properties:
    (一) 命令列引數,如:Java -jar app.jar –name=”Spring”
    (二) SPRING_APPLICATION_JSON,如java -Dspring.application.json=’{“foo”:”bar”, “hehe”:”fuck”}’ -jar fuckapp.jar
    (三) 來自于java:comp/env的JNDI屬性
    (四) Java System properties (System.getProperties()).
    (五) OS環境變數
    (六) 只有在random.*里包含的屬性會產生一個RandomValuePropertySource
    (七) jar包外部的,由profile指定的application properties檔案(application-{profile}.properties或YAML檔案)
    (八) jar包內部的,由profile指定的application properties檔案(application-{profile}.properties或YAML檔案)
    (九) jar包外部的application properties(application.properties和YAML),
    (十) jar包內部的application properties(application.properties和YAML),
    (十一) @Configuration注解類內部的@PropertySource注解
    (十二) 由SpringApplication.setDefaultProperties設定的默認屬性

YAML是JSON的超集,非常適合定義層級化配置資料,引入SnakeYAML庫會使SpringApplication類自動支持YAML,使用spring-boot-starter會自動引入YAML,

四、Profiles

Spring Profiles提供了一種隔離應用程式配置的方式,并讓這些配置只能在特定的環境下生效,

  1. 如何配置profile
    任何@Component或@Configuration都能被@Profile標記,從而限制加載它的時機,
    例如:

@Configuration
@Profile("production")
public class ProductionConfiguration {
// ...
}
2. 如何在構建時指定profile
以正常的Spring方式,你可以使用一個spring.profiles.active的Environment屬性來指定哪個配置生效,你可以使用平常的任
何方式來指定該屬性,例如,可以將它包含到你的application.properties中:

spring.profiles.active=dev,hsqldb
或使用命令列開關:
--spring.profiles.active=dev,hsqldb

2.1 添加激活的配置(profiles)
spring.profiles.active屬性和其他屬性一樣都遵循上文中提到屬性加載規則,優先級最高的PropertySource獲勝,也就是說,你可以在application.properties中指定生效的配置,然后在命令列中設定同名屬性的不同值來替換它們,

有些時候,將profile特定的屬性增加到active profile中,而不是直接替換會更有用,spring.profiles.include屬性就可以用來無條件增加active profiles,SpringApplication類也提供api設定額外的profile(setAdditionalProfiles())
例如,按照下面的配置:

--- my.property: fromyamlfile ---
spring.profiles: prod
spring.profiles.include: proddb,prodmq

如果應用啟動時打開選項–spring.profiles.active=prod,則proddb和prodmq也會被激活,

2.2 編程方式設定profile
在呼叫SpringApplication.run之前呼叫SpringApplication.setAdditionalProfiles(…)即可,實作ConfigurableEnvironment介面也可行,

2.3 profile特定的組態檔
除了application.properties檔案,profile特定的屬性也能通過application-{profile}.properties來定義,Spring boot提供了默認的application-default.properties檔案,在沒有定義任何profile時會加載,

profile特定的屬性從跟標準application.properties相同的路徑加載,并且特定profile檔案會覆寫默認的配置,如果宣告了不止一個profile,則最后宣告的被采用,

2.4 屬性中的占位符(placeholders)
application.properties中的值會將由Environment過濾,所以你可以直接飲用之前定義的值:
app.name=MyApp
app.description=${app.name} is a Spring Boot application

五、日志

Spring Boot內部日志使用Commons Logging,但是開發底層日志實作,會為Java Util Logging, Log4j, Log4j2和Logback提供默認配置,不論哪種配置,loggers都被預配置為使用console輸出,并提供一個可選的檔案輸出,

默認情況下,如果是使用’Starter POMs’,Logback將被用作日志實作,

  1. Log 格式
    Spring Boot默認的log格式如下:

2016-07-14 17:27:33.212 INFO 13092 --- [ost-startStop-1] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 3832 ms
2016-07-14 17:27:33.668 WARN 13092 --- [ost-startStop-1] .s.b.d.a.RemoteDevToolsAutoConfiguration : Listening for remote debug traffic on /.~~spring-boot!~/debug
1
2
3
1
2
3
顯示以下內容:

日期和時間—毫秒精度,利于排序
Log級別—ERROR, WARN, INFO, DEBUG or TRACE.
PID.
一個— 分隔符,表明實際log訊息的開始
執行緒名—方括號中顯示(控制臺輸出時可能會被省略)
Logger名—一般是類名的縮寫格式
log訊息
2. 控制臺輸出
默認,log資訊被原樣輸出到控制臺,輸出ERROR, WARN, INFO級別,可以通過以下手段激活debug模式,輸出更多的資訊:

在命令列使用 –debug 選項
在application.properties中添加debug=true
開啟debug模式后,一些核心的loggers(如嵌入的servlet容器,hibernate和Spring)被配置輸出更多的資訊,

請注意
此處開啟的debug模式,并非將你應用的日志級別修改為DEBUG級別,

Spring Boot輸出日志到控制臺時,會檢測console是否支持ansi,如果支持,會顯示彩色的日志,可以停止這種檢測,或更改檢測策略:
將 spring.output.ansi.enabled 改為其他值即可(默認是detect),

  1. 檔案輸出
    默認,Spring Boot只輸出日志到console,如果還想輸出到檔案,需要設定logging.file或logging.path屬性,
    它們的組合如下:

logging.file logging.path Example Description
無 無 只輸出到console
具體檔案名 無 my.log console和日志檔案,檔案名還可以帶路徑
無 具體路徑 /var/log console和路徑下的spring.log,路徑可絕對可相對
4. 日志級別
所有支持的日志系統在Spring的Environment(例如在application.properties里)都可以通過’logging.level.*=LEVEL’(’LEVEL’是TRACE, DEBUG, INFO, WARN,ERROR, FATAL, OFF中的一個)來設定日志級別,root logger可以通過logging.level.root來配置,
示例:application.properties

logging.level.root=WARN
logging.level.org.springframework.web=DEBUG
logging.level.org.hibernate=ERROR

  1. 自定義日志配置
    將相應jar包放到依賴中,即可激活對應的日志框架,將日志的組態檔放到classpath的根目錄下,或者放到logging.config指定路徑下,就可以自定義日志的輸出,

注意
因為logging實在ApplicationContext被創建之前就初始化的,因此無法通過@Configuration注解類的@PropertySources來控制日志,而只能通過系統屬性,環境變數和Spring Boot的外部組態檔等來配置

與日志系統相對應的檔案會被自動加載:

日志系統 組態檔
logback logback-spring.xml, logback-spring.groovy, logback.xml,logback.groovy
Log4j log4j-spring.properties, log4j-spring.xml, log4j.properties,log4j.xml
Log4j2 log4j2-spring.xml, log4j2.xml
JDK (Java Util Logging) logging.properties
注意
推薦使用-spring后綴的組態檔,例如logback-spring.xml,而非logback.xml,否則Spring可能無法完全控制log的初始化,

注意
Java Util Logging可能會導致類加載問題,不推薦使用,

  1. Logback擴展
    Spring Boot為Logback提供了一些高級配置屬性,可以在logback-spring.xml中使用,

注意
不能再logback.xml中使用,因為此檔案加載的太早,要么在logback-spring.xml中使用,要么定義logging.confi屬性,

6.1 Profile特定的配置
標簽允許你基于Spring profiles加入或者排除一些配置,
例如:

6.2 Environment屬性
標簽允許你在logback組態檔中使用Spring Environment的屬性,這可以讓你在logback配置中使用application.properties中的值,
例如:

${fluentHost} ...

六、開發web應用

Spring Boot非常適合開發web應用,你可以使用內嵌的Tomcat,Jetty或Undertow輕松創建一個HTTP服務器,大多數的web應用都使用spring-boot-starter-web模塊進行快速搭建和運行,

  1. Spring MVC
    Spring Web MVC框架是一個富”模型,視圖,控制器”的web框架, 允許你創建特定的@Controller或@RestController beans來處理傳入的HTTP請求, 使用@RequestMapping注解可以將控制器中的方法映射到相應的HTTP請求,
    Spring Boot為MVC提供了如自動配置,模板引擎等很多特性,

1.1 自動配置
Sprint boot為mvc增加如下自動配置:

引入ContentNegotiatingViewResolver和BeanNameViewResolver beans,
① ContentNegotiatingViewResolver是ViewResolver的一種實作,其根據請求的media type來為請求選擇一個合適的View,請求的mediatype由ContentNegotiationManager決定,一旦請求的media type被決定,這個resolver查詢所有的view resolver,并回傳最匹配的,可以指定ContentNegotiatingViewResolver 的defaultViews屬性,在mediatype匹配時將使用此defaultViews指定的viewResolver,
例如,一個/view.html的請求會去尋找content type為text/html的viewresolver;一個路徑為/view,并且header中Accept為text/html的請求也同理,

② BeanNameViewResolver也是一種viewresolver,簡單的將view name解釋成bean
name,如controller中回傳”view”,會去找id為view的bean,

對靜態資源的支持,包括對WebJars的支持,

自動注冊Converter,GenericConverter,Formatter beans
Converter<S,T>用來將S轉換成T

對HttpMessageConverters的支持,
可將物件轉換成Http request/response,或者相反,Spring MVC中,object可以自動轉換成Json(Jackson庫)或XML(Jacksonxml或者jaxb),String使用utf-8編碼,

自動注冊MessageCodesResolver,

對靜態index.html的支持,

對自定義Favicon的支持,

ConfigurableWebBindingInitializer bean的自動使用,
※ 若要完全掌控springmvc,應添加自己的@Configuration和@EnableWebMVC注解的類,若想保留Spring boot mvc的特性,同時添加額外的mvc配置(如攔截器,formatters,view controllers等),你可以添加自己的WebMvcConfigurerAdapter型別的@Bean(不使用@EnableWebMVC注解),

1.2 靜態內容
默認情況下,Spring Boot從classpath的/static(/public,/resources或/META-INF/resources)的檔案夾或從ServletContext根目錄提供靜態內容,
這使用了Spring MVC的ResourceHttpRequestHandler,所以你可以通過添加自己的WebMvcConfigurerAdapter并覆寫addResourceHandlers方法來改變這個行為(加載靜態檔案),
如果你的應用將被打包成jar,那就不要使用src/main/webapp檔案夾,盡管該檔案夾是一個共同的標準,但它僅在打包成war的情況下起作用,并且如果產生一個jar,多數構建工具都會靜悄悄的忽略它,

1.3 模板引擎
Spring boot支持以下模板引擎的自動配置:freemarker, groovy, thymeleaf, velocity, mustache,
Boot自動從src/main/resources/templates中搜索模板,
使用內置servlet容器時要避免使用jsp,原因如下:

內置tomcat不支持執行jar里的jsp,
Jetty在jsp時不支持內置容器個格式,
Undertow不支持jsp,
1.4 Error Handling
Spring Boot默認提供一個/error映射用來以合適的方式處理所有的錯誤,并且它在servlet容器中注冊了一個全域的 錯誤頁面,
想要完全替換默認行為,可以實作ErrorController介面,或者實作BasicErrorController類,由自定義的Controller處理錯誤,
也可以通過@ContorllerAdavice注解+@ExceptionHandler注解定制某個controller或exception類別要回傳的JSON檔案,如:

@ControllerAdvice(basePackageClasses = FooController.class)
public class FooControllerAdvice extends ResponseEntityExceptionHandler {
@ExceptionHandler(YourException.class)
@ResponseBody
ResponseEntity<?> handleControllerException(HttpServletRequest request, Throwable ex) {
HttpStatus status = getStatus(request);
return new ResponseEntity<>(new CustomErrorType(status.value(), ex.getMessage()), status);
}
private HttpStatus getStatus(HttpServletRequest request) {
Integer statusCode = (Integer) request.getAttribute("javax.servlet.error.status_code");
if (statusCode == null) {
return HttpStatus.INTERNAL_SERVER_ERROR;
}
return HttpStatus.valueOf(statusCode);
}
}
2. 嵌入的servlet容器
Spring Boot支持內嵌的Tomcat, Jetty和Undertow服務器,多數開發者只需要使用合適的’Starter POM’來獲取一個完全配置好的實體即可,默認情況下,內嵌的服務器會在8080埠監聽HTTP請求,

2.1 將Servlets, filters, listeners注冊為bean
所有定義為bean的servlets,filters,listeners都將被嵌入的容器注冊,如果只有一個servlet,它將被map到/,否則bean的名字會作為path前綴,Filters都將map到/*,
也可以使用ServletRegistrationBean,FilterRegistrationBean and ServletListenerRegistrationBean更完整的控制,

2.2 通過注解掃描servlet, filter listener
使用嵌入式容器時,要實作@WebServlet,@WebFilter, @Weblistener的自動注冊,需要使用@ServletComponentScan,使用獨立容器時此注解無用,

2.3 Servlet Context 初始化
嵌入的servlet容器不會直接執行Servlet3.0+的javax.servlet.ServletContainerInitializer介面,或者Spring的 org.springframework.web.WebApplicationInitializer介面,這是為了避免有些被設計為運行在war內的第三方庫會破壞sprint boot應用,獨立httpserver下實作WebApplicationInitializer即可在代碼中配置ServletContext,代替web.xml,
若需要在spring boot應用中進行servlet context 初始化,你應該注冊一個實作了org.springframework.boot.context.embedded.ServletContextInitializer介面,

2.4 EmbeddedWebApplicationContext
此類是一種特殊的WebApplicationContext,啟動時會搜索一個EmbeddedServletContainerFactory,例如TomcatEmbeddedServletContainerFactory, JettyEmbeddedServletContainerFactory, or UndertowEmbeddedServletContainerFactory,Spring boot會自動配置這些,

2.5 配置嵌入式servlet容器
2.5.1 可以在如application.properties檔案中配置servlet容器所用的屬性
包括:

server.port:http監聽埠
server.address: 要系結的介面地址
server.session.persistence: session持久化
server.session.timeout:session超時時間
server.session.store-dir:session資料的location
server.session.cookie.*: session-cookie配置,
server.error.path:error page的地址
server.ssl.key-store, server.ssl.key-store-password, server.ssl.key-password: ssl的配置
server.compression.enabled: http response壓縮
server.compression.min-response-size:壓縮所需的最小size,默認時2048位元組
server.compression.mime-types:要壓縮的response content 型別,默認時text/html, text/xml, text/plain, text/css
2.5.2 也可通過實作EmbeddedServletContainerCustomizer介面在代碼中修改屬性
2.5.3 也可直接實作TomcatEmbeddedServletContainerFactory bean來配置
七、Security

  1. 啟用Security
    當spring security在classpath中(即引入spring-boot-starter-security pom),web應用將自動啟用安全限制,并且默認啟用basic認證,
    也可通過@EnableGlobalMethodSecurity注解添加方法級別的安全限制,

  2. 配置Security
    默認的AuthenticationManager有一個用戶,名為user, 密碼會列印在log中,也可設定security.user.password屬性修改密碼,
    默認的security配置由SecurityAutoConfiguration配置類及其匯入的配置類(SpringBootWebSecurityConfiguration配置web security, AuthenticationManagerConfiguration配置認證,此類在非web應用也適用)實作,
    若要完全關閉默認的web security配置,可以添加一個帶有@EnableWebSecurity的bean,這樣并不會關閉authentication manager配置,

@EnableWebSecurity注解使用方法
將此注解添加到帶有@Configuration注解,并且實作了WebSecurityConfigurer介面或繼承WebSecurityConfigurerAdapter類的類上面,即可用此類替代xml設定web
security,同時還可將配置內容放到外部屬性檔案中,

若也想關閉authentication manager配置,你可以增加一個AuthenticationManager的bean,或者通過將AuthenticationManagerBuilder注入到@Configuration類的一個方法中來配置全域的AuthenticationManager,

  1. Security帶來的特性
    Web應用中使用Spring Security以后,你可以獲得如下基本特性:

一個帶有in-memory store的AuthenticationManager,和一個user(查看SecurityProperties.User獲取user的屬性),
通用靜態資源路徑不會被安全限制:css/, /js/, /images/* and */favicon.ico
其他部分都會應用Http Basic安全保護,
安全事件都會被發布到spring的ApplicationEventPublisher(包括認證成功,認證失敗以及拒絕訪問等)
Spring Security提供的常見底層特性(HSTS, XSS, CSRF, 快取)默認都被開啟,
HSTS是什么
HTTP Strict Transport Security,HTTP嚴格傳輸安全,HSTS的作用是強制客戶端(如瀏覽器)使用HTTPS與服務器創建連接,服務器開啟HSTS的方法是,當客戶端通過HTTPS發出請求時,在服務器回傳的超文本傳輸協議回應頭中包含Strict-Transport-Security欄位,非加密傳輸時設定的HSTS欄位無效,
參考: http://www.chinaz.com/program/2015/0511/405146.shtml

所有上面的配置都可以通過外部屬性檔案修改,想要在不改變任何其他自動配置特性的前提下覆寫訪問規則,可以增加一個WebSecurityConfigurerAdapter型別的bean,

如果開啟了spring-boot-actuator,會有如下特性:

  • 即使應用路徑不受保護,被管理的路徑也會受到保護,
  • 安全相關的事件被轉換為AuditEvents(審計事件),并發布給AuditService,
  • 默認的用戶有ADMIN和USER的角色,
    使用外部屬性能夠修改Actuator(執行器)的安全特性(management.security.*),為了覆寫應用程式的訪問規則,你可以添加一個WebSecurityConfigurerAdapter型別的@Bean,同時,如果不想覆寫執行器的訪問規則,你可以使用@Order(SecurityProperties.ACCESS_OVERRIDE_ORDER)注解該bean,否則使用@Order(ManagementServerProperties.ACCESS_OVERRIDE_ORDER)注解該bean,

八、使用SQL資料庫

Spring Boot專案引入spring-boot-starter-data-jpa等即可使用Spring Data與DB互動,除了spring框架提供的JdbcTemplate以及ORM,Spring Data還提供了其他級別的功能,如創建Repository介面的實作,然后基于方法名產生queries,

  1. 配置資料源
    Java的javax.sql.DataSource介面提供了一個標準的使用資料庫連接的方法,傳統做法是,一個DataSource使用一個URL和用戶名/密碼去初始化一個資料庫連接,

1.1 內嵌資料庫
Spring boot支持自動配置三種in-memory的嵌入式DB:H2, HSQL,Derby,
無需提供URL,引入如下依賴即可使用,例如,典型的pom如下:

org.springframework.boot spring-boot-starter-data-jpa org.hsqldb hsqldb runtime 勺ò干以使Spring Boot自動為應用配置in-memory的hsqldb資料庫,并建立連接,

1.2 連接到一個生產環境資料庫
在生產環境中,資料庫連接可以使用DataSource池進行自動配置,Spring boot自動配置DataSource池時的選擇順序如下:

由于Tomcat資料源連接池的性能和并發,在tomcat可用時,我們總是優先使用它,
如果HikariCP可用,我們將使用它,
如果Commons DBCP可用,我們將使用它,但在生產環境不推薦使用它,
最后,如果Commons DBCP2可用,我們將使用它,
如果使用了spring-boot-starter-jdbc或spring-boot-starter-data-jpa ‘starter POMs’,你將會自動獲取對tomcat-jdbc的依賴,
若要修改默認的資料源型別,或者指定其他的資料源型別,可以在application.properties中指定,
例如:

spring.datasource.url=jdbc:mysql://localhost/test
spring.datasource.username=dbuser
spring.datasource.password=dbpass
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.type=xxxxxHikariCP

注:使用MySQL時要增加mysql connector的依賴,

  1. 使用JdbcTemplate
    Spring的JdbcTemplate和NamedParameterJdbcTemplate類將被自動配置,你可以在自己的beans中通過@Autowire直接注入它們,
    例如:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;
@Component
public class MyBean {
private final JdbcTemplate jdbcTemplate;
@Autowired
public MyBean(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}

  1. JPA和Spring Data
    Spring-boot-starter-data-jpa提供如下依賴:

Hibernate
Spring Data JPA
Spring ORMs
3.1 Entity類
傳統上,JPA物體需要在persistence.xml中宣告,Spring boot中無需這樣,它可以自動搜索Entity,
默認在主配置類(標記有@EnableAutoConfiguration 或者 @SpringBootApplication)下的所有包會被搜索,并且會搜索帶有@Entity, @Embeddable 或者 @MappedSuperclass的類,

3.2 Spring Data JPA Repositories
Spring Data JPA倉庫(repositories)是用來定義訪問資料的介面,JPA會根據你的方法名自動創建查詢,比如,一個CityRepository介面可能宣告一個findAllByState(String state)方法,用來查找給定狀態的所有城市,
繼承Repository 、CrudRepository或者PagingAndSortingRepository介面的介面即為Spring JPA的repositories,Spring Boot會自動搜索這些介面,并通過方法名自動生成JPA queries,更復雜的查詢可借助Spring Data的Query注解,

3.3 創建和洗掉JPA db
默認情況下,只有使用嵌入式DB(H2, HSQL或Derby)時,jpa資料庫才會被自動創建,
可以通過spring.jpa.*屬性來配置jpa,例如:
spring.jpa.hibernate.ddl-auto=create-drop可開啟自動創建和洗掉表,并且默認情況下,ApplicationContext啟動之后才會執行DDL,
spring.jpa.generate-ddl 也可以用來配置生成表,但是Hibernate自動配置下,該選項不會被激活,因為Hibernate的ddl-auto屬性更適用,

九、使用NoSQL
Spring Data支持MongoDB, Neo4J, Elasticsearch, Solr, Redis, Gemfire, Couchbase 和Cassandra等NoSQL技術,
Spring Boot可以自動配置其中的Redis, MongoDB, Elasticsearch, Solr 和 Cassandra,其他需要手動配置,

  1. Redis
    spring-boot-starter-redis自動匯入依賴,Spring boot會自動配置RedisConnectionFactory, StringRedisTemplate 或者RedisTemplate,默認,這些實體會連接localhost:6379,
    例子:

@Component
public class MyBean {
private StringRedisTemplate template;
@Autowired
public MyBean(StringRedisTemplate template) {
this.template = template;
}
// ...
}
如果你添加一個自己的任何自動配置型別的@Bean,它將替換默認的(除了RedisTemplate的情況,它是根據bean的名稱’redisTemplate’而不是它的型別進行排除的),如果在classpath路徑下存在commons-pool2,默認你會獲得一個連接池工廠,

  1. MongoDB
    spring-boot-starter-data-mongodb匯入依賴,
    Spring boot自動配置MongoDbFactory和MongoTemplate,默認實體使用mongodb://localhost/test
    可設定以下屬性:
    spring.data.mongodb.uri (mongodb3.0)
    spring.data.mongodb.host (mongo 2.x)
    spring.data.mongodb.port
    Spring Data MongoDB也支持和Spring Data JPA一樣的Repository介面,Spring Data會根據方法名自動生成queries,

  2. Solr
    Apache Solr是個搜索引擎, Sprint Boot利用Spring Data Solr為Solr4客戶端庫提供基本的自動配置,spring-boot-starter-datasolr匯入依賴,Solr5暫不支持,
    Spring Boot自動配置SolrServer,默認連接localhost:8983/solr
    Spring Data也為Solr提供與JPA一樣的Repositories,只不過物體注解為@SolrDocument,

  3. Elasticsearch
    Elastic Search是一個開源的,分布式,實時搜索和分析引擎,Spring Boot利用Spring Data Elasticserach為Elasticsearch提供基本的自動配置,spring-boot-starter-data-elasticsearch匯入依賴,
    Spring boot自動配置ElasticsearchTemplate或Client實體,并且默認連接一個本地的記憶體服務器(即一個NodeClient),可設定spring.data.elasticsearch.cluster-nodes連接到remote server(TransportClient),
    Spring Data也為Elasticsearch提供與JPA一樣的Repositories,只不過物體注解為@Document,

十、快取
Spring 框架支持透明地為應用添加快取,其核心是抽象層將快取應用到方法,減少執行次數,可以使用JSR-107(JCache)注解后者水平自己的快取注解實作快取,
JCache示例:

import javax.cache.annotation.CacheResult;
import org.springframework.stereotype.Component;
@Component
public class MathService {
@CacheResult
public int computePiDecimal(int i) {
// ...
}
}

Cache抽象層并不提供真實的存盤,它依賴于org.springframework.cache.Cache 和 org.springframework.cache.CacheManager提供的抽象,開啟@EnableCaching之后,SpringBoot會根據實作自動配置一個合適的CacheManager,
spring-boot-starter-cache匯入依賴,
Spring Boot會依如下順序檢測快取provider,

Generic
JCache (JSR-107)
EhCache 2.x
Hazelcast
Infinispan
Redis
Guava
Simple
也可使用spring.cache.type指定使用哪一種快取,
若由Spring Boot自動配置CacheManager, 你可以通過實作CacheManagerCustomizer介面在cachemanager在完全初始化以前調整其配置:

@Bean
public CacheManagerCustomizer cacheManagerCustomizer() {
return new CacheManagerCustomizer() {
@Override
public void customize(ConcurrentMapCacheManager cacheManager) {
cacheManager.setCacheNames(Arrays.asList("one", "two"));
}
};
}

  1. Generic (自定義Cache)
    當至少自定義了一個org.springframework.cache.Cache bean時,Generic caching會被啟用,并且會配置一個CacheManager來包裝它們,

  2. JCache
    當javax.cache.spi.CachingProvider(這是個JSR107兼容的快取庫)在classpath中時,JCache會被啟動,當有多個provider時,必須通過spring.cache.jcache.provider明確指定一個,還可通過spring.cache.jcache.config來指定組態檔的位置,
    有一些方法可以定制化javax.cache.cacheManager:

可以在啟動時指定spring.cache.cache-names創建caches,也可定義javax.cache.configuration.Configuration bean去定制化,
org.springframework.boot.autoconfigure.cache.JCacheManagerCustomizer beans會被呼叫,并傳入CacheManager來定制,
3. EhCache2.x
在classpath跟路徑下如果發現了ehcache.xml,EhCache2.x會被使用,也可使用指定spring.cache.ehcache.config=classpath:config/another-config.xml其他檔案,

  1. Redis
    若配置了Redis,RedisCacheManager會被自動配置,也可以由spring.cache.cache-names指定,
    Hazelcast和Infinispan略,

  2. Guava
    如果Guava可用,GuavaCacheManager會被配置,也可通過spring.cache.cache-names指定,

  3. Simple
    如果上述選項都沒成功,一個使用ConcurrentHashMap的簡單實作會被配置為cache store.

十一、訊息
Spring Framework框架為集成訊息系統提供了擴展支持:從使用JmsTemplate簡化JMS API,到實作一個完整異步訊息接收的底層設施,
Spring AMQP提供一個相似的用于’Advanced Message Queuing Protocol’的特征集,并且Spring Boot也為RabbitTemplate和RabbitMQ提供了自動配置選項,
Spring WebSocket提供原生的STOMP訊息支持,并且Spring Boot通過starters和一些自動配置也提供了對它的支持,

  1. JMS
    javax.jms.ConnectionFactory介面提供了一個標準的用于創建一個javax.jms.Connection的方法,javax.jms.Connection用于和JMS代理(broker)互動,Spring Boot為收發訊息提供了自動配置,

1.1 ActiveMQ 支持
SpringBoot檢測到ActiveMQ在classpath中可用時,會配置一個ConnectionFactory,可配置如下屬性:
spring.activemq.broker-url=tcp://192.168.1.210:9876
spring.activemq.user=admin
spring.activemq.password=secret

1.2 HornetQ支持
支持的屬性有embedded,native,spring-boot-starter-hornetq匯入依賴,

1.3 Artemis 支持
Apache Artemis是在2015年HornetQ被捐給Apache基金會以后建立的,所有特性和HornetQ一樣,spring-boot-starter-artemis匯入依賴

  1. AMQP
    AMQP是一個面向訊息的,平臺中立、wire-level(指的是并非定義api和庫,而是定義會話位元組流,類似http)的中間件協議,

2.1 RabbitMQ支持
RabbitMQ是輕量級,可靠的,可擴展的,輕便的基于AMQP協議的訊息代理,Spring利用RabbitMQ實作AMQP協議,可通過spring.rabbitmq.*屬性組來配置,如:
spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=admin
spring.rabbitmq.password=secret
Spring boot會自動配置AmqpTemplate,AmqpAdmin,RabbitMessagingTemplate,

十二、發送郵件
Spring Boot自動配置JavaMailSender來發送郵件,spring-boot-starter-mail匯入依賴,
可通過spring.mail.*屬性組來配置,

十三、JTA處理分布式事務
Spring Boot使用一個Atomkos或Bitronix的內嵌事務管理器來支持跨多個XA資源的分布式JTA事務,當部署到一個恰當的J2EE應用服務器時也會支持JTA事務,
當發現一個JTA環境時,Spring Boot將使用Spring的JtaTransactionManager來管理事務,自動配置的JMS,DataSource和JPA beans將被升級以支持XA事務,
你可以使用標準的@ransactional來參與到一個分布式事務中,可設定ring.jta.enabled=alse來禁用JTA自動配置功能,
spring-boot-starter-jta-atomikos和spring-boot-starter-jta-bitronix匯入依賴,

十四、Spring Session
Spring Session為管理用戶的session資訊提供支持,若web應用的classpath中有spring session 和spring data redis,spring boot會通過@EnableRedisHttpSession自動配置Spring session,Session資料被存盤在redis中,超時期限可通過server.session.timeout設定,

十五、測驗
spring-boot-starter-test提供以下庫:
? spring-test提供集成測驗支持
? JUnit
? Hamcrest—為JUnit提供assertThat支持
? Mockito

  1. 測驗Spring Boot應用
    Spring Boot提供@SpringApplicationConfiguration替代spring-test標準的@ContextConfiguration注解,測驗中使用@SpringApplicationConfiguration配置ApplicationContext,ApplicationContext會被SpringApplication創建,并且帶有額外的Spring boot的特性,實體:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(SampleDataJpaApplication.class)
public class CityRepositoryIntegrationTests {
@Autowired
CityRepository repository;
// ...
}
另外加上@WebIntegrationTest 或 @WebAppConfiguration注解,會使得context loader認為你在測驗web應用,例如,為測驗類加上@WebIntegrationTest會以web應用方式啟動測驗:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(SampleDataJpaApplication.class)
@WebIntegrationTest
public class CityRepositoryIntegrationTests {
@Autowired
CityRepository repository;
RestTemplate restTemplate = new TestRestTemplate();
// ... interact with the running server
}
可以使用@WebIntegrationTest注解的server.port等屬性修改埠,例如:@WebIntegrationTest(“server.port:9000”),如果將server.port和management.port置為0,應用的集成測驗將使用任意埠,例如:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(MyApplication.class)
@WebIntegrationTest({"server.port=0", "management.port=0"})
public class SomeIntegrationTests {
// ...
}
十六、Actuator(促動器):: Production-ready features
Springboot提供一些特性幫你在應用部署到生產環境后監視和管理應用,可通過HTTP,JMX甚至remote shell(SSH,Telnet)來管理和監視,審計,健康和資料采集會自動應用到你的應用,
HTTP只有在基于Spring MVC的應用中才可用,

  1. 開啟production-ready 特性
    spring-boot-actuator提供Spring boot的production ready特性,
    Actuator是機器術語,指移動或控制其他東西的機械設備,Actuator通過微小的改變產生很大的移動,
    spring-boot-starter-actuator匯入依賴,

  2. endpoints 端點
    Actuator端點使你可以監視應用并與之互動,Spring boot包含一些內置的端點(例如health端點),你也可以自己增加,
    端點被暴露的方式取決于選擇的技術型別,大多應用選擇HTTP監視,這樣端點的ID被map到URL,如health端點被map到/health.

2.1 常用端點
ID 描述 是否敏感
actuator 為其他端點提供一個基于超媒體(hypermedia-based)的發現頁面,需要Spring HATEOAS支持 true
autoconfig 顯示一個auto-configuration的報告,該報告展示所有auto-configuration候選者及它們被應用或未被應用的原因 true
beans 顯示一個應用中所有Spring Beans的完整串列 true
health 展示應用的健康資訊(當使用一個未認證連接訪問時顯示一個簡單的’status’,使用認證連接訪問則顯示全部資訊詳情) false
info 顯示任意的應用資訊 false
dump 執行一個執行緒轉儲 true
mappings 顯示一個所有@RequestMapping路徑的整理串列 true
trace 顯示trace資訊(默認為最新的一些HTTP請求) true
什么是”是否敏感”?
取決于你如何暴露端點,敏感性可以用作安全指示,例如,如果使用HTTP并且打開了Spring Security,那么訪問敏感端點要求用戶名和密碼,

2.2 CORS跨域資源共享支持
Cross-origin resource sharing,是個W3C規格,它為Web服務器定義了一種方式,允許網頁從不同的域訪問其資源(如字體),簡言之,CORS就是為了讓AJAX可以實作可控的跨域訪問而生的,Actuator的MVC端點可以配置支持該場景:

endpoints.cors.allowed-origins=http://example.com
endpoints.cors.allowed-methods=GET,POST

  1. 通過HTTP監控和管理
    開發Spring MVC應用時,Spring Boot Actuator會自動配置所有打開的端點,并通過HTTP暴露,默認的約定是端點id被map到url,如health到/health,

3.1 保護敏感端點
如果應用了Spring security,所有通過HTTP暴露的敏感的端點都會被保護,默認會使用基本認證(basic authentication,用戶名為user,密碼為應用啟動時在控制臺列印的密碼),
你可以使用Spring屬性改變用戶名,密碼和訪問端點需要的安全角色,例如,在application.properties中添加下列配置:

security.user.name=admin
security.user.password=secret
management.security.role=SUPERUSER

3.2 定制管理端點的路徑
可通過如下設定為端點的url設定前綴:

management.context-path=/manage
1
1
也可修改端點的id或者path來達到修改path的目的:

endpoints.health.id = fuck
endpoints.health.path = /fuck/damn

3.3 定制管理服務器的埠
針對基于云的部署,使用默認HTTP埠暴露管理端點比較明智,如果應用運行在自己的資料中心,可以如下修改埠:

management.port=8081

一般情況下內部應用的管理埠都被防火墻保護,不對外開放,因此可以如下關掉保護:

management.security.enabled=false

※ 只有在啟用Spring security才有必要明顯的關閉,否則反而可能破壞應用,

3.4 定制管理服務器地址:
management.port=8081
management.address=127.0.0.1

3.5 關掉http端點
management.port=-1

  1. 度量指標Metrics
    Spring Boot Actuator包括一個支持’gauge’和’counter’級別的度量指標服務,’gauge’記錄一個單一值;’counter’記錄一個增量(增加或減少),
    所有HTTP請求的度量指標都會被自動記錄,通過metrics端點(/metrics)即可訪問,

4.1 系統度量指標
Spring Boot暴露以下系統指標:
系統記憶體總量(mem),單位:Kb
空閑記憶體數量(mem.free),單位:Kb
處理器數量(processors)
系統正常運行時間(uptime),單位:毫秒
應用背景關系(就是一個應用實體)正常運行時間(instance.uptime),單位:毫秒
系統平均負載(systemload.average)
堆資訊(heap,heap.committed,heap.init,heap.used),單位:Kb
執行緒資訊(threads,thread.peak,thead.daemon)
類加載資訊(classes,classes.loaded,classes.unloaded)
垃圾收集資訊(gc.xxx.count, gc.xxx.time)

4.2 資料源指標
以下指標會被暴露(前綴都是datasource.):
活躍連接數(datasource.xxx.active)
當前連接池使用率(datasource.xxx.usage)

4.3 快取指標
以下指標會被暴露:
當前cache大小(cache.xxx.size)
命中率(cache.xxx.hit.ratio)
未命中率(cache.xxx.miss.ratio)

4.4 tomcat session指標
若使用tomcat做嵌入的servlet容器,session指標會被暴露:
活躍session數:httpsessions.active
最大session數:httpsessions.max

十七、部署SpringBoot應用
Spring Boot靈活的打包選項幫你更容易的將Spring Boot 應用部署到云平臺,容器鏡像,虛擬機或者物體機,

  1. 部署到云
    Spring Boot的可執行jar包可以部署到大多數流行的PaaS(Platform as a service)云提供者,這些云提供者要求使用者“帶好自己的容器”;而它們管理應用行程,所以它們需要一些中間層來將你的應用適配到云概念中的一個運行行程,
    兩個流行的云提供者,Heroku和Cloud Foundry,采取一種“buildpack”方式,Buildpack將你部署的代碼打包進任何啟動應用所需的包里:可能是個JDK和一個java呼叫,可能是一個嵌入式web服務器,也可能是一個完整的應用服務器,一個buildpack是可插拔的,但你最好盡可能少的對它進行自定義設定,這可以減少不受你控制的功能范圍,并最小化開發和生產環境的差別,
    理想情況下,你的應用比如一個Spring boot可執行jar包,應含有它運行所需的一切,
    還有OpenShift, Boxfuse和Amazon Web Service也支持Spring boot jar的部署
    Goole App Engine只支持Servlet 2.5,要部署Springboot應用需要做修改,

  2. 安裝Spring Boot 應用,
    除了使用jar –jar運行可執行jar包,還可以編譯成Unix上的完全可執行應用:

org.springframework.boot spring-boot-maven-plugin true

CentOS和Ubuntu上都已支持此功能,這樣就可將應用以unix/Linux service的方式啟動,

參考鏈接
http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/

歡迎關注 Java架構師社區公眾號.
本文轉載自Java架構師必看 ,更多內容點擊查看!

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/165332.html

標籤:Java

上一篇:Java中 util 包 Calendar類制作萬年歷(不用自己寫方法,直接用Java寫好的包中的類的方法)

下一篇:面試官:大部分面試官都會問到的5個Java面試題你都懷疑人生,還跟我提想要月薪20k?

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more