0. 技術架構
-
Spring Boot
-
Spring、SpringMVC、MyBatis
-
Redis、Kafka、Elasticsearch
-
Spring Security、Spring Actuator
1. 開發環境
-
-
集成開發環境:IDEA
-
數據庫:MySQL、Redis
-
應用服務器:Apache、Tomcat
-
版本控制工具:Git
2. 搭建開發環境
Apache Maven
-
可以幫助我們構建項目、管理項目中的 jar 包
-
Maven 倉庫:存放構件位置
-
本地倉庫:默認是 ~/.m2/repostity
-
遠程倉庫:中央倉庫【官網】、鏡像倉庫【第三方,優選】、私服倉庫【公司搭建的】
-
-
示例:安裝、配置、常用命令
-
jar 包查詢網站:https://mvnrepository.com/
Spring Initializr
-
創建 Spring Boot 項目的引導工具
-
示例:創建 “牛客社區” 項目
-
創建完項目,解壓用IDEA打開,記得把 pom.xml 文件加載到 Maven 里面
-
<!-- 參考 pom.xml 文件 --> <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.16.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.nowcoder</groupId> <artifactId>community</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>war</packaging> <name>community</name> <description>nowcoder community</description> <properties> <java.version>11</java.version> </properties> <!-- 重點在依賴文件的配置 --> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
Spring Boot
-
Spring Boot 核心作用
-
起步依賴、自動配置、端點監控
-
-
示例:
-
一個簡單的處理客戶端請求案例
-
3. Spring 入門
Spring 全家桶
Spring Framework
Spring Boot
Spring Cloud:微服務
Spring Cloud Data Flow:做數據集成
Spring Framework
-
Spring Core
-
IoC、AOP【管理對象】
-
-
Spring Data Access【訪問數據庫的功能,管理事務】
-
Transactions、Spring Mybatis
-
-
Web Servlet【Web開發】
-
Spring MVC
-
-
Integration
-
Email、Scheduling、AMQP、Security
-
Spring 常用注解 | 注解對象 |
---|---|
@Controller | Controller對象,控制組件的注解,處理瀏覽器請求 |
@Service | Service對象,業務組件的注解,處理當前業務 |
@Repository | Repository對象,數據庫處理的注解,訪問數據庫 |
@Component | 全部都可以用 |
Spring IoC
減少 Bean 對象之間的耦合,不用專門實例化對象
-
Inversion of Control
-
控制反轉,是一種面向對象編程的設計思想。
-
-
Dependency Injection
-
依賴注入,是 IoC 思想的實現方式。
-
-
IoC Container
-
IoC容器,是實現依賴注入的關鍵,本質上是一個工廠。
-
被 Spring 管理的 Bean , 默認是 單例——單一實例
如果要修改為多例,需要添加注解:
// 默認單例, single:默認參數
Test文件的注釋
@RunWith(SpringRunner.class)
@SpringBootTest
@ContextConfiguration(classes = main實現類名.class)
4. Spring MVC 入門
HTTP
HyperText Transfer Protocol
用於傳輸 HTML 等內容的 應用層 協議
規定了瀏覽器和服務器之間如何通信,以及通信時的數據格式
參考官網:https://www.ietf.org
Spring MVC
-
三層架構
-
表現層、業務層、數據訪問層
-
-
MVC【解決表現層的問題】
-
Model:模型層
-
View:視圖層
-
Controller:控制層
-
-
核心組件
-
前端控制器:DispatcherServlet
-
Thymeleaf
-
模版引擎【模版文件 + Model = 模版引擎 ---》HTML】
-
動態生成的HTML
-
-
Thymeleaf
-
倡導自然模版,即以HTML文件為模版
-
-
常用語法
-
標准表達式、判斷與循環、模版的布局
-
5. Mybatis 入門
-
核心組件
-
SqlSessionFactory:用於創建SqlSession的工廠類
-
SqlSession:Mybatis的核心組件,用於向數據庫執行SQL
-
主配置文件:XML配置文件,可以對MyBatis的底層行為做出詳細的配置
-
【上面三個被 Spring boot 整合了】
-
Mapper接口:就是DAO接口,在Mybatis中習慣性的稱之為Mapper
-
Mapper映射器:用於編寫SQL,並將SQL和實體類映射的組件,采用XML、注解均可實現。
-
-
示例:
-
使用 Mybatis 對用戶表進行 CRUD 操作。
-
參考網站:http://www.mybatis.org/mybatis-3
配置文件
# application.properties 配置
# ServerProperties # 設置服務器端口 server.port=8080 # 項目訪問路徑設置 server.servlet.context-path=/community # ThymeleafProperties #開發時: 關閉 Thymeleaf 的緩存,保證實時刷新;系統上線后 保持 緩存的開啟。 spring.thymeleaf.cache=false # Spring boot 配置 mysql 和 mybatis # DataSourceProperties spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.url=jdbc:mysql://localhost:3306/community?characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai spring.datasource.username=root spring.datasource.password=1234 # 連接池配置,spring boot 中性能最好的 HikariDataSource spring.datasource.type=com.zaxxer.hikari.HikariDataSource spring.datasource.hikari.maximum-pool-size=15 # 保留最小連接數 spring.datasource.hikari.minimum-idle=5 spring.datasource.hikari.idle-timeout=30000 # MybatisProperties mybatis.mapper-locations=classpath:mapper/*.xml mybatis.type-aliases-package=com.nowcoder.community.entity # 啟用自動生成組件 mybatis.configuration.use-generated-keys=true # 自動匹配 下划線和駝峰,忽略大小寫,數據源和實體類匹配 mybatis.configuration.map-underscore-to-camel-case=true # logger # 把這個包的級別設置為 debug logging.level.com.nowcoder.community=debug # 指定日志文件存放位置 logging.file=d:/work/data/nowcoder/community.log
<!-- Pom.xml -->
<!-- 添加 mysql 數據庫依賴 和 mybatis-springboot 依賴 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.0.1</version> </dependency>
6. 開發社區首頁
開發流程
1次清楚的執行過程
分布式先
開發社區首頁, 顯示前10個帖子
開發分頁組件, 分頁顯示所有的帖子
<!-- 設置表頭, 聲明所用模板 --> <html lang="en" xmlns:th="http://www.thymeleaf.org"> <!-- 非絕對路徑的文件, 加上標頭, 表示 用 thymeleaf 去查找相應文件 用 "@{....}" ,不會產生歧義 --> th:href="@{/css/global.css}" th:src="@{/js/global.js}" th:utext ----> 會自動轉義 文本內的轉義字符 <!-- th: 內置工具 #工具名.方法名(...) --> th:text="${#dates.format(map.post.createTime,'yyyy-MM-dd HH:mm:ss')}" <!-- 頁面跳轉: th:href="@{ 路徑(傳遞的參數)}" th:href="@{${page.path}(current=1,limit=5)}" LIKE: th:href="@{/index?current=1&limit=5}" --> th:href="@{${page.path}(current=1,limit=5)}" <!-- th: 工具 #numbers: 返回一個由連續數字組成的數組 th:each="${#numbers.sequence(起始數, 終止數)}" --> <!-- 所有變量: ${page.XXX} 都是在: 調用 page.getXXX() 方法 --> <!-- 動態判斷: th:class="|靜態變量 ${動態變量}|" // 當前是第一頁, 就不可用 th:class="|page-item ${page.current==1?'disabled':''}|" -->
7. 項目調試技巧
響應狀態碼的含義
常見狀態碼:
200: 一切正常
302: 重定向方面
404: 訪問出錯
500: 服務端有問題
服務端斷點調試技巧
IDEA 的 Debug 快捷鍵 [ 打斷點后, Debug 運行 ]:
F8: 向下執行一行
F7: 進入當前行所調用方法內部
F9: 向下執行到下一個斷點, 如果沒有斷點 直接到程序末尾
IDEA 批量管理斷點:
批量刪除斷點:
點這個 “ — ” 實現刪除,或着 “delete”鍵
客戶端斷點調試技巧
瀏覽器:Sources中:
F10: 向下執行一步
F11: 進入當前行所調用方法內部
F8: 向下執行到下一個斷點, 如果沒有斷點 直接到程序末尾
設置日志級別,並將日志輸出到不同的終端
【建議先看日志分析,再斷點調試】
Spring boot 內置默認日志:logback
參考網站: https://logback.qos.ch
五個級別:trace < debug < info < warn < error, 向上兼容的
開發時:常用級別:
error:捕捉到異常
info:線程池,定時任務,特殊任務
debug:暫時調試程序
保存日志到文件:
配置文件(application.properties)中聲明:
# 指定日志文件存放位置[籠統的]
logging.file=d:/work/data/nowcoder/community.log取名字:logback-spring.xml 放在 resources 根目錄下,spring boot 會自動發現並加載 日志配置
logback-spring.xml
根據項目需求,照着下面的注釋改就行
<?xml version="1.0" encoding="UTF-8"?> <configuration> <!-- 聲明項目名 --> <contextName>community</contextName> <!-- 日志存放目錄 --> <property name="LOG_PATH" value="D:/work/data"/> <!-- 追加日志目錄名 --> <property name="APPDIR" value="community"/> <!-- 根據日志類型不同 分別設置 --> <!-- error file --> <appender name="FILE_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${LOG_PATH}/${APPDIR}/log_error.log</file> <!-- 日志滾動策略, 設置單一日志大小【超過大小看 append 方式?true【追加】:false【覆蓋】】, 時間【超過時間刪除】 --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${LOG_PATH}/${APPDIR}/error/log-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <maxFileSize>5MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> <maxHistory>30</maxHistory> </rollingPolicy> <append>true</append> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <!-- 控制台輸出日志格式 %d:date 日期 %level:日志級別 %thread:線程 %msg:詳細消息 --> <pattern>%d %level [%thread] %logger{10} [%file:%line] %msg%n</pattern> <charset>utf-8</charset> </encoder> <!-- 過濾器:指定過濾類型 --> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>error</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender> <!-- warn file --> <appender name="FILE_WARN" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${LOG_PATH}/${APPDIR}/log_warn.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${LOG_PATH}/${APPDIR}/warn/log-warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <maxFileSize>5MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> <maxHistory>30</maxHistory> </rollingPolicy> <append>true</append> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <pattern>%d %level [%thread] %logger{10} [%file:%line] %msg%n</pattern> <charset>utf-8</charset> </encoder> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>warn</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender> <!-- info file --> <appender name="FILE_INFO" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${LOG_PATH}/${APPDIR}/log_info.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${LOG_PATH}/${APPDIR}/info/log-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <maxFileSize>5MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> <maxHistory>30</maxHistory> </rollingPolicy> <append>true</append> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <pattern>%d %level [%thread] %logger{10} [%file:%line] %msg%n</pattern> <charset>utf-8</charset> </encoder> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>info</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender> <!-- console --> <!-- 把日志打印到控制台 --> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d %level [%thread] %logger{10} [%file:%line] %msg%n</pattern> <charset>utf-8</charset> </encoder> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>debug</level> </filter> </appender> <logger name="com.nowcoder.community" level="debug"/> <root level="info"> <appender-ref ref="FILE_ERROR"/> <appender-ref ref="FILE_WARN"/> <appender-ref ref="FILE_INFO"/> <appender-ref ref="STDOUT"/> </root> </configuration>
8.版本控制
認識Git
Git簡介
Git的安裝於配置
Git常用命令
將代碼提交至本地倉庫
將代碼上傳至遠程倉庫
IDEA集成Git
在IEDA中配置並使用Git
參考網站: https://git-scm.com
-
IDEA中為當前項目配置Git
-
如上圖所示,在 Git 的安裝目錄下,選擇 bin 目錄下的 git.exe
配置好本地 Git 環境后,要在先創建本地倉庫,再將本地倉庫推送到遠程倉庫中。
-
-
如上圖所示, 選中當前項目的根目錄, 然后 選擇工具欄中的 VCS [ 版本控制系統 ]
選擇當前項目的實際位置
Git 初始化完成
對當前項目進行提交操作
一般就選擇上面的幾個文件進行提交,.mvn 的自帶文件不要勾選
寫本次提交的描述,然后點擊提交按鈕,完成對代碼的提交
在遠程 Git 倉庫建立對應倉庫項目【建議與本地倉庫同名】,這里我選用的是碼雲。
建立完成遠程倉庫后,回到IDEA
【Push:從本地提交到遠程倉庫,Pull:從遠程倉庫拉到本地】
初次點擊 Push 需要先定義遠程倉庫位置【】