目录

一、 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

二、理解独立的spring应用

1.应用类型

  • 非web应用 : 主要用于服务提供、调度任务、消息处理
  • web应用 : 内嵌servlet或web容器,对外提供HTTP服务

2.@RestController

  • @RestController注解用作类的请求控制
  • @RequestMapping注解用作方法的请求映射
  • @ResponseBody注解用作方法的返回对象映射
  • 当有@RestController注解时,不需要添加@ResponseBody注解,可以认为@RestController= @Controller + @ResponseBody

3.官网创建springboot应用

https://start.spring.io/

4.基础的start依赖

  • spring-boot-starter-parent : srpingboot的父级依赖

    • 默认使用java8,也可手动添加指定版本
    1. <properties>
    2. <java.version>1.8</java.version>
    3. </properties>
    • 默认使用UTF-8编码,可手动添加配置修改
    1. <properties>
    2. <project.build.sourceEncoding>GBK</project.build.sourceEncoding>
    3. </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 jar 默认为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

三、理解固话的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之前添加依赖的东西
  1. <dependencyManagement>
  2. <dependencies>
  3. <dependency>
  4. <groupId>org.springframework.data</groupId>
  5. <artifactId>spring-data-releasetrain</artifactId>
  6. <version>Fowler-SR2</version>
  7. <scope>import</scope>
  8. <type>pom</type>
  9. </dependency>
  10. <dependency>
  11. <groupId>org.springframework.boot</groupId>
  12. <artifactId>spring-boot-dependencies</artifactId>
  13. <version>2.1.3.RELEASE</version>
  14. <type>pom</type>
  15. <scope>import</scope>
  16. </dependency>
  17. </dependencies>
  18. </dependencyManagement>

四、理解嵌入式Web容器

1. tomcat容器

spring boot 的web应用开发必须使用spring-boot-starter-web,其默认嵌入的servlet容器是Tomcat。

  1. <parent>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-parent</artifactId>
  4. <version>1.4.3.RELEASE</version>
  5. </parent>
  6. <dependencies>
  7. <!-- TOMCAT -->
  8. <dependency>
  9. <groupId>org.springframework.boot</groupId>
  10. <artifactId>spring-boot-starter-web</artifactId>
  11. </dependency>
  12. </dependencies>

嵌入的servlet容器版本在pom的以下父依赖项中定义,比如上面的version1.4.3引入了Tomcat版本8.5.6。

如果想改变tomcat版本,也可以更改pom.xml或application.properties文件中的属性进行修改

  • application.properties 文件修改:
  1. <properties>
  2. <tomcat.version>8.5.6</tomcat.version></properties>
  3. </properties>
  • pom.xml文件修改:
  1. <dependency>
  2. <groupId>org.apache.tomcat.embed</groupId>
  3. <artifactId>tomcat-embed-core</artifactId>
  4. <version>${tomcat.version}</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.apache.tomcat.embed</groupId>
  8. <artifactId>tomcat-embed-el</artifactId>
  9. <version>${tomcat.version}</version>
  10. </dependency>
  11. <dependency>
  12. <groupId>org.apache.tomcat.embed</groupId>
  13. <artifactId>tomcat-embed-websocket</artifactId>
  14. <version>${tomcat.version}</version>
  15. </dependency>

如果想使用其它servlet容器,则需要先移除tomcat容器

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-web</artifactId>
  4. <exclusions>
  5. <exclusion>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-tomcat</artifactId>
  8. </exclusion>
  9. </exclusions>
  10. </dependency>

2. jetty作为嵌入式servlet容器

将默认的嵌入式容器tomcat切换至jetty

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-web</artifactId>
  4. <exclusions>
  5. <exclusion>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-tomcat</artifactId>
  8. </exclusion>
  9. </exclusions>
  10. </dependency>
  11. <dependency>
  12. <groupId>org.springframework.boot</groupId>
  13. <artifactId>spring-boot-starter-jetty</artifactId>
  14. </dependency>

3. undertow作为嵌入式servlet容器

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-web</artifactId>
  4. <exclusions>
  5. <exclusion>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-tomcat</artifactId>
  8. </exclusion>
  9. </exclusions>
  10. </dependency>
  11. <dependency>
  12. <groupId>org.springframework.boot</groupId>
  13. <artifactId>spring-boot-starter-undertow</artifactId>
  14. </dependency>

五、理解自动装配

1. 激活自动化装配

官网提出激活自动化装配需要将注解@EnableAutoConfiguration 和 @SpringBootApplicaion,将两者选其一标注在@Configuration类上,@Configuration声明被标注为配置类

2. 理解@SpringBootApplicaion注解

@SpringBootApplicaion是一个聚合注解,类似的还有@RestController等

@SpringBootApplicaion被用于激活@EnableAutoConfiguration、@ComponentScan、@Configuration三个注解的特性,可以理解为前者等同包含于三个后者:

  • @EnableAutoConfiguration:负责激活SpringBoot自动装配机制
  • @ComponentScan:激活@Component的扫描
  • @Configuration:声明被标注为配置类
  1. 其中@SpringBootConfiguration属于@Configuration的派生注解
  2. @SpringBootConfiguration
  3. @EnableAutoConfiguration
  4. @ComponentScan
  5. public @interface SpringBootApplicaion{
  6. ...
  7. }

3. 派生注解@Component

  • @Component

    • @Configuration

      • @SpringBootConfiguration

        @Repository、@Service、@Controller均属于@Component派生注解

4. @SpringBootApplicaion属性别名

@AlisaFor注解能够将一个或多个注解的属性‘别名’到某个注解中

@SpringBootApplicaion(scanBasePackages = 'com.song.xxx')

六、理解Production-Ready

七、走向注解驱动编程

1. Spring核心注解场景分类

1.1 模式注解

  • @Repository:数据仓库模式
  • @Compoent:通用组件模式
  • @Service:服务模式
  • @Controller:Web控制器模式
  • @Configuration:配置类模式
  1. applicationContext.xml文件中加一行:<context:component-scan base-package="com.song.xxx"/>后
  2. @Component@Repository@Service@Controller都是将类实例化注入到spring管理器中,名字只是一
  3. 个分类,实质作用是一样的
  4. @Repository用于标注数据访问组件,即DAO组件
  5. @Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。
  6. @Service一般标注在业务接口实现类上,用于标注业务层组件
  7. @Controller用于标注控制层组件
  8. @Configuration标注在类上,相当于把该类作为springxml配置文件中的<beans>,
  9. 作用为:配置spring容器(应用上下文)
  10. 用于定义配置类,可替换xml配置文件,被注解的类内部包含有一个或多个被@Bean注解的方法,这些方法将会被
  11. AnnotationConfigApplicationContextAnnotationConfigWebApplicationContext
  12. 类进行扫描,并用于构建bean定义,初始化Spring容器

1.2 装配注解

  • @ImportResource:替换xml元素
  • @Import:限定@Autowired依赖注入的范围
  • @ComponentScan:springboot中的@ComponentScan相当于spring配置文件中的context:component-scan
  1. @ComponentScan:扫描知道package下标注Spring模式注解的类,如果不添加此注解,则其他的添加注解的类
  2. 不会被springboot扫描到,更不会装入spring容器中。

1.3 依赖注入注解

  • @Autowired:Bean的依赖注入
  • @Qualifer:细粒度的@Autowired依赖查找
  • @Resource(Java注解):Bean依赖注入
  1. :) @Autowired默认按类型装配
  2. :) @Autowired默认情况下必须要求依赖对象必须存在,如果要允许null值,可以设置
  3. 它的required属性为false,如:@Autowired(required=false)
  4. :) 如果接口有多个实现类,spring并不知道用哪个实现类,这个时候可以结合@Qualifer注解,
  5. 注意@Qualifier注解括号里面的必须是Person接口实现类的类名:@Qualifier("StudentService")
  6. :) @Resource后面没有任何内容,默认通过name属性去匹配bean,找不到再按type去匹配
  7. :) @Resource指定了name或者type则根据指定的类型去匹配bean:
  8. @Resource(name = "teacher") / @Resource(type = Student.class)
  9. :) @Resource属于java注解,@Autowired@Qualifer属于spring注解,建议使用@Resource注解,
  10. 以减少代码和Spring之间的耦合。

1.4 Bean定义注解

  • @Bean:替换xml中
  • @DependsOn:替换xml中
  • @Lazy:替换xml中
  • @Primary:替换xml中
  • @Role:替换xml中
  • @Lookup:替换xml中

1.5 其他

  • @AliasFor:别名注解属性,实现复用的目的
  • @Indexed:提示spring模式注解的扫描效率
  • @Profile:配置化条件装配
  • @Conditional:编程条件装配

2.spring注解编程模型

2.1 元注解

能申明在其他注解上的注解,例如:@Documented、@Component

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

八、spring注解驱动设计模式

读书笔记《SpringBoot编程思想》的更多相关文章

  1. csapp读书笔记-并发编程

    这是基础,理解不能有偏差 如果线程/进程的逻辑控制流在时间上重叠,那么就是并发的.我们可以将并发看成是一种os内核用来运行多个应用程序的实例,但是并发不仅在内核,在应用程序中的角色也很重要. 在应用级 ...

  2. CSAPP 读书笔记 - 2.31练习题

    根据等式(2-14) 假如w = 4 数值范围在-8 ~ 7之间 2^w = 16 x = 5, y = 4的情况下面 x + y = 9 >=2 ^(w-1)  属于第一种情况 sum = x ...

  3. CSAPP读书笔记--第八章 异常控制流

    第八章 异常控制流 2017-11-14 概述 控制转移序列叫做控制流.目前为止,我们学过两种改变控制流的方式: 1)跳转和分支: 2)调用和返回. 但是上面的方法只能控制程序本身,发生以下系统状态的 ...

  4. CSAPP 并发编程读书笔记

    CSAPP 并发编程笔记 并发和并行 并发:Concurrency,只要时间上重叠就算并发,可以是单处理器交替处理 并行:Parallel,属于并发的一种特殊情况(真子集),多核/多 CPU 同时处理 ...

  5. 读书笔记汇总 - SQL必知必会(第4版)

    本系列记录并分享学习SQL的过程,主要内容为SQL的基础概念及练习过程. 书目信息 中文名:<SQL必知必会(第4版)> 英文名:<Sams Teach Yourself SQL i ...

  6. 读书笔记--SQL必知必会18--视图

    读书笔记--SQL必知必会18--视图 18.1 视图 视图是虚拟的表,只包含使用时动态检索数据的查询. 也就是说作为视图,它不包含任何列和数据,包含的是一个查询. 18.1.1 为什么使用视图 重用 ...

  7. 《C#本质论》读书笔记(18)多线程处理

    .NET Framework 4.0 看(本质论第3版) .NET Framework 4.5 看(本质论第4版) .NET 4.0为多线程引入了两组新API:TPL(Task Parallel Li ...

  8. C#温故知新:《C#图解教程》读书笔记系列

    一.此书到底何方神圣? 本书是广受赞誉C#图解教程的最新版本.作者在本书中创造了一种全新的可视化叙述方式,以图文并茂的形式.朴实简洁的文字,并辅之以大量表格和代码示例,全面.直观地阐述了C#语言的各种 ...

  9. C#刨根究底:《你必须知道的.NET》读书笔记系列

    一.此书到底何方神圣? <你必须知道的.NET>来自于微软MVP—王涛(网名:AnyTao,博客园大牛之一,其博客地址为:http://anytao.cnblogs.com/)的最新技术心 ...

  10. Web高级征程:《大型网站技术架构》读书笔记系列

    一.此书到底何方神圣? <大型网站技术架构:核心原理与案例分析>通过梳理大型网站技术发展历程,剖析大型网站技术架构模式,深入讲述大型互联网架构设计的核心原理,并通过一组典型网站技术架构设计 ...

随机推荐

  1. Spring策略模式的实现

    场景: 有时候一个业务方法有多个实现类,需要根据特定的情形进行业务处理. 例如:商店支付,我们可以使用支付宝.微信扫描农行.xxx行的快捷支付(而不是微信支付.支付宝支付二维码)购买商品. 实现代码( ...

  2. JAVA 基础编程练习题6 【程序 6 求最大公约数及最小公倍数】

    6 [程序 6 求最大公约数及最小公倍数] 题目:输入两个正整数 m 和 n,求其最大公约数和最小公倍数. 程序分析:利用辗除法. package cskaoyan; public class csk ...

  3. TMainMenu 类[三] - 手动建立菜单(5) : 给菜单项添加事件

    unit Unit1; interface uses   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, For ...

  4. phpfpm开启pm.status_path配置,查看fpm状态参数

    php-fpm配置 pm.status_path = /phpfpm_status nginx配置 server {    root /data/www;    listen 80;    serve ...

  5. 【jQuery】attr()、prop()、css() 的区别(转载)

    .attr( ) 可以设置元素的属性(也就是给元素新增加一个原来并不存在的属性)也可以获取元素的本来就有的属性以及额外设置的属性.如果要获取的属性没有设置,那么获取到的结果是 undefined; . ...

  6. 【图像处理】H.264流媒体播放

    相信有不少人和我一样,希望实现H264格式视频的流媒体播放.但是对于一个新手来说,往往不知道从何入手.利用百度,GOOGLE等搜索资料真是沙里淘金.在琢磨了N周之后,才弄出来了点成果,其中费了很多无用 ...

  7. 内存块是一种数据结构,内核对象&句柄

    内核对象&句柄 目录 1 内核对象的概念 2 内核对象的使用计数 3 句柄 4 句柄表   项目工程代码中设计句柄的使用,一时不知句柄是何物,通过查阅自学之后,对句柄及其使用有一个初步的了解. ...

  8. day22 subprocess、configeparser、表格操作模块

    今日内容: 1.configparser模块的使用 2.subprocess模块的使用 3.表格处理模块 xlrd模块 xlwt模块 1.configparser模块 configparser模块是用 ...

  9. python类学习

    创建关于汽车的类 class Cars(): def __init__(self, brand, country): self.brand = brand self.country = country ...

  10. Second largest node in the BST

    Find the second largest node in the BST 分析: 如果root有右节点,很明显第二大的node有可能在右子树里.唯一不满足的条件就是右子树只有一个node. 这个 ...