天天看點

SpringBoot基礎實戰一點通

本文來自于千鋒教育在阿裡雲開發者社群學習中心上線課程《SpringBoot實戰教程》,主講人楊紅豔, 點選檢視視訊内容

本課程包含了SpringBoot的基本使用及SpringBoot如何和各項技術整合,快速學習到 SpringBoot 整合其他技術,熟練使用 SpringBoot。

随着動态語言的流行(Ruby,Groovy,Scala,Node.js),Java的開發顯得格外的笨重:繁多的配置,低下的開發效率,複雜的部署流程以及第三方技術內建難度大。在上述環境下,SpringBoot應運而生。它使用“習慣由于配置”的理念讓項目快速運作起來。使用SpringBoot很容易建立一個獨立運作(運作jar,内嵌Servlet容器)準生産級别的基于Spring架構的項目,使用SpringBoot可以不用或隻需要很少的Spring配置。

第一節:SpringBoot 入門程式

SpringBoot核心特點:

  1. 可以以jar包的形式獨立運作,運作一個SpringBoot項目隻需通過 java -jar xx.jar來運作
  2. 内嵌Servlet容器,SpringBoot可以選擇Tomcat,Jetty或者Undertow,這樣我們無須以war包形式部署項目
  3. 簡化Maven配置,SpringBoot提供了一系列的starter pom 來簡化Maven的依賴加載
  4. SpringBoot會根據在類路徑中的jar包,類,為jar包中的類自動配置Bean,這樣就極大的減少了我們要使用的配置
  5. ......
點選學習更多>>

第二節:超全!預設全局配置檔案都在這啦!

SpringBoot項目使用一個全局的配置檔案application.properties或者是application.yml,在resources目錄下或者類路徑下的/config下,一般我們放到resources下。

預設的配置很多,使用的時候查找即可:

# BANNER
banner.charset=UTF-8 # Banner file encoding.
banner.location=classpath:banner.txt # Banner file location.
banner.image.location=classpath:banner.gif # Banner image file location (jpg/png can also be used).
banner.image.width= # Width of the banner image in chars (default 76)
banner.image.height= # Height of the banner image in chars (default based on image height)
banner.image.margin= # Left hand image margin in chars (default 2)
banner.image.invert= # If images should be inverted for dark terminal themes (default false)

......           

第三節:3個經典場景配置

1、SpringBoot為我們提供了企業級開發絕大多數場景的starter pom,隻要使用了應用場景所需的starter pom,相關的技術配置将會消除,就可以得到SpringBoot為我們提供的自動配置的Bean。

2、在SpringBoot中如何擷取自定義的值?

使用

@Value(“${book.author}”)

擷取自定義屬性的值。

3、SpringBoot還提供了基于類型安全的配置方式,通過@ConfigurationProperties将properties中的屬性和一個Bean的屬性關聯,進而實作類型安全的配置。

第四節:自動配置的原理詳解

既然SpringBoot可以在根據可依賴的架包進行自動配置,說明在項目啟動的時候進行了配置。

SpringBoot自動配置的原理就是讀取了檔案中的類,根據屬性使用預設值。

第五節:不再做重複工作!建立父工程搞定

在建立每個SpringBoot前,都需要父級依賴。顯然很麻煩,那麼能不能不做父級依賴?我們自己建立父級依賴,這個父級工程對jar包進行管理,那麼子工程就不用每一個進行父級依賴了。

<dependencyManagement>
      <dependencies>
          <dependency>
                  <groupId>org.springframework.boot</groupId>
                  <artifactId>spring-boot-dependencies</artifactId>
                  <version>1.5.6.RELEASE</version>
                  <type>pom</type>
                  <scope>import</scope>
          </dependency>
      </dependencies>
  </dependencyManagement>
  
  <build>
          <plugins>
              <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
      </plugins>
  </build>           

子工程如何實作父級依賴呢?

第六節:玩轉SpringBootApplication注解

應該把啟動方法放在一個單獨的類當中,這個類就稱為啟動類。

@EnableAutoConfiguration
@ComponentScan("com.qianfeng.controller")
public class SpringController {
        public static void main(String[] args) {
        SpringApplication.run(SpringController.class, args);
    } 
}           

另外還有一個注解,該注解是一個組合注解,可以替代啟動類的兩個注解。

@SpringBootApplication    //組合注解           

第七節:一文了解SpringBoot的日志管理

SprongBoot使用的預設日志架構是Logback,并用INFO級别輸出到控制台。

日志輸出内容元素具體如下:

  • 時間日期:精确到毫秒
  • 日志級别:ERROR, WARN, INFO, DEBUG or TRACE
  • 程序ID
  • 分隔符:— 辨別實際日志的開始
  • 線程名:方括号括起來(可能會截斷控制台輸出)
  • Logger名:通常使用源代碼的類名
  • 日志内容

第八節:2種loger的使用

第一種:帶有loger的配置,不指定級别,不指定appender

< logger name="com.qianfeng.controller" />           

第二種:帶有多個loger的配置,指定級别,指定appender

<logger name="com.qianfeng.controller.SpringController" level="WARN" additivity="false">  
            <appender-ref ref="console"/> 
 </logger>           

第九節:不同環境下如何輸出不同日志

根據不同環境(prod:生産環境,test:測試環境,dev:開發環境)來定義不同的日志輸出,在 logback-spring.xml中使用 springProfile 節點來定義,方法如下:

<!-- 測試環境+開發環境. 多個使用逗号隔開-->
<springProfile name="test,dev">
    <logger name="com.qianfeng.controller" level="info" />
</springProfile>

<!-- 生産環境-->
<springProfile name="prod">
    <logger name="com.qianfeng.controller" level="ERROR" />
</springProfile>           

在application.properties檔案中指明使用哪一種:

spring.profiles.active=prod           

第十節:還在手動操作?試試配置為開發模式

大家會發現每次對代碼進行了修改之後,都需要手動的進行啟動,這樣很麻煩。是以我們可以把工程設定為開發模式,就不需要這樣麻煩了。設定開發模式之後,需要加入兩個依賴:

<!-- 加入以下依賴,代碼做了修改,不用重新運作  -->
       <dependency>
             <groupId>org.springframework</groupId>
             <artifactId>springloaded</artifactId>
      </dependency>
      <dependency>
              <groupId>org.springframework.boot</groupId>
              <artifactId>spring-boot-devtools</artifactId> </dependency>           

第十一節:詳解通路靜态資源

在SpringBoot中加載靜态資源和在普通的web應用中不太一樣。預設情況下,Spring Boot從classpath的/static,/public或/META-INF/resources檔案夾或從ServletContext根目錄提供靜态内容。

如果想自己配置,我們需要在全局配置當中,覆寫預設配置:

其對應屬性為:

spring.resources.static-locations=classpath:/static/           

第十二節:如何解析Json資料

SpringBoot預設配置的是Jackson。

自定義使用FastJson解析Json資料,添加依賴:

<!-- fastjson的依賴 -->
      <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.15</version>
 </dependency>           

配置FastJson有兩種方式:

第一種:讓啟動類繼承WebMvcConfigurerAdapter

第十三節:定義全局異常處理器

SpringBoot使用AOP思想進行全局異常處理

異常通常作為一個通知介入的,是以說我們需要用到注解。

@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(Exception.class) 
    @ResponseBody
    public Map<String,Object> allExceptionHandler(  
            Exception exception) throws Exception  
    {  
        Map<String,Object> map = new HashMap<String,Object>();
        map.put("errorCode", 500);
        map.put("errorMsg", exception.toString());
        return map;
    }  
}           

第十四節:異步調用實作多線程處理任務

在項目中,當通路其它接口較慢或者做耗時任務時,不想程式一直卡在耗時任務上,想程式能夠并行執行,我們可以使用多線程來并行的處理任務,SpringBoot提供了異步處理方式@Async。

第十五節:官方推薦!SpringBoot這樣整合JSP

Spring Boot官方不推薦使用jsp,因為jsp相對于一些模闆引擎,性能都比較低,官方推薦使用thymeleaf。

springboot整合jsp,必須是war工程。

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
      </dependency>
      
       <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-jasper</artifactId>
   </dependency>           

第十六節:詳解SpringBoot整合Freemarker

springboot不建議使用jsp,使用模闆引擎,比如themleaf,velocity,freemarker整合freemarker 。

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-freemarker</artifactId>
      </dependency>           

第十七節:SpringBoot整合Thymeleaf

SpringBoot官方是不推薦jsp頁面的,推薦的是模闆引擎。Thymeleaf是其中一種模闆引擎。SpringBoot如何整合Thymeleaf:

<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-thymeleaf</artifactId>
  </dependency>           

第十八節:SpringBoot整合QuartZ

QuartZ是一個任務排程架構,我們以實作每隔一秒列印一下時間為例:

//任務
@Component
public class MyJob {
    
    @Scheduled(fixedRate=1000)
    public void run()
    {
System.out.println(new SimpleDateFormat("yyyy-MM-dd  HH:mm:ss").format(new Date()));
    }
}           

第十九節:SpringBoot中如何使用JdbcTemplate?

我們通過新增資料庫表中的使用者來實作SpringBoot中如何使用JdbcTemplate。

<!-- springboot整合jdbctemplate -->
       <dependency>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-starter-jdbc</artifactId>
       </dependency>
<!-- mysql的依賴 -->       
       <dependency>
           <groupId>mysql</groupId>
           <artifactId>mysql-connector-java</artifactId>
       </dependency>           

第二十節:SpringBoot中如何使用xml方式整合Mybatis?

通過實作對資料庫表中添加使用者以及分頁查找使用者來實作SpringBoot中如何使用xml方式整合Mybatis。

添加mybatis、MySQL、druid資料庫連接配接池、分頁依賴:

<!-- springboot整合mybatis -->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.3.1</version>
        </dependency>
<!-- MySQL -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
<!-- alibaba的druid資料庫連接配接池 -->
         <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.0</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.0.11</version>
        </dependency>
<!-- 分頁插件 -->
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper-spring-boot-starter</artifactId>
            <version>1.1.2</version>
        </dependency>
<!-- @Param注解在該包中 -->
        <dependency>
            <groupId>org.apache.ibatis</groupId>
            <artifactId>ibatis-core</artifactId>
            <version>3.0</version>
        </dependency>           

第二十一節:SpringBoot中如何使用注解方式整合Mybatis?

通過實作查找使用者和添加使用者,來解析SpringBoot中如何使用注解方式去整合Mybatis。

@Service
public class UsersServiceImpl implements UsersService {

    @Autowired
    private UsersMapper usersMapper;

    @Override
    public Users findUser(String name) {
        return usersMapper.findUserByName(name);
    }

    @Override
    public void saveUser(Users user) {
        usersMapper.addUser(user.getName(), user.getPassword());
    }

}           

第二十二節:如何區分多資料源?

在項目中,我們通常會進行資料庫拆分或是引入其他資料庫,進而我們需要配置多個資料源。

如何區分多個資料源:

  • 通過包來區分:com.db1.mapper、com.db2.mapper
  • 使用注解來區分:需要用到大量的注解,一般不推薦使用。

第二十三節:SpringBoot的事務管理

在SpringBoot中可以使用xml配置檔案的方式或者注解的方式來聲明事務。

在Spring Boot中推薦使用@Transactional注解來聲明事務。

當我們使用了spring-boot-starter-jdbc或spring-boot-starter-data-jpa依賴的時候,SpringBoot會自動預設分别注入DataSourceTransactionManager或JpaTransactionManager。

第二十四節:SpringBoot如何整合JPA-Hibernate?

通過實作資料庫表中添加、查找、删除使用者的功能來詳解SpringBoot如何整合JPA-Hibernate。

<!-- springboot整合jpa -->
      <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-data-jpa</artifactId>
      </dependency>
      <dependency>
           <groupId>mysql</groupId>
           <artifactId>mysql-connector-java</artifactId>
       </dependency>           

第二十五節:如何在SpringBoot中實作郵件的發送?

擷取發件人的郵箱:

@Component
public class EmailConfig {

    @Value("${spring.mail.username}")
    private String emailFrom;
    
    public String getEmailFrom() {

        return emailFrom;
    }
    public void setEmailFrom(String emailFrom) {
        this.emailFrom = emailFrom;
    }
}           

第二十六節:如何實作發送帶附件的郵件?

發送帶附件的郵件:

void sendAttachmentMail(String sendTo, String title, String content, File file);           

第二十七節:如何發送基于模闆的郵件?

模闆:使用一些相同的模闆,但裡面的資料是可以變化的。

添加模闆引擎依賴:

<dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-freemarker</artifactId>
     </dependency>           

第二十八節:SpringBoot實作檔案上傳

實作上傳頁面:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8"></meta>
<title>檔案上傳</title>
</head>
<body>
    <h2>檔案上傳</h2>
    <hr/>
    <form method = "POST" enctype="multipart/form-data" action="/upload">
    <p>
        檔案<input type="file" name="file"/>
    </p>
    <p>
        <input type="submit" value="上傳"/>
    </p>
    </form>
</body>
</html>           

第二十九節:SpringBoot實作批量檔案上傳

批量上傳需要利用for循環實作:

//建立檔案在伺服器端的存放路徑
            String dir=request.getServletContext().getRealPath("/upload");
            File fileDir = new File(dir);
            if(!fileDir.exists())
                fileDir.mkdirs();
            //生成檔案在伺服器端存放的名字
            for(int i = 0;i<file.length;i++) {
                String fileSuffix=file[i].getOriginalFilename().substring(file[i].getOriginalFilename().lastIndexOf("."));
                String fileName=UUID.randomUUID().toString()+fileSuffix;
                File files = new File(fileDir+"/"+fileName);
                //上傳
                file[i].transferTO(files);
            }           

第三十節:什麼是Neo4J?

Neo4j是一個高性能的,NOSQL圖形資料庫,它是一個嵌入式的、基于磁盤的、具備完全的事務特性的Java持久化引擎,但是它将結構化資料存儲在網絡(從數學角度叫做圖)上而不是表中。Neo4j也可以被看作是一個高性能的圖引擎,該引擎具有成熟資料庫的所有特性。

SpringBoot基礎實戰一點通

第三十一節:SpringBoot如何整合Neo4j?

添加依賴:

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

在全局配置檔案application.properties中添加:

spring.data.neo4j.uri=http://localhost:7474
spring.data.neo4j.username=neo4j
spring.data.neo4j.password=123           

第三十二節:SpringBoot如何整合Redis(單機版)?

在程式之中Redis緩存如何使用:

首先開啟緩存,在啟動類中添加

@EnableCaching   //開啟緩存           

第三十三節:SpringBoot如何整合Redis叢集?

添加叢集配置:

spring.redis.cluster.nodes=192.168.25.128:7550, 192.168.25.128:7551, 192.168.25.128:7552, 192.168.25.128:7553, 192.168.25.128:7554, 192.168.25.128:7555           

第三十四節:SpringBoot如何內建MongoDB?

MongoDB是一個基于分布式檔案存儲的資料庫。由C++語言編寫。旨在為WEB應用提供可擴充的高性能資料存儲解決方案。MongoDB是一個介于

關系資料庫

和非關系資料庫之間的産品,是非關系資料庫當中功能最豐富,最像關系資料庫的。他支援的資料結構非常松散,是類似

json

的bson格式,是以可以存儲比較複雜的資料類型。Mongo最大的特點是他支援的查詢語言非常強大,其文法有點類似于面向對象的查詢語言,幾乎可以實作類似關系資料庫單表查詢的絕大部分功能,而且還支援對資料建立索引。

第三十五節:SpringBoot怎樣整合ActiveMQ?

ActiveMQ是符合JMS規範的消息管理者。

<!-- 整合ActiveMQ的依賴 -->
       <dependency>  
            <groupId>org.springframework.boot</groupId>  
            <artifactId>spring-boot-starter-activemq</artifactId>  
       </dependency>            

第三十六節:SpringBoot怎樣整合RabbitMQ?

通過SpringBoot內建RabbitMQ實作消息的發送,接收。

<dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-amqp</artifactId>
      </dependency>           

第三十七節:Kafka概述及安裝

Apache Kafka是一個分布式釋出 - 訂閱消息系統和一個強大的隊列,可以處理大量的資料,并使您能夠将消息從一個端點傳遞到另一個端點。 Kafka适合離線和線上消息消費。 Kafka消息保留在磁盤上,并在群集内複制以防止資料丢失。 Kafka建構在ZooKeeper同步服務之上。 它與Apache Storm和Spark非常好地內建,用于實時流式資料分析。

第三十八節:SpringBoot如何實作Solr?

<dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-solr</artifactId>
 </dependency>
           

全局配置:

spring.data.solr.host=http://192.168.25.129:8080/solr           

第三十九節:ElasticSearch概述及安裝

ElasticSearch是一個基于Lucene的搜尋伺服器。它提供了一個分布式多使用者能力的全文搜尋引擎,基于RESTful web接口。Elasticsearch是用Java開發的,并作為Apache許可條款下的開放源碼釋出,是目前流行的企業級搜尋引擎。用于

雲計算

中,能夠達到實時搜尋,穩定,可靠,快速,安裝使用友善。

第四十節:SpringBoot如何整合ElasticSearch?

添加相關依賴:

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

application.yml全局配置:

spring:
           data:
           elasticsearch:
           cluster-nodes: 192.168.25.129:9300
           local: false
           repositories:
              enabled: true           

第四十一節:SpringBoot如何整合WebSocket?

WebSocket 連接配接允許用戶端和伺服器之間進行全雙工通信,以便任一方都可以通過建立的連接配接将資料推送到另一端。WebSocket 隻需要建立一次連接配接,就可以一直保持連接配接狀态。這相比于輪詢方式的不停建立連接配接顯然效率要大大提高。

第四十二節:SpringBoot如何整合AngularJS?

SpringBoot整合AngularJS實作資料庫表頁面的增删改查。

<dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-thymeleaf</artifactId>
    </dependency>
    <dependency>
        <groupId>net.sourceforge.nekohtml</groupId>
        <artifactId>nekohtml</artifactId>
        <version>1.9.22</version>
</dependency>
<dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-jdbc</artifactId>
    </dependency>
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
    </dependency>
    <dependency>
      <groupId>org.apache.commons</groupId>
      <artifactId>commons-lang3</artifactId>
      <version>3.3.2</version>
</dependency>           

檢視課程視訊教程