以項目驅動學習,以實踐檢驗真知
如今使用Java後端開發使用的技術棧基本上比較統一:Spring + SpringMVC + Mybatis,即你們常說的SSM。雖然如今流行的作法是使用SpringBoot來快速搭建、配置好SSM項目,但仍是有必要知道如何不用SpringBoot來組合好這三者,由於SpringBoot也只是幫助咱們作好了許多配置,並非說捨棄掉了那些配置,因此知道原生的SSM如何整合能夠更好幫助咱們理解SSM也能更好的理解SpringBoot帶來的好處!並且有的老項目就是沒有用SpringBoot,若是你對原生SSM整合與配置一無所知那維護老項目起來會極其難受。css
SSM整合相比起SpringBoot的快速搭建天然是繁瑣無比,可是不用擔憂,本文會一步一步演示如何整合這三者,而且會講解每一個配置的含義。老套路,文章最後還放上了思惟導圖和項目Github地址,clone下來便可直接運行,若是想本身作一個完整的SSM項目,直接用這套架子進行開發也是徹底沒問題的!html
這裏使用idea進行項目建立,maven來管理依賴包。首先咱們在idea上新建一個project,選擇Maven,而後選擇web應用:前端
點擊下一步後輸入GroupId和ArtifactId後點擊下一步直到完成。項目建立完畢後整個項目結構以下:java
如今還先彆着急配置SSM,咱們先得配置一下這個idea下的web項目才行。你們也能夠看到,項目創建起來後這個web.xml文件裏寫的是2.3版本,這個版本太老了,不行。mysql
咱們按住catl + shift + alt + S
打開idea的Project Structure,而後點擊左側的Modules,再點擊Web,而後點擊右邊的刪除按鈕,肯定,最後點擊APPLY先將這個默認的刪除:git
此時咱們會發現默認的web.xml文件已經被刪除了。而後咱們再點擊右側的添加按鈕,點擊web.xml進行添加:github
這裏咱們選擇3.1版本,選擇好後點擊彈出框的OK,再點擊下方的OK便可建立完畢:web
建立完畢後就會發現咱們的web.xml內容已經變成了3.1了。spring
此時還先不要着急去配置SSM,咱們如今項目連個基本的結構都沒有呢,你核心代碼寫在哪,你測試在哪些,你資源放哪這些都是咱們要去創建的。sql
首先,咱們在src路徑下新建test文件夾,而後在src/main路徑下新建java和resources文件夾。創建好文件夾後,右鍵點擊文件夾,而後拖到下方,選擇Mark Directory as,而後選擇對應的目錄結構。
java文件夾對應SourcesRoot,表明標記爲項目源代碼路徑,代碼就寫在這裏。
resources文件夾對應ResourcesRoot,表明標記爲資源路徑,全部資源好比配置文件就放在這。
test文件夾對應TestSourcesRoot,表明標記爲測試路徑,測試代碼都會放在這裏。
文件夾指定好後,咱們就要在java文件夾下建立咱們的代碼包結構。包的話就分爲最基本的controller、service、mapper、entity。包建好後目錄結構以下:
基本的項目結構整理好後,接下來咱們就要開始對SSM進行整合了。首先確定要作的就是在pom.xml文件中導入必備的依賴包,直接複製粘貼就行了,各個地方都作了註釋說明:
<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> <!--統一配置jar包的版本--> <mysql.version>5.1.48</mysql.version> <spring.version>5.2.0.RELEASE</spring.version> <jackson.version>2.10.0</jackson.version> </properties> <dependencies> <!--單元測試,注意哦要4.12版本以上。scope爲test表明只用來作測試,並不隨版本打包發佈此依賴包--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <!--日誌咱們使用logback--> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.3</version> </dependency> <!-- 簡化Getter、Setter的工具lombok。非必需 注意:使用lombok還要在idea上下載對應的插件--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.10</version> <scope>provided</scope> </dependency> <!-- ***************數據庫相關配置****************** --> <!-- mysql驅動依賴包,鏈接mysql必備--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>${mysql.version}</version> </dependency> <!-- 數據源依賴包,能大幅提高性和便利性。這裏咱們用阿里的德魯伊數據源--> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.12</version> </dependency> <!-- Mybatis必備依賴包 --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.6</version> </dependency> <!-- ***************web相關配置****************** --> <!--配置JavaEE依賴包,包含了Servlet、Validation等功能--> <dependency> <groupId>javax</groupId> <artifactId>javaee-api</artifactId> <version>8.0</version> <scope>provided</scope> </dependency> <!-- JSTL依賴包,若是用將jstl標籤用在jsp中就要此依賴包。非必需的 --> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> <!-- jackson依賴包,用來將java對象轉換JSON格式,SpringMVC要用的 --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>${jackson.version}</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>${jackson.version}</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>${jackson.version}</version> </dependency> <!-- ***************Spring相關配置****************** --> <!--配置Spring JDBC容器所需的jar包--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>${spring.version}</version> </dependency> <!--配置Spring IOC容器所需的jar包--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> <!--Spring mvc--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring.version}</version> </dependency> <!-- AspectJ所需的jar包--> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.9.4</version> </dependency> <!--Spring測試依賴--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>${spring.version}</version> <scope>test</scope> </dependency> <!--配置Spring整合mybatis的jar包--> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.3.2</version> </dependency> </dependencies>
在進行整合以前咱們來準備一下數據庫,好接下來進行一個完整的演示。我這裏用的是MySQL 5.7.25,我們創建一個名爲ssm_demo的數據庫,執行語句新建一張user表並插入兩條測試數據:
CREATE TABLE `user` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主鍵id', `name` varchar(255) COLLATE utf8mb4_bin NOT NULL COMMENT '帳戶名', `password` varchar(255) COLLATE utf8mb4_bin NOT NULL COMMENT '帳戶密碼', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin; INSERT INTO `user` VALUES (1, 'admin', '123456'); INSERT INTO `user` VALUES (2, 'rudecrab', '654321');
而後咱們在entity包下創建和數據庫表對應的實體類User:
@Data // lombok註解,自動生成Getter、Setter、toString方法 public class User implements Serializable { private Long id; private String name; private String password; }
而後咱們在resources文件夾下創建database.properties
文件來配置數據庫鏈接的相關信息(這裏根據本身的數據庫信息配置哦),等下整合Mybatis要用到的:
jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://127.0.0.1:3306/ssm_demo?characterEncoding=utf-8&useSSL=false&autoReconnect=true&rewriteBatchedStatements=true&serverTimezone=UTC jdbc.username=root jdbc.password=root
真實項目中通常是要觀察日誌輸出的,咱們再配置一下日誌。在resources目錄下新建logback.xml
文件。注意啊,在尾部須要指定某個包,這個根據本身項目結構包名來設置:
<?xml version="1.0" encoding="utf-8" ?> <configuration> <!--定義日誌文件輸出地址--> <property name="LOG_ERROR_HOME" value="error"/> <property name="LOG_INFO_HOME" value="info"/> <!--經過appender標籤指定日誌的收集策略,咱們會定義三個收集策略:控制檯輸出、普通訊息文件輸出、錯誤信息文件輸出--> <!--name屬性指定appender命名--> <!--class屬性指定輸出策略,一般有兩種,控制檯輸出和文件輸出,文件輸出就是將日誌進行一個持久化--> <!--控制檯輸出--> <appender name="CONSOLE_LOG" class="ch.qos.logback.core.ConsoleAppender"> <!--使用該標籤下的標籤指定日誌輸出格式--> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <!-- %p:輸出優先級,即DEBUG,INFO,WARN,ERROR,FATAL %r:輸出自應用啓動到輸出該日誌訊息所耗費的毫秒數 %t:輸出產生該日誌事件的線程名 %f:輸出日誌訊息所屬的類別的類別名 %c:輸出日誌訊息所屬的類的全名 %d:輸出日誌時間點的日期或時間,指定格式的方式: %d{yyyy-MM-dd HH:mm:ss} %l:輸出日誌事件的發生位置,即輸出日誌訊息的語句在他所在類別的第幾行。 %m:輸出代碼中指定的訊息,如log(message)中的message %n:輸出一個換行符號 --> <pattern>%red(%d{yyyy-MM-dd HH:mm:ss.SSS}) %yellow([%-5p]) %highlight([%t]) %boldMagenta([%C]) %green([%L]) %m%n</pattern> </encoder> </appender> <!--普通訊息文件輸出--> <appender name="INFO_LOG" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!--經過使用該標籤指定過濾策略--> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <!--標籤指定過濾的類型--> <level>ERROR</level> <onMatch>DENY</onMatch> <onMismatch>ACCEPT</onMismatch> </filter> <encoder> <!--標籤指定日誌輸出格式--> <pattern>[%d{yyyy-MM-dd' 'HH:mm:ss.SSS}] [%C] [%t] [%L] [%-5p] %m%n</pattern> </encoder> <!--標籤指定收集策略,好比基於時間進行收集--> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!--標籤指定生成日誌保存地址,經過這樣配置已經實現了分類分天收集日誌的目標了--> <fileNamePattern>${LOG_INFO_HOME}//%d.log</fileNamePattern> <maxHistory>30</maxHistory> </rollingPolicy> </appender> <!--錯誤信息文件輸出--> <appender name="ERROR_LOG" class="ch.qos.logback.core.rolling.RollingFileAppender"> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>ERROR</level> </filter> <encoder> <pattern>[%d{yyyy-MM-dd' 'HH:mm:ss.SSS}] [%C] [%t] [%L] [%-5p] %m%n</pattern> </encoder> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${LOG_ERROR_HOME}//%d.log</fileNamePattern> <maxHistory>30</maxHistory> </rollingPolicy> </appender> <!--用來設置某一個包或具體的某一個類的日誌打印級別--> <logger name="com.rudecrab.ssm.mapper" level="DEBUG"/> <!--必填標籤,用來指定最基礎的日誌輸出級別--> <root level="info"> <!--添加append--> <appender-ref ref="CONSOLE_LOG"/> <appender-ref ref="INFO_LOG"/> <appender-ref ref="ERROR_LOG"/> </root> </configuration>
如今咱們開始終於能夠進行Spring和Mybatis的整合了。咱們先在resources文件夾下新建mybatis-config.xml
文件來對Mybatis進行全局配置,這裏我習慣配置這些,根據本身的需求來就好:
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <!--配置全局設置--> <settings> <!--啓用日誌,並指定日誌實現方式--> <setting name="logImpl" value="SLF4J"/> <!--啓用主鍵生成策略--> <setting name="useGeneratedKeys" value="true"/> <!--配置啓用下劃線轉駝峯的映射--> <setting name="mapUnderscoreToCamelCase" value="true"/> <!--啓用二級緩存--> <setting name="cacheEnabled" value="true"/> </settings> </configuration>
再來新建spring-mybatis.xml
文件,這個文件就是用來作整合的!注意啊,其中不少設置須要指定某個包,這個根據本身項目結構包名來設置,註釋寫的很清楚了:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"> <!--屬性文件的讀取,這裏讀取剛纔咱們的數據庫鏈接相關配置--> <context:property-placeholder location="classpath:database.properties" file-encoding="UTF-8"/> <!--配置自動掃描,若是不配置這個那麼就沒法使用@Autowired加載bean--> <context:component-scan base-package="com.rudecrab.ssm" use-default-filters="true"> <!--這裏要排除掉Controller的註解,Controller專門交給MVC去掃描,這樣會就不會衝突--> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/> </context:component-scan> <!--配置數據源--> <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"> <!--配置JDBC基礎屬性,即數據庫鏈接相關配置--> <property name="driverClassName" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> <!--配置鏈接池的設置,這個是要根據真實項目狀況來配置的,隨着項目的發展會不斷修改--> <property name="initialSize" value="10"/> <property name="maxActive" value="100"/> </bean> <!-- 重點來了,這裏配置是MyBatis的SqlSessionFactory,就是這一塊配置將Spring和Mybatis整合到了一塊兒 若是不配置這裏,你的mapper接口只能經過SqlSession來獲取,十分麻煩。這裏配置好後就能夠經過Spring IoC來獲取mapper接口了 --> <bean class="org.mybatis.spring.SqlSessionFactoryBean" id="sqlSessionFactory"> <!--指定數據源--> <property name="dataSource" ref="dataSource"/> <!--加載mybatis全局設置,classpath即咱們的資源路徑resources--> <property name="configLocation" value="classpath:mybatis-config.xml"/> <!--配置Mybatis的映射xml文件路徑--> <property name="mapperLocations" value="classpath:mapper/*.xml"/> </bean> <!--指定Mybatis的mapper接口掃描包--> <!--注意!!!若是用的是tk.mybatis自動生成的mapper接口,必定要將org.mybatis.改爲tk.mybatis--> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <!--指定剛纔咱們配置好的sqlSessionFactory--> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/> <!--指定mapper接口掃描包--> <property name="basePackage" value="com.rudecrab.ssm.mapper"/> </bean> <!--配置事務管理器,若是不配置這個,不啓動事務掃描的話,那麼發生了異常也不會觸發回滾--> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <!--還得指定數據源--> <property name="dataSource" ref="dataSource"/> </bean> <!--啓動事務的掃描--> <tx:annotation-driven/> </beans>
至此Spring和Myabtis已經整合配置好了,口說無憑,我們仍是得測試一下看下效果。在測試以前咱們得先創建好mapper接口文件、myabtis映射xml文件、service接口和實現類:
UserMapper接口專門用來聲明各類數據庫操做方法,@Repository
註解將其定義爲Spring所管理的Bean:
@Repository public interface UserMapper { /** * 從數據庫中查詢出全部的User對象 * @return User對象集合 */ List<User> selectAll(); }
UserMapper.xml映射文件用來寫方法對應要執行的SQL語句:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" > <mapper namespace="com.rudecrab.ssm.mapper.UserMapper"> <!--開啓緩存--> <cache/> <!--從數據庫中查詢出全部的User對象--> <select id="selectAll" resultType="com.rudecrab.ssm.entity.User"> select * from user </select> </mapper>
UserService接口用來聲明關於User的業務方法:
public interface UserService { /** * 從數據庫中查詢出全部的User對象 * @return User對象集合 */ List<User> getAll(); }
UserServiceImpl實體類用來實現關於User的業務邏輯,@Service
註解和@Repository
註解用處同樣,將其定義爲Bean。@Transactional
註解爲聲明式事務,若是該業務層的方法有異常拋出則會觸發事務回滾。而後使用@Autowired
註解在私有屬性上,自動加載Bean,無需咱們手動建立UserMapper了:
@Service @Transactional(rollbackFor = Exception.class) public class UserServiceImpl implements UserService { @Autowired private UserMapper userMapper; @Override public List<User> getAll() { return userMapper.selectAll(); } }
相關類和文件都建好了,如今咱們在test文件夾下創建一個測試類UserServiceTest,必定要在測試類上加上那兩個註解,不然沒法正常使用Spring相關功能:
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = {"classpath:spring-mybatis.xml"}) public class UserServiceTest { @Autowired private UserService userService; @Test public void getAll() { System.out.println(userService.getAll()); System.out.println(userService.getAll()); } }
運行後咱們就能夠看到運行結果了:
能夠看到結果正常顯示,而且日誌也打印在了控制檯上。這表明咱們已經完成了Spring和Mybatis的整合!
咱們接下來配置SpringMVC,在resources目錄下新建spring-mvc.xml
文件進行配置。注意啊,其中設置須要指定某個包,這個根據本身項目結構包名來設置:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd"> <!--配置視圖解析器,這樣控制器裏就直接返回文件名就行了--> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!--前綴--> <property name="prefix" value="/WEB-INF/views/"/> <!--後綴--> <property name="suffix" value=".jsp"/> </bean> <!--配置靜態資源過濾,否則靜態資源好比css是訪問不到的--> <mvc:default-servlet-handler/> <!--配置掃描的包--> <context:component-scan base-package="com.rudecrab.ssm.controller" use-default-filters="false"> <!--只掃描controller,實際開發中最好用這種方式來寫,這邊MVC就只掃描controller,就不會IOC那邊衝突,不然事務會被覆蓋,IOC那邊就要排除這個controller--> <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/> </context:component-scan> <!--啓用MVC的註解--> <mvc:annotation-driven/> </beans>
最後一個配置天然就是在web.xml裏進行整合了,主要配置三點:
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1"> <!--1.配置Spring IOC容器的建立,若是不配置這個,Mybatis就在web應用裏沒法使用--> <context-param> <param-name>contextConfigLocation</param-name> <!--spring和mybatis整合配置文件路徑--> <param-value>classpath:spring-mybatis.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!--2.配置SpringMVC的前端控制器--> <servlet> <servlet-name>SpringMVC</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <!--SpringMVC整合配置文件路徑--> <param-value>classpath:spring-mvc.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>SpringMVC</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <!--3.配置字符編碼過濾器--> <filter> <filter-name>encodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app>
以上,全部的配置都弄好了,那麼接下來我們就跑一個最簡單的web項目來看看是否整合成功!還記得咱們在在spring-mvc.xml
文件中配置的視圖解析前綴嘛,咱們在/WEB-INF/views/文件夾下新建一個index.jsp文件:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>首頁-RudeCrab</title> </head> <body> <%--循環提取userList中的元素--%> <c:forEach var="user" items="${userList}"> <ul> <li>${user}</li> </ul> </c:forEach> </body> </html>
接下來再在controller包下新建一個控制器類來定義訪問接口:
@Controller @RequestMapping(value = "user") public class UserController { @Autowired private UserService userService; @GetMapping("/getList") public String getList(Model model) { // 將數據存到model對象裏,這樣jsp就能訪問數據 model.addAttribute("userList", userService.getAll()); // 返回jsp文件名 return "index"; } @GetMapping("/getJson") @ResponseBody public List<User> getList() { // 若是想作先後端分離的話能夠加上@ResponseBody註解,直接返回數據對象,這樣前端就能夠經過獲取json來渲染數據了 return userService.getAll(); } }
而後咱們啓動Tomcat,在瀏覽器中訪問接口:
能夠看到咱們成功的訪問到了數據,至此SSM徹底整合完畢!
總體的整合配置思路已經畫好思惟導圖了,其中每一個節點上都寫好了比較詳細的備註,能夠下載文件後觀看。文件放在末位的github地址中:
https://github.com/RudeCrab/r...
上面包含了整個項目,clone下來用idea打開便可運行!同時也放上了思惟導圖文件。若是對你有幫助麻煩點一個star,項目中還有其餘的【項目實踐】,未來我也會不斷更新更多的項目實踐!