Spring boot 論壇項目實戰_01


Spring boot 論壇項目實戰

項目Git: https://github.com/LJ117/Nowcoder_Prac_community

0. 技術架構

  • Spring Boot

  • Spring、SpringMVC、MyBatis

  • Redis、Kafka、Elasticsearch

  • Spring Security、Spring Actuator

 

1. 開發環境

  • 構建工具:Apache Maven

  • 集成開發環境:IDEA

  • 數據庫:MySQL、Redis

  • 應用服務器:Apache、Tomcat

  • 版本控制工具:Git

 

2. 搭建開發環境

Apache Maven

  • 可以幫助我們構建項目、管理項目中的 jar 包

  • Maven 倉庫:存放構件位置

    • 本地倉庫:默認是 ~/.m2/repostity

    • 遠程倉庫:中央倉庫【官網】、鏡像倉庫【第三方,優選】、私服倉庫【公司搭建的】

  • 示例:安裝、配置、常用命令

  • 官網:http://maven.apache.org

  • jar 包查詢網站:https://mvnrepository.com/

 

Spring Initializr

  • 創建 Spring Boot 項目的引導工具

  • 示例:創建 “牛客社區” 項目

  • 官網:https://start.spring.io

  • 創建完項目,解壓用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:默認參數
@Scope("singleton")
// 修改為多例,實際工作中使用較少
@Scope("prototype")
@Autowired // 自動根據類型注入
@Qualifier("...") //多個同類型 bean下,指定名稱注入對應名稱的bean
// 項目中, 通常直接注入給屬性。

 

Test文件的注釋

@RunWith(SpringRunner.class)
@SpringBootTest
@ContextConfiguration(classes = main實現類名.class)

 

4. Spring MVC 入門

HTTP

  • HyperText Transfer Protocol

  • 用於傳輸 HTML 等內容的 應用層 協議

  • 規定了瀏覽器和服務器之間如何通信,以及通信時的數據格式

參考官網:https://www.ietf.org

https://developer.mozilla.org/zh-CN

 

Spring MVC

  • 三層架構

    • 表現層、業務層、數據訪問層

  • MVC【解決表現層的問題】

    • Model:模型層

    • View:視圖層

    • Controller:控制層

  • 核心組件

    • 前端控制器:DispatcherServlet

 

Thymeleaf

  • 模版引擎【模版文件 + Model = 模版引擎 ---》HTML】

    • 動態生成的HTML

  • Thymeleaf

    • 倡導自然模版,即以HTML文件為模版

  • 常用語法

    • 標准表達式、判斷與循環、模版的布局

  • 官網:https://www.thymeleaf.org

 

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

http://www.mybatis.org/spring

配置文件

# 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 需要先定義遠程倉庫位置【】

    即遠程倉庫所在的 URL


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM