1. 程式人生 > >我的SpringBoot實踐筆記

我的SpringBoot實踐筆記

SpringBoot 實踐筆記

Spring Boot四大核心:

自動配置:針對Spring常見的應用程序,能自動提供相關的配置

起步依賴:功能--->引入需要的庫 組裝機和品牌機的區別

命令行界面:代碼--->應用程序

Actuator:???



Spring Initializr使用:

1.http://start.spring.io/

2.Idea Spring Initailzr

3.命令行生成

。。。




spring-boot-starter-parent:Spring Boot父級依賴

提供Maven默認依賴

可以被覆蓋,如何?

知識點:

maven單繼承的問題?scope=import來解決

<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-maven-plugin:

將項目打包成一個可執行的超級jar java -jar運行

搜索主方法作為程序入口




@SpringBootApplication SpringBoot核心註解,開啟自動配置

@RestController == @Controller+@ResponseBody

@PathVarible




知識點:Mac上maven的配置

1.$ touch ~/.bash_profile

2.$ vim ~/.bash_profile

M2_HOME=/Users/zeng/Documents/Maven/apache-maven-3.3.9

PATH=$PATH:$M2_HOME/bin

export M2_HOME

export PATH

3.$ source ~/.bash_profile (不會有輸出反應)

4.$ mvn -version





Spring Boot三種運行方式:

Chapter1Application的main方法

mvn spring-boot:run 自動掃描項目找到入口

mvn package java -jar 需要很多jar包和插件




Spring Boot熱部署:

1.devtools

Pom.xml中直接添加依賴即可:

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-devtools</artifactId>

<scope>provided</scope>

<!--optional我沒弄明白,都說必須為true,但我測試true,false,不加都可以-->

<optional>true</optional>

</dependency>

2.springloaded

Pom.xml中直接在spring-boot插件中添加依賴即可:

<plugin>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-maven-plugin</artifactId>

<dependencies>

<!-- spring熱部署 -->

<dependency>

<groupId>org.springframework</groupId>

<artifactId>springloaded</artifactId>

<version>1.2.6.RELEASE</version>

</dependency>

</dependencies>

<configuration>

<mainClass>cn.springboot.Mainspringboot</mainClass>

</configuration>

</plugin>

編譯即可實現熱部署!!!command+shit+F9





關閉回調

jackson json格式

中文木有亂碼 默認UTF-8編碼




SpringBoot測試:

MockMvc mvc = MockMvcBuilders.standaloneSetup(new DemoApplication()).build();




配置文件:

生效順序:從上向下對值依次覆蓋

@TestPropertySource

命令行參數

System.getProperties()

操作系統環境變量

radom.*裏包含的屬性會產生一個隨機數

properties文件

@Configuration 類上的@PropertySource註解

默認註釋,SpringApplication.setDefaultProperties指定






配置文件: 可以使用YAML代替Properties,冒號後要加個空格

配置默認端口,配置各個環境下的端口號

配置date-format和時區

隨機數的玩法:

roncoo.secret=${random.value}

@Value(value = "${roncoo.secret}")

屬性占位符的玩法:

roncoo.name=www.roncoo.com

roncoo.desc=${roncoo.name} is a domain name





Spring Boot日誌配置

log4j(較差)、log4j2、logback

log4j:

# 日誌文件名,比如:roncoo.log,或者是 /var/log/roncoo.log

logging.file=roncoo.log

# 日誌級別配置,比如: logging.level.org.springframework=DEBUG

logging.level.*=info

logging.level.org.springframework=DEBUG

logback:Spring Boot默認加載classpath:logback-spring.xml或者classpath:logback-spring.groovy

<!-- 測試環境 -->

<springProfile name="test">

<!-- 每天產生一個文件 -->

<appender name="TEST-FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">

<!-- 文件路徑 -->

<file>${TEST_FILE_PATH}</file>

<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">

<!-- 文件名稱 -->

<fileNamePattern>${TEST_FILE_PATH}/info.%d{yyyy-MM-dd}.log</fileNamePattern>

<!-- 文件最大保存歷史數量 -->

<MaxHistory>100</MaxHistory>

</rollingPolicy>

<layout class="ch.qos.logback.classic.PatternLayout">

<pattern>${PATTERN}</pattern>

</layout>

</appender>

<root level="info">

<appender-ref ref="TEST-FILE" />

</root>

</springProfile>

log4j2:去除logback的依賴包,添加log4j2的依賴包

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-web</artifactId>

<exclusions>

<exclusion>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-logging</artifactId>

</exclusion>

</exclusions>

</dependency>

<!-- 使用log4j2 -->

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-log4j2</artifactId>

</dependency>

logging.config標簽






Spring Boot 模版引擎

1.模版引擎的選擇:

FreeMarker

Thymeleaf

Velocity:Spring框架棄用

Groovy

Mustache

Jsp:pass 錯誤頁面不能覆蓋spring boot默認的錯誤頁面;內嵌的Jetty不支持JSPs Undertow不支持jsps jsp只能打包成war格式,不支持jar格式

實踐Freemaker:

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-freemarker</artifactId>

</dependency>

不能愉快的玩耍了?;success

實踐thymeleaf:

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-thymeleaf</artifactId>

</dependency>

小知識點:.ftl是freemaker獨有的後綴名;success

實踐jsp:

<dependency>

<groupId>org.apache.tomcat.embed</groupId>

<artifactId>tomcat-embed-jasper</artifactId>

<scope>provided</scope>

</dependency>

<dependency>

<groupId>javax.servlet</groupId>

<artifactId>jstl</artifactId>

</dependency>


spring.mvc.view.prefix: /WEB-INF/templates/

spring.mvc.view.suffix: .jsp

報錯啦:There was an unexpected error (type=Not Found, status=404)

public class ServletInitializer extends SpringBootServletInitializer{


@Override

protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {

return builder.sources(DemoApplication.class);

}

}

繼承SpringBootServletInitializer 類似web.xml

404 why?





Spring Boot錯誤處理

1.Spring Boot 將所有的錯誤默認映射到/error, 實現ErrorController

2.添加自定義的錯誤頁面.

resources/public/error/404.html 靜態頁面

templates/error/5xx.ftl 模版頁面

模版頁面優先於靜態頁面

3.使用註解@ControllerAdvice

@ExceptionHandler({ Exception.class })

@ResponseStatus(HttpStatus.OK)

public ModelAndView processException(Exception exception) {

logger.info("自定義異常處理-Exception");

ModelAndView m = new ModelAndView();

m.addObject("roncooException", exception.getMessage());

m.setViewName("error/500");

return m;

}

實驗失敗!!!最終成功,原因:沒有在同一個包下,如何解決???

知識閱讀:接口驗證簽名 https://www.cnblogs.com/codelir/p/5327462.html




web應用開發Servlets、filters、listeners 監聽器、過濾器和servlet三種實現方式

方法1:@bean註冊器註冊

方法2:Application實現ServletContextInitializer,重寫onStartup方法,ServletContextInitializer 接口直接註冊

添加servelt、filter、listener

方法3:註解的方法,在 SpringBootApplication 上使用@ServletComponentScan 註解後,直接通過@WebServlet、 @WebFilter、@WebListener 註解自動註冊

註意:SpringBoot掃描實例 @ServletComponentScan({"com.example"})





CORS支持:跨域

閱讀地址:https://www.cnblogs.com/fanshuyao/p/7168471.html

/*和/**的區別

@CrossOrigin參數:origins允許訪問的域列表、maxAge飛行前響應的緩存持續時間的最大年齡

ajax存在跨域問題,解決方案:


1.jsonp跨域原理:https://kb.cnblogs.com/page/139725/ 不能跨域訪問的你服務器但是可以跨域訪問的js腳本,通過回調來解決!!!

$.ajax({

type: "get",

async: false,

url: "http://flightQuery.com/jsonp/flightResult.aspx?code=CA1998",

dataType: "jsonp",

jsonp: "callback",//傳遞給請求處理程序或頁面的,用以獲得jsonp回調函數名的參數名(一般默認為:callback)

jsonpCallback:"flightHandler",//自定義的jsonp回調函數名稱,默認為jQuery自動生成的隨機函數名,也可以寫"?",jQuery會自動為你處理數據

success: function(json){

alert('您查詢到航班信息:票價: ' + json.price + ' 元,余票: ' + json.tickets + ' 張。');

},

error: function(){

alert('fail');

}

});


2.通過CrossOrigin解決

不使用註釋錯誤提示:Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:8081' is therefore not allowed access

全局 controller類 方法

@Configuration

public class CustomCorsConfiguration {

@Bean

public WebMvcConfigurer corsConfigurer() {

return new WebMvcConfigurerAdapter() {

@Override

public void addCorsMappings(CorsRegistry registry) {

// 限制了路徑和域名的訪問

//registry.addMapping("/api/**").allowedOrigins("http://localhost:8080");

}

};

}

}





文件上傳:

Spring Boot 默認使用 springMVC 包裝好的解析器進行上傳

出錯信息:The field roncooFile exceeds its maximum permitted size of 1048576 bytes.

配置信息:

spring.http.multipart.enabled=true #默認支持文件上傳.

spring.http.multipart.file-size-threshold=0 #支持文件寫入磁盤.

spring.http.multipart.location= # 上傳文件的臨時目錄

spring.http.multipart.max-file-size=1Mb # 最大支持文件大小

spring.http.multipart.max-request-size=10Mb # 最大支持請求大小





持久層

JdbcTemplate模版

依賴:

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-jdbc</artifactId> </dependency>

<dependency>

<groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope>

</dependency>

配置

spring.datasource.url=jdbc:mysql://localhost/spring_boot_demo?useUnicode=true&character

Encoding=utf-8

spring.datasource.username=root

spring.datasource.password=123456

spring.datasource.driver-class-name=com.mysql.jdbc.Driver


JPA java持久層api 使用hibernate

依賴

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-data-jpa</artifactId> </dependency>

<dependency>

<groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope>

</dependency>

JPA配置:

# JPA spring.jpa.hibernate.ddl-auto= update 每次啟動自動更新數據庫

#顯示 sql 語句 spring.jpa.show-sql=true

很好的封裝hibernate,三種查詢方式:內置方法 根據方法名稱自動查詢 @query註解 -->優先級問題

封裝分頁查詢:PageRequest


事物處理:ACID 7種傳播行為 隔離級別

@Transactional:

isolation隔離級別 noRollbackFor指定異常不回滾 noRollbackForClassName多個異常不回滾

propagation傳播屬性 readOnly只讀優化。 rollbackFor遇到指定異常回滾 rollbackForClassName遇到多個異常之一回滾

timeout事務的超時時常


h2嵌入式數據庫的使用,SpringBoot內置數據庫

依賴:

<dependency>

<groupId>com.h2database</groupId>

<artifactId>h2</artifactId>

<scope>runtime</scope>

</dependency>

配置:

spring.datasource.url=jdbc:h2:~/test;AUTO_SERVER=TRUE;DB_CLOSE _ON_EXIT=FALSE

spring.datasource.username=

spring.datasource.password=

pring.datasource.url=jdbc:h2:mem:test 內存模式

控制臺:http://localhost:8080/h2-console 頁面太醜


非關系型數據庫redis的使用

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-data-redis</artifactId>

</dependency>

配置文件:

spring.redis.host=localhost

spring.redis.port=6379

@Autowired

private StringRedisTemplate stringRedisTemplate;


非關系型數據庫mongoDB的使用

<dependency>

<groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId>

</dependency>

配置

spring.data.mongodb.uri=mongodb://localhost/test

spring.data.mongodb.port=27017

使用方式:模版mongoTemplate.updateMulti(query, update, RoncooUser.class); jpa:public interface RoncooUserLogMongoDao extends MongoRepository<RoncooUserLog, Integer>

嵌入式mongodb的使用:

<dependency>

<groupId>de.flapdoodle.embed</groupId>

<artifactId>de.flapdoodle.embed.mongo</artifactId>

</dependency>

Mybatis:

<dependency>

<groupId>org.mybatis.spring.boot</groupId>

<artifactId>mybatis-spring-boot-starter</artifactId>

<version>1.1.1</version>

</dependency>

基於註解的開發

基於xml的開發






緩存的使用

EnCache

依賴:

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-cache</artifactId> </dependency>

<dependency> <groupId>net.sf.ehcache</groupId> <artifactId>ehcache</artifactId>

</dependency>

配置:

<cache name="roncooCache"

eternal="false" 是否存在過期是阿金

maxEntriesLocalHeap="0" 最大緩存數

timeToIdleSeconds="200"></cache> 緩存超時

啟動註解:@EnableCaching Application入口上註入

註解解釋:@CacheCOnfig緩存配置

@Cacheable 應用到讀取方法上

@CachePut 更新和插入方法

@CacheEvict 清楚緩存使用於清除


Caching-Redis的使用:自定義緩存管理器的實現

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-redis</artifactId>

</dependency>

配置文件:spring.cache.type=redis

操作失敗了!!!!!!!





MQ的使用

ActiveMq的使用:

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-activemq</artifactId>

</dependency>

配置:spring.activemq.in-memory=true

開啟mq:@EnableJms

加入到隊列,隊列消耗

Rabbit Mq:安裝

依賴:

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-amqp</artifactId>

</dependency>






代理:

調用rest服務使用代理

添加依賴:

<dependency>

<groupId>org.apache.httpcomponents</groupId>

<artifactId>httpclient</artifactId>

</dependency>

代理的實現:

static class ProxyCustomizer implements RestTemplateCustomizer {

@Override

public void customize(RestTemplate restTemplate) {

String proxyHost = "43.255.104.179";

int proxyPort = 8080;


HttpHost proxy = new HttpHost(proxyHost, proxyPort);

HttpClient httpClient = HttpClientBuilder.create().setRoutePlanner(new DefaultProxyRoutePlanner(proxy) {

@Override

public HttpHost determineProxy(HttpHost target, HttpRequest request, HttpContext context)

throws HttpException {

System.out.println(target.getHostName());

return super.determineProxy(target, request, context);

}

}).build();

HttpComponentsClientHttpRequestFactory httpComponentsClientHttpRequestFactory = new HttpComponentsClientHttpRequestFactory(

httpClient);

httpComponentsClientHttpRequestFactory.setConnectTimeout(10000);

httpComponentsClientHttpRequestFactory.setReadTimeout(60000);

restTemplate.setRequestFactory(httpComponentsClientHttpRequestFactory);

}

}







發送模版短信:

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-mail</artifactId>

</dependency>

配置:

spring.mail.host=smtp.exmail.qq.com

[email protected]

spring.mail.password=Hepan10086

spring.mail.properties.mail.smtp.auth=true

核心代碼:

MimeMessage message = javaMailSender.createMimeMessage();

MimeMessageHelper helper = new MimeMessageHelper(message, true, "UTF-8");

InternetAddress from = new InternetAddress();

from.setAddress(javaMailSender.getUsername());

from.setPersonal("龍果學院", "UTF-8");

helper.setFrom(from);

helper.setTo(email);

helper.setSubject("測試郵件");

helper.setText(text, true);

javaMailSender.send(message);

return text;







swagger的使用:

依賴:

<dependency>

<groupId>io.springfox</groupId>

<artifactId>springfox-swagger-ui</artifactId>

<version>2.6.0</version>

</dependency>

<dependency>

<groupId>io.springfox</groupId>

<artifactId>springfox-swagger2</artifactId>

<version>2.6.0</version>

</dependency>

配置。。。。

註解說明:@APiIgnore @ApiOperation(value = "查找", notes = "根據用戶 ID 查找用戶")

@ApiImplicitParams({ @ApiImplicitParam(paramType = "query", dataType = "Long", name = "id", value = "信息id", required = true) }

@ApiResponses({ @ApiResponse(code = CommonStatus.OK, message = "操作成功"),

@ApiResponse(code = CommonStatus.EXCEPTION, message = "服務器內部異常"),

@ApiResponse(code = CommonStatus.FORBIDDEN, message = "權限不足") })

@ApiModel

@ApiModelProperty

用於生成api文檔






待深入學習:

Druid的使用

session集群

遠程調試:本地調用非本地的環境進行調試、兩個VM之間通過socket協議進行通信

生產部署如何使用腳本

SpringBoot是如何實現監控的。。。。。











































































我的SpringBoot實踐筆記