SpringBoot基础学习

SpringBoot基础

回顾

JavaSE:OOP

MySQL:持久化

html+css+js+jquey+框架

JavaWeb:原始MVC框架

SSM:框架,简化了开发流程,配置复杂

war:Tomcat运行

SpringBoot:内嵌tomcat,微服务架构

微服务

微服务是一种风格、要求我们在开发一个应用时,这个应用必须构建成一系列小服务的组合,可以通过http的方式进行互通

单体应用架构

指我们将一个应用中的所有应用服务器都封装在一个应用中。

无论ERP、CRM、或其他系统,都把数据库访问、web访问,等等各个功能放到一个war包内。

  • 好处是,易于开发和测试:也十分方便部署;当需要扩展时,只需要将war复制多份,然后放到多个服务器上,再做个负载均衡即可。
  • 缺点是,修改一个小地方,都需要停掉整个服务,重新打包、部署这个应用war包。

微服务架构

all in one的架构方式,我们把所有的功能单元放在一个应用里面。然后我们把整个应用部署到服务器上。如果负载能力不行,我们将整个应用进行水平复制,进行扩展,然后在负载均衡。

所谓微服务架构,就是打破之前all in one的架构方式,把每个功能元素独立出来。把独立出来的功能元素的动态组合,需要的功能元素才去拿来组合,需要多一些时可以整合多个功能元素。所以微服务架构是对功能元素进行复制,而没有对整个应用进行复制。

这样做的好处是:

  1. 节省了调用资源。
  2. 每个功能元素的服务都是一个可替换的、可独立升级的软件代码。

构建微服务

一个大型系统的微服务架构,就像一个复杂交织的神经网络,每一个神经元就是一个功能元素,它们各自完成自己的功能,然后通过http相互请求调用。比如一个电商系统,查缓存、连数据库、浏览页面、结账、支付等服务都是一个个独立的功能服务,都被微化了,它们作为一个个微服务共同构建了一个庞大的系统。如果修改其中的一个功能,只需要更新升级其中一个功能服务单元即可。

但是这种庞大的系统架构给部署和运维带来很大的难度。于是,spring为我们带来了构建大型分布式微服务的全套、全程产品:

  • 构建一个个功能独立的微服务应用单元,可以使用springboot,可以帮我们快速构建一个应用;
  • 大型分布式网络服务的调用,这部分由spring cloud来完成,实现分布式;
  • 在分布式中间,进行流式数据计算、批处理,我们有spring cloud data flow。
  • spring为我们想清楚了整个从开始构建应用到大型分布式应用全流程方案。

SpringBoot简介

Spring是如何简化Java开发的:

  1. 基于POJO的轻量级和最小侵入性编程
  2. 通过IOC,依赖注入(DI)和面向接口是实现松耦合
  3. 基于切面(AOP)和惯例进行声明式编程
  4. 通过切面和模板减少样式代码

Spring优点:

Spring是Java企业版的轻量级代替品。无需开发重量级的EnterpriseJavaBean(EJB),Spring为企业级Java开发提供了一种相对简单的方法,通过依赖注入和面向切面编程,用简单的Java对象实现了EJB功能。

Spring缺点:

虽然Spring的组件代码轻量级的,但它的配置却是重量级的。还包括依赖管理,也是十分复杂的,各种依赖的兼容问题。

SpringBoot概述

SpringBoot基于Spring开发,SpringBoot本身不提供Spring框架的核心特性以及扩展功能,只是用于快速、敏捷地开发新一代基于Spring框架的应用程序。

约定大于配置

SpringBoot优点

  • 开箱即用
  • 没有冗余代码一级XML配置要求
  • 内嵌式容器简化Web项目
  • SpringBoot不是对Spring功能上的增强,而是提供了一种快速使用Spring的方式

SpringBoot的核心功能

  • 起步依赖
  • 自动配置

第一个SpringBoot程序

  • jdk
  • maven
  • springboot
  • idea

官方:提供了快速网站

@SpringBootApplication
public class HelloworldApplication {

    public static void main(String[] args) {
        SpringApplication.run(HelloworldApplication.class, args);
    }

}

SpringBoot的热部署

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

勾选Build project automatically,然后 shift + ctrl + alt + / 选择 registy

原理初探

自动配置

pom.xml

  • spring-boot-starter-parent:       核心依赖在父工程中
  • <!-- web功能起步依赖-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
  • 引入一些springboot依赖时,不需要指定版本,因为有版本仓库

启动器

  • 就是springboot的启动场景
  • 比如Spring-boot-starter-web,他就会帮我们自动导入web环境所有的依赖
  • springboot会将所有的功能场景都设置为启动器
  • 我们需要什么功能,直接找到对应的启动器即可starter

主程序

//标注这个类是一个springboot的应用
@SpringBootApplication
public class HelloworldApplication {

    public static void main(String[] args) {
        //将springboot应用启动
        SpringApplication.run(HelloworldApplication.class, args);
    }
}
  • 注解

    @SpringBootConfiguration: springboot的配置

    ? @Configuration: spring配置类

    ? @Component: 说明其是spring的一个组件

    @EnableAutoConfiguration: 自动配置核心注解

    ? @AutoConfigurationPackage: 自动配置包

    ? @Import(AutoConfigurationPackages.Registrar.class): 自动配置包注册

    ? @Import(AutoConfigurationImportSelector.class): 自动配置导入选择

    //获取所有配置
    List configurations= getCandidateConfigurations(annotationMetadata, attributes);

  • protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
        List<String> configurations = SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(),
                                                                             getBeanClassLoader());
        Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories. If you "
                        + "are using a custom packaging, make sure that file is correct.");
        return configurations;
    }
    • META-INF/spring.factories:自动配置的核心文件

结论:springboot所有自动配置都是在启动的时候扫描并加载:spring.factories所有的自动配置类都在这里面,但是不一定生效,需要判断条件是否成立,只要导入了对应的start,就有对应的启动器了,有了启动器,我们自动装配就会生效,然后配置成功

  1. springboot在启动时,从类路径下/META-INF/spring.factories获取指定的值
  2. 将这些自动配置的类导入容器,自动配置就会生效,帮我进行自动配置
  3. 以前我们需要自动配置的东西,springboot帮我们做了
  4. 整合JavaEE,解决方案和自动配置的东西都在spring-boot-autoconfigure-2.2.0.RELEASE.jar这个包下
  5. 它会把所有需要导入的主键以类名的方式返回,这些组件就会被添加到容器
  6. 容器中会存在非常多的xxxAutoConfiguration的文件,就是这些类给容器中导入了这个场景需要的所有组件;并自动配置,@Configuration,JavaConfig!
  7. 有了自动配置类,免去了我们手动编写配置文件的工作

Run

@SpringBootApplication
public class SpringbootDemo02Application {

    public static void main(String[] args) {
        //该方法返回一个ConfigurableApplicationContext对象
        //参数一:应用入口的类     参数类:命令行参数
        SpringApplication.run(SpringbootDemo02Application.class, args);
    }
}

该方法主要分两部分,一部分是SpringApplication的实例化,二是run方法的执行;

SpringApplication

这个类主要做了以下四件事情

  1. 推断应用的类型是普通的项目还是Web项目
  2. 查找并加载所有可用初始化器 , 设置到initializers属性中
  3. 找出所有的应用程序监听器,设置到listeners属性中
  4. 推断并设置main方法的定义类,找到运行的主类

Run方法

SpringBoot配置文件

SpringBoot使用全局配置文件,配置文件名称是固定的

  • application.properties

    • 语法结构: key = value
  • application.yml
    • 语法结构: key: 空格 value

配置文件的作用:修改了SpringBoot自动配置默认的值,因为SpringBoot在底层都给我们自动配置好了

Yaml

YML是YAML(YAML Aint Markup Language)编写的文件格式,YAML是一种直观的能够被电脑识别的数据序列化格式,容易被阅读,容易和脚本语言交互,可以支持YAML库的不同编程语言程序导入,YML文件是以数据为核心,比传统的XML方式更加简洁

#普通的key - value
name: 张磊

#对象
student:
  name: 张磊
  age: 22

#行内写法
teacher: { name: 张磊, age: 22 }

#改端口
service:
  prot: 8082

#数组
pets:
  - cat
  - dog
  - pig

petss: [cat,dog,pig]

#集合、数据(对象数据)
student:
  - name: tom
    age: 22
    addr: beijing
  - name: cat
    age: 18
    addr: shanghai

student: [{name: tom, age: 22, addr: beijing},{name: cat, age: 18, addr: shanghai}]

#Map配置
map:
  key1: value1
  key2: value2

yaml可以直接给实体类赋值

原生方式

@SpringBootTest
class Springboot02ConfigApplicationTests {

    @Autowired
    private Dog dog;

    @Test
    void contextLoads() {
        System.out.println(dog.toString());
    }

}

不影响程序运行,可以到官网解决

yaml赋值

person:
  name: 张磊
  age: 22
  happy: yes
  birth: 2020/02/22
  maps: {k1: v1, k2: v2}
  lists:
    - code
    - music
    - girl
  dog:
    name: 纪烁
    age: 3
@Data
@AllArgsConstructor
@NoArgsConstructor
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
    private String name;
    private Integer age;
    private Boolean happy;
    private Date birth;
    private Map<String,Object> maps;
    private List<Object> lists;
    private Dog dog;
}

@ConfigurationProperties(prefix = "person")

ConfigurationProperties的作用

将配置文件中配置每一个属性的值,映射到这个组件中;

告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定

参数 prefix = "person" :将配置文件中的person下面的所有属性--对应

只要这个组件是容器中的组件,才能使用容器提供的@ConfigurationProperties功能

使用properties的后果

乱码问题-

settings ----> FileEncodings 中配置

@ConfigurationProperties与@Value的区别

@ConfigurationProperties @Value
功能 批量注入配置文件中的属性 一个个绑定
松散绑定(松散语法) 支持 不支持
SpEL 不支持 支持
JSR303数据校验 支持 不支持
复杂类型封装 支持 不支持
  • cp只需要写一次即可,value则需要每个字段都添加
  • last-name,与lastName是一样的
  • JSR303数据校验,这个就是我们可以在字段是增加一层过滤器验证,可以保证数据的合法性
  • 复杂类型封装,yml可以封装对象,使用@Value就不支持

结论

  • 配置yml和配置properties都可以获取到值 , 强烈推荐 yml
  • 如果我们在某个业务中,只需要获取配置文件中的某个值,可以使用一下 @value
  • 如果说,我们专门编写了一个JavaBean来和配置文件进行映射,就直接使用@configurationProperties,不要犹豫!

JSR303数据校验

spring-boot中可以用@validated来校验数据,如果数据异常则会统一抛出异常,方便异常中心统一处理。我们这里来写个注解让我们的name只能支持Email格式

@Component //注册bean
@ConfigurationProperties(prefix = "person")
@Validated  //数据校验
public class Person {

    //@Value("${person.name}")
    @Email //name必须是邮箱格式
    private String name;
}
加载指定配置文件

@PropertySource(value = "classpath:person.properties")

配置文件占位符
${random.value}、${random.int}、${random.long}、${random.int(10)}等等

SpringBoot多环境切换

  • 多配置文件

    我们在主配置文件编写的时候,文件名可以是 application-{profile}.properties/yml , 用来指定多个环境版本;

    例如:application-test.properties 代表测试环境配置 application-dev.properties 代表开发环境配置

    但是Springboot并不会直接启动这些配置文件,它默认使用application.properties主配置文件;

    我们需要通过一个配置来选择需要激活的环境;

    #比如在配置文件中指定使用dev环境,我们可以通过设置不同的端口号进行测试;
    #我们启动SpringBoot,就可以看到已经切换到dev下的配置了;
    spring.profiles.active=dev
  • yml的多文档块

    和properties配置文件中一样,但是使用yml去实现不需要创建多个配置文件,更加方便了

    server:
      port: 8081
    #选择要激活那个环境块
    spring:
      profiles:
        active: prod
    
    ---
    server:
      port: 8083
    #配置环境的名称
    spring:
      profiles: dev
    
    ---
    
    server:
      port: 8084
    spring:
      profiles: prod  #配置环境的名称
  • 配置文件加载位置

    springboot 启动会扫描以下位置的application.properties或者application.yml文件作为Spring boot的默认配置文件

    优先级1:项目路径下的config文件夹配置文件
    优先级2:项目路径下配置文件
    优先级3:资源路径下的config文件夹配置文件
    优先级4:资源路径下配置文件

    优先级由高到底,高优先级的配置会覆盖低优先级的配置;

    SpringBoot会从这四个位置全部加载主配置文件;*互补配置*

    我们在最低级的配置文件中设置一个项目访问路径的配置来测试互补问题;

    #配置项目的访问路径
    server.servlet.context-path=/kuang

SpringBoot集成其他技术

Mybatis

1.添加依赖
<!-- web功能起步依赖 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

<!-- 添加数据库驱动坐标 -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>

<!-- lombok依赖 -->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
</dependency>

<!-- Mybatis起步依赖-->
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.1.1</version>
</dependency>
2.添加数据库连接信息
#数据库连接信息
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/zl?useSSL=true&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=1870535196
3.dao层
@Mapper
public interface UserMapper {
    @Select("select * from user")
    List<User> selectAll();
}
4.pojo层
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
    private Integer id;
    private String username;
    private String password;
    private String name;
}
5.controller层
@Controller
public class MybatisController {

    @Autowired
    private UserMapper userMapper;

    @RequestMapping("/query")
    @ResponseBody
    public List<User> queryAll() {
        List<User> users = userMapper.selectAll();
        return users;
    }
}

原文地址:https://www.cnblogs.com/yfyyy/p/12363038.html

时间: 2024-10-12 11:16:09

SpringBoot基础学习的相关文章

Java新手学习路线,0基础学习Java怎样效率更高?

Java是老牌编程语言,拥有扎实的群众基础和广阔的市场应用,从业人员薪资也普遍较高.很多人想要加入到Java开发行列,不过0基础学习Java怎样效率更高? 很多0基础学习Java的同学想知道怎样学习效率更高?小编以为,学习Java需要一个系统的过程,而根据你未来的职位方向不同,学习也各有侧重.目前来说,Java就业方向包括Web开发.大数据开发.Android开发以及各种后端服务开发领域,但不论你选择哪一个,都要从最基础的知识点学习. Java基础知识点多且杂,初学者在开始的时候需要认识什么是J

蓝鸥零基础学习HTML5—html+css基础

蓝鸥零基础学习HTML5-html+css基础 一.课程目标 1.了解前端开发职位:2.掌握常用标签以及语义及用法:3.掌握常用css的特性,掌握基础布局技巧:4.掌握整站规划概念. 二.适用人群 零基础积极学习html5者 三.课程简介 本课程主要讲解了 html+css的基础知识,包括html模板.标签.css基础样式.布局.表格表单.整站等等,是进行前端开发的基础.Html+css是前端开发的基础,大部分前端开发工程都需要从html+css布局开始,html+css的基础非常重要,是前端开

HTML&CSS基础学习笔记8-预格式文本

<pre>标签的主要作用是预格式化文本.被包围在 pre 标签中的文本通常会保留空格和换行符.而文本也会呈现为等宽字体. <pre>标签的一个常见应用就是用来表示计算机的源代码.当然你也可以在你需要在网页中预显示格式时使用它. 会使你的文本换行的标签(例如<h>.<p>)绝不能包含在 <pre> 所定义的块里.尽管有些浏览器会把段落结束标签解释为简单地换行,但是这种行为在所有浏览器上并不都是一样的. 更多学习内容,就在码芽网http://www.

Objc基础学习记录5

NSMutableString类继承的NSString类. NSMutableString是动态的字符串. 1.appendingString 方式: 向字符串尾部添加一个字符串. 2.appendingFormat:可以添加多个类型的字符串. int,chat float,double等 3.stringWithString 创建字符串, 4.rangeOfString 返回str1在另一个字符串中的位置. 5.NSMakeRange(0,3) 字符串0位到3位. 6.deleteCharac

Linux新手入门书籍推荐 鸟哥的linux私房菜-基础学习篇

这本书写的不错.赞~\(≧▽≦)/~ 2017-02-24 下午,我开始在Linux下写第一个.c程序,在终端打印hello world.gcc 源代码文件之后,输出可执行文件,但是 当我输入文件名执行它的时候,却提示我 无法找到命令.于是我找百度,查资料,花了半个小时,终于找到解决方法了, 输入"./filename"即可.... 2017-02-25 我看<基础学习篇>这本书,在P158页下面的例题讲解中找到了昨天下午异常的解析.我就很是感慨,心想:要是早看这本书,半个

Java基础学习——数组初识(1)

Java基础学习--数组初识(1) 1什么是数组 Java中常见的一种数据结构就是数组,数组可以分为一维数组.二维数组和多维数组. 数组是由一组相同的变量组成的数据类型,数组中每个元素具有相同的数据类型,数组中的每个元素都可以用一个统一的数组名和下标来确定. 2 数组的使用 数组的一般使用步骤: 声明数组 分配内存给该数组 下面是一维数组为例: 数据类型  数组名 []: 数组名 = new 数据类型 [数据个数]: 2.1一维数组的声明与赋值 1.数组的声明 int  num [];    

零基础学习 Hadoop 如何下手

想学习hadoop,可是苦于自己没有任何的基础,不知道该如何下手,也不知道自己能不能学会.其实零基础学习hadoop,没有想象的那么困难.曾经我也是一位小白,刚接触到云计算,想过培训,但是培训机构的选择也让我很纠结,就自己开始去摸索学习,现在我把自己的学习思路整理一下,希望对大家有帮助. 首先整体说一下学习过程给大家借鉴: 一.了解hadoop: 这里不具体阐述概念,有兴趣的同学可以自己上网去查.我们知道hadoop,有单机安装,伪分布安装和分布安装.同时hadoop的环境是Linux,所以我们

HTML&CSS基础学习笔记13—无序列表

无序列表 有时我们的工作繁忙,杂事很多,怕忘记,就会把事情一件件列出来,防止忘记. 它们的排列顺序对于我们来说并不重要,可以随意调换,我们将它称为无序列表,HTML里用<ul>标签来表示无序列表,列表里的项目则用<li>标签来表示: 1 2 3 4 5 <ul>     <li></li>     <li></li>     ... </ul> 看一段实例代码: 对于的浏览器显示结果是这样的: 更多内容学习,请

javascript基础学习(十五)

javascript之cookie 学习要点: cookie介绍 创建与获取cookie cookie的编码 cookie的生存期 cookie的路径 cookie的domain cookie的secure 一.cookie介绍 cookie实际上就是一些信息,这些信息以文件的形式存储在客户端计算机上.在javascript中,cookie主要用来保存状态,或用于识别身份. 二.创建与获取cookie 创建cookie的语法代码如下所示:document.cookie="name=value&q