讀書筆記《SpringBoot編程思想》

[toc]java

1、 springboot總覽

1.springboot特性

  • 獨立的spring應用
    springboot能夠以jar包的形式獨立運行,使用 java -jar xxx.jar 就能夠成功運行項目,
  • 內嵌servlet容器
    使咱們在應用項目的主程序中運行main函數便可快速運行。
  • 內嵌web容器
    直接嵌入tomcat、jetty等web容器(不須要部署war文件)
  • 提供固話的starter依賴
    簡化maven配置,使常見的依賴彙集在一塊兒,造成單條依賴
  • 組件自動裝配
    Spring Boot會根據咱們項目中類路徑的jar包/類,爲jar包的類進行自動配置Bean,大大簡化了配置
  • 應用監控
    springboot提供了基於HTTP、ssh、telnet對運行時的項目進行監控。
  • 不須要配置xml
    能夠徹底不使用xml配置,只須要自動配置和Java config

2.準備運行環境

  • JDK1.8
  • MAVEN

2、理解獨立的spring應用

1.應用類型

  • 非web應用 : 主要用於服務提供、調度任務、消息處理
  • web應用 : 內嵌servlet或web容器,對外提供HTTP服務

2.@RestController

  • @RestController註解用做類的請求控制
  • @RequestMapping註解用做方法的請求映射
  • @ResponseBody註解用做方法的返回對象映射
  • 當有@RestController註解時,不須要添加@ResponseBody註解,能夠認爲@RestController= @Controller + @ResponseBody

3.官網建立springboot應用

https://start.spring.io/web

4.基礎的start依賴

  • spring-boot-starter-parent : srpingboot的父級依賴
    • 默認使用java8,也可手動添加指定版本
    <properties>
        <java.version>1.8</java.version>
    </properties>
    • 默認使用UTF-8編碼,可手動添加配置修改
    <properties>
        <project.build.sourceEncoding>GBK</project.build.sourceEncoding>
    </properties>
    • 省略version信息,可不指定version
    • 識別插件配置
      好比 exec plugin, surefire
      可以識別 application.properties 和 application.yml 類型的文件

5.springboot打包

  • 構建jar文件前提,須要在spring-boot-maven-plugin到pom.xml中
  • Spring Boot Maven plugin可以將Spring Boot應用打包爲可執行的jar或war文件當運行「mvn package」進行打包時,會打包成一個能夠直接運行的 JAR 文件,使用「java -jar」命令就能夠直接運行
  • 能夠在POM中,指定生成 的是Jar仍是War <packaging>jar</packaging> 默認爲jar
  • spring-boot-maven-plugin的命令
    • spring-boot:repackage,默認goal。在mvn package以後,再次打包可執行的jar/war
    • spring-boot:run,運行Spring Boot應用,與java -jar xxx.jar命令無異

6.springboot的jar文件

  • springboot的fat jar文件除了包含傳統的java jar中的資源外,還包含依賴的jar文件,他是一個獨立歸檔的應用文件
  • jdk默認支持文件(file)、http、jar等協議,故jdk內建了對應協議的實現,這些實現類均放在sun.net.www.protocol包下,而且類名必須爲Handler,
    • FILE:sun.net.www.protocol.file.Handler
    • JAR:sun.net.www.protocol.jar.Handler
    • HTTP:sun.net.www.protocol.http.Handler
    • HTTPS:sun.net.www.protocol.https.Handler
    • FTP:sun.net.www.protocol.ftp.Handler
  • 以上這些類均爲java.net.URLStreamHandler的實現類,若是須要擴展springboot的啓動jar文件,則須要把org.springframework.boot.loader.jar.Handler添加到java.protocol.handler.pkgs中,並覆蓋原sun.net.www.protocol.jar.Handler

3、理解固話的Maven依賴

1.spring-boot-starter-parent與spring-boot-dependencies

  • spring-boot-starter-parent繼承於spring-boot-dependencies,也就是說spring-boot-starter-parent的管理jar包的能力源於spring-boot-dependencies
  • 若是不想使用spring-boot-starter-parent來實現dependencyManagement(依賴管理),而是經過本身手動指定jar包的版本號,可經過如下配置spring-boot-dependencies來爲每一個jar包設置依賴
  • 若是經過spring-boot-dependencies來管理依賴,那麼不能使用property的形式覆蓋原始的依賴項,要達到一樣的效果,須要在dependencyManagement裏面的spring-boot-dependencies以前添加依賴的東西
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-releasetrain</artifactId>
            <version>Fowler-SR2</version>
            <scope>import</scope>
            <type>pom</type>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>2.1.3.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

4、理解嵌入式Web容器

1. tomcat容器

spring boot 的web應用開發必須使用spring-boot-starter-web,其默認嵌入的servlet容器是Tomcat。spring

<parent>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-parent</artifactId>
   <version>1.4.3.RELEASE</version>
</parent>
 
<dependencies>
   <!-- TOMCAT -->
   <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
   </dependency>
</dependencies>

嵌入的servlet容器版本在pom的如下父依賴項中定義,好比上面的version1.4.3引入了Tomcat版本8.5.6。 若是想改變tomcat版本,也能夠更改pom.xml或application.properties文件中的屬性進行修改apache

  • application.properties 文件修改:
<properties>
   <tomcat.version>8.5.6</tomcat.version></properties>
</properties>
  • pom.xml文件修改:
<dependency>
   <groupId>org.apache.tomcat.embed</groupId>
   <artifactId>tomcat-embed-core</artifactId>
   <version>${tomcat.version}</version>
</dependency>
<dependency>
   <groupId>org.apache.tomcat.embed</groupId>
   <artifactId>tomcat-embed-el</artifactId>
   <version>${tomcat.version}</version>
</dependency>
<dependency>
   <groupId>org.apache.tomcat.embed</groupId>
   <artifactId>tomcat-embed-websocket</artifactId>
   <version>${tomcat.version}</version>
</dependency>

若是想使用其它servlet容器,則須要先移除tomcat容器編程

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
        </exclusion>
    </exclusions>
</dependency>

2. jetty做爲嵌入式servlet容器

將默認的嵌入式容器tomcat切換至jetty設計模式

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jetty</artifactId>
</dependency>

3. undertow做爲嵌入式servlet容器

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-undertow</artifactId>
</dependency>

5、理解自動裝配

1. 激活自動化裝配

官網提出激活自動化裝配須要將註解@EnableAutoConfiguration 和 @SpringBootApplicaion,將二者選其一標註在@Configuration類上,@Configuration聲明被標註爲配置類tomcat

2. 理解@SpringBootApplicaion註解

@SpringBootApplicaion是一個聚合註解,相似的還有@RestController等 @SpringBootApplicaion被用於激活@EnableAutoConfiguration、@ComponentScan、@Configuration三個註解的特性,能夠理解爲前者等同包含於三個後者:springboot

  • @EnableAutoConfiguration:負責激活SpringBoot自動裝配機制
  • @ComponentScan:激活@Component的掃描
  • @Configuration:聲明被標註爲配置類
其中@SpringBootConfiguration屬於@Configuration的派生註解
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan
public @interface SpringBootApplicaion{
    ...
}

3. 派生註解@Component

  • @Component
    • @Configuration
      • @SpringBootConfiguration @Repository、@Service、@Controller均屬於@Component派生註解

4. @SpringBootApplicaion屬性別名

@AlisaFor註解可以將一個或多個註解的屬性‘別名’到某個註解中 @SpringBootApplicaion(scanBasePackages = 'com.song.xxx')websocket

6、理解Production-Ready

7、走向註解驅動編程

1. Spring核心註解場景分類

1.1 模式註解

  • @Repository:數據倉庫模式
  • @Compoent:通用組件模式
  • @Service:服務模式
  • @Controller:Web控制器模式
  • @Configuration:配置類模式
在applicationContext.xml文件中加一行:<context:component-scan base-package="com.song.xxx"/>後
@Component、@Repository、@Service、@Controller都是將類實例化注入到spring管理器中,名字只是一
個分類,實質做用是同樣的

@Repository用於標註數據訪問組件,即DAO組件
@Component泛指組件,當組件很差歸類的時候,咱們可使用這個註解進行標註。
@Service通常標註在業務接口實現類上,用於標註業務層組件
@Controller用於標註控制層組件

@Configuration標註在類上,至關於把該類做爲spring的xml配置文件中的<beans>,
做用爲:配置spring容器(應用上下文)
用於定義配置類,可替換xml配置文件,被註解的類內部包含有一個或多個被@Bean註解的方法,這些方法將會被
AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext
類進行掃描,並用於構建bean定義,初始化Spring容器

1.2 裝配註解

  • @ImportResource:替換xml元素<import>
  • @Import:限定@Autowired依賴注入的範圍
  • @ComponentScan:springboot中的@ComponentScan至關於spring配置文件中的context:component-scan
@ComponentScan:掃描知道package下標註Spring模式註解的類,若是不添加此註解,則其餘的添加註解的類
不會被springboot掃描到,更不會裝入spring容器中。

1.3 依賴注入註解

  • @Autowired:Bean的依賴注入
  • @Qualifer:細粒度的@Autowired依賴查找
  • @Resource(Java註解):Bean依賴注入
:) @Autowired默認按類型裝配
:) @Autowired默認狀況下必需要求依賴對象必須存在,若是要容許null值,能夠設置
   它的required屬性爲false,如:@Autowired(required=false)
:) 若是接口有多個實現類,spring並不知道用哪一個實現類,這個時候能夠結合@Qualifer註解,
   注意@Qualifier註解括號裏面的必須是Person接口實現類的類名:@Qualifier("StudentService")

:) @Resource後面沒有任何內容,默認經過name屬性去匹配bean,找不到再按type去匹配
:) @Resource指定了name或者type則根據指定的類型去匹配bean:
   @Resource(name = "teacher") / @Resource(type = Student.class)
:) @Resource屬於java註解,@Autowired和@Qualifer屬於spring註解,建議使用@Resource註解,
   以減小代碼和Spring之間的耦合。

1.4 Bean定義註解

  • @Bean:替換xml中<bean>
  • @DependsOn:替換xml中<bean depends-on="...">
  • @Lazy:替換xml中<bean lazy-init="true | false">
  • @Primary:替換xml中<bean primary="true | false">
  • @Role:替換xml中<bean role="...">
  • @Lookup:替換xml中<bean lookup-method="...">

1.5 其餘

  • @AliasFor:別名註解屬性,實現複用的目的
  • @Indexed:提示spring模式註解的掃描效率
  • @Profile:配置化條件裝配
  • @Conditional:編程條件裝配

2.spring註解編程模型

2.1 元註解

能申明在其餘註解上的註解,例如:@Documented、@Componentapp

2.2 spring模式註解

@Component做爲一種由spring容器託管的通用模式組件,任何被@Component標註的組件均爲組件掃描的候選對象,相似地,凡是被@Component元標註的註解,如@Service所標註的任何組件,也被視做組件的候選對象。

2.3 spring組合註解

例如:
@TransacrionlService組合了@Transacrion和@Service這兩個註解 @SpringBootApplication既是模式註解,也是組合註解

2.4 spring註解屬性別名和覆蓋

較低層註解能覆蓋其元註解的同名屬性 @Component |-@Service |-@TransacrionlService 其中@TransacrionlService能夠覆蓋@Service @Service能夠覆蓋@Component

8、spring註解驅動設計模式

相關文章
相關標籤/搜索