SpringBoot

SpringBoot最核心的东西:自动装配!!! 很重要! 以及他的SpringApplication.run(); 方法

配置用什么写:可以用xml, 和springboot自带的 yaml

自动装配原理? 重要:涉及谈资

新服务框架:服务网格

微服务的jar包,在打包后 把程序分为一个一个的块儿,用java -jar.\xxx.jar 就可以打开服务,可以直接访问
也就是微服务项目 , 一个由后端提供的web接口
通过maven打包后的jar包在target文件下的test-class下面,右键openin explorer
如何在当前文件下打开命令窗口 按住shift+鼠标右键

spring中的aop 拦截器和过滤器还要学一下!

学习任务:

  • 是什么
    • 他就是一个javaweb的一个开发框架,和spring mvc类似,简化开发,约定大于配置
  • 配置如何编写yaml
  • 自动装配原理:重要:谈资
  • 集成web开发:业务的核心集成数据库 Druid
  • 分布式开发:Dubbo+zookeeper
  • swagger:接口文档
  • 任务调度
  • SpringSecurity : Shiro

第一个SpringBoot程序

  • JDK 1.8
  • maven 3.6.1
  • SpringBoot 最新版
  • IDEA

官方:提供了一个快速生成的网站! IDEA集成了这个网站!

  • 可以在官网直接下载后,导入idea开发(官网在哪)
  • 直接使用idea创建一个springboot项目(一般开发直接在IDEA中创建)

原理初探 以后再说吧。。。

springboot中的所有依赖都是以spring-boot-starter开头的

spring-boot-starter 启动器

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

spring boot banner 生成好玩儿的字体 横幅 放在启动前

@Configuration的使用

  从Spring3.0,@Configuration用于定义配置类,可替换xml配置文件,被注解的类内部包含有一个或多个被@Bean注解的方法,这些方法将会被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext类进行扫描,并用于构建bean定义,初始化Spring容器。

yaml配置文件

  • application.properties

    • 语法结构: key=value
  • application.yaml

    • 语法结构: key: 空格 value
  • 例如 :

  • server:
    	port: 8080
    # 对空格要求很严
    # 普通的key-value
    name: qinjiang
    #对象
    student:
    	name: qinjiang
    #    age: 3 如果他们没有对其,那么这个age就是name下的一个属性
    	age: 3
    #行内写法
    student: {name: qinjiang,age: 3}
    #数组
    pets:
    	- cat
    	- dog
    	- pig
    pets: [cat,dog,pig]
    # 这是yaml配置
    
  • server.port=8080
    # 这是properties配置
    
  • <server>
        <port>8080</port>
    </server>
    <!--这是xml配置-->
    
  • yaml配置 可以直接给实体类赋值

  • 松散绑定:比如我yaml中写的是last-name,name他跟lastName是一样的,-后面字母默认大写

  • 赋值的方法里面只需要熟悉一种即可 推荐yaml配置

如何给实体类上的属性赋值? 我们可以使用Spring中的 @Value注解

但是在springboot中

我们可以使用 @ConfigurationProperties(perfix = "xxx") ,他会默认帮我们寻找yaml配置文件
xxx表示yaml配置文件中的前缀名 例如 student
他会将配置文件中的每一个值与我们实体类属性进行映射,前提是名字要相同

占位符 el表达式 $

person:
    name: maomao${random.uuid} # 随机uuid
    age: ${random.int}  # 随机int
    happy: false
    birth: 2022/03/23
    maps: {k1: v1,k2: v2}
    lists:
      - code
      - girl
      - music
    dog:
      name: ${person.hello:other}_旺财
      age: 1

举例

  • yaml配置

  • person:
      name: maomao
      age: 3
      happy: false
      birth: 2022/3/23
      maps: {k1: v1,k2: v2}
      lists:
       - code
       - girl
       - music
      dog:
        name: 旺财
        age: 1
    
  • 实体类

  • /*
    @ConfigurationProperties作用:
    将配置文件中配置的每一个属性的值,映射到这个组件中;
    告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定
    参数 prefix = “person” : 将配置文件中的person下面的所有属性一一对应
    */
    @Component //注册bean
    @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;
    }
    

    JSR303校验

    记得添加依赖包

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

    它是用来规范命名的

    首先要在实体类上使用注解
    @Validated //数据校验
    然后在属性上可用的方法有:

    @NotNull(message="名字不能为空")
    private String userName;
    @Max(value=120,message="年龄最大不能查过120")
    private int age;
    @Email(message="邮箱格式错误")
    private String email;
    
    空检查
    @Null       验证对象是否为null
    @NotNull    验证对象是否不为null, 无法查检长度为0的字符串
    @NotBlank   检查约束字符串是不是Null还有被Trim的长度是否大于0,只对字符串,且会去掉前后空格.
    @NotEmpty   检查约束元素是否为NULL或者是EMPTY.
        
    Booelan检查
    @AssertTrue     验证 Boolean 对象是否为 true  
    @AssertFalse    验证 Boolean 对象是否为 false  
        
    长度检查
    @Size(min=, max=) 验证对象(Array,Collection,Map,String)长度是否在给定的范围之内  
    @Length(min=, max=) string is between min and max included.
    
    日期检查
    @Past       验证 Date 和 Calendar 对象是否在当前时间之前  
    @Future     验证 Date 和 Calendar 对象是否在当前时间之后  
    @Pattern    验证 String 对象是否符合正则表达式的规则
    
    .......等等
    除此以外,我们还可以自定义一些数据校验规则
    

多环境配置

可以使用properties配置,但是要创建多个文件
命名的时候例如application-dev.properties,使用的时候在默认的配置文件中输入:spring.profiles.active=dev
使用yaml配置,一个文件即可,用 --- 分隔开

server:
  port: 8081
#选择要激活那个环境块
spring:
  profiles:
    active: prod

---
server:
  port: 8083
spring:
  profiles: dev #配置环境的名称

---
server:
  port: 8084
spring:
  profiles: prod  #配置环境的名称

Web开发

静态资源导入

​ 默认访问resources目录下的,按优先级进行排名的

  • resources
  • static
  • public

HTML页面

如果想要访问templates下面的静态资源,必须先引入thymeleaf依赖

他会自己配置设计图解析器,在classpath:/templates 下面 的 .html

使用了thymeleaf路径后,不需要/static 那些默认静态资源目录,直接可以访问子级目录

它里面的templates包,其实就可以当做web项目中的web-inf包
它的目录下面的所有页面,都只能通过controller来跳转

首页

就在静态资源目录下创建一个名为index.html的文件即可

thymeleaf语法

(前提:需要模板引擎的支持 thymeleaf)
导入thymeleaf依赖

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

导入依赖后需要在页面引用命名空间,${msg}也依旧是后端controller通过Model获取的值

<html lang="en" xmlns:th="http://www.thymeleaf.org">
<!--th:text就是将div中的内容设置为它指定的值,和之前学习的Vue一样 取值 -->
<div th:text="${msg}"></div>

image-20220331185243304

创建一个MVC配置文件

在主程序的同级目录下创建一个名为config的包
该包下面的类需要实现 WebMvcConfigurer 类
并注解为配置类@Configuration

@EnableWebMvc的注解要注意,他会覆盖我们原有的配置

注:实现了视图解析器接口的类,我们就可以称之为视图解析器
public interface ViewResolver

连接数据库

spring:
  profiles:
    active: dev
  datasource:
    url: jdbc:mysql://localhost:3306/test1?useSSL=false&characterEncoding=utf8
    username: root
    password: 258025
    driver-class-name: com.mysql.jdbc.Driver

在配置文件中的classpath也就代表了resources目录

p34

https://gitee.com/ENNRIAAA/spring-security-material?_from=gitee_search资源地址

开启某个功能@Enablexxx

web安全框架SpringSecurity

身份验证和访问控制框架

shiro

具体请访问我另一篇文章:

总体来看,对Shiro的操作,是围绕Realm的对象来进行操作的,Realm提供的是待校验数据的比对值,即安全数据源

Subject currentuser = SecurityUtils.getSubject();
Session session = currentuser.getSession();
currentUser.isAuthenticated()
currentUser. getPrincipal()
currentUser.hasRo1e ("schwartz")
currentUser.isPermitted("7ightsaber:wie1d")currentUser. logout();
<!-- shiro -->
<dependency>
    <groupId>org.apache.shiro</groupId>
    <artifactId>shiro-spring</artifactId>
    <version>1.9.0</version>
</dependency>
  • 创建一个Shiro的 Configuration 类 需要使用 @Configuration 注解
    1. 先创建 realm 对象,UserRealm
    2. 创建 DefaultWebSecurityManager 对象
    3. 创建 ShiroFilterFactoryBean 对象
      都需要使用@Bean注册bean
  • 自定义一个UserRealm类 继承AuthorizingRealm
    业务一般写这里
    一般创建顺序:

    • 重写里面的两个方法 授权和认证
    • AuthorizationInfo
    • AuthenticationInfo
  • 登录拦截:
  • SimpleAuthenticationInfo
    MD5加密,MD5盐值加密:会在后面加上你的username

原文链接:https://blog.csdn.net/weixin_38297879/article/details/81317625

Swagger

  • 号称世界上最流行的API框架

  • Restful Api 文档在线自动生成器 => API 文档 与API 定义同步更新

  • 直接运行,在线测试API

  • 支持多种语言 (如:Java,PHP等)

  • 官网:https://swagger.io/

    • 如何才能运行?
  1. 导入两个依赖 springfox-swagger2 和 springfox-swagger-ui
    现在只需要一个整合的依赖springfox-boot-starter
  2. 创建一个config类
  3. 第二步在config类上使用@EnableOpenApi注解 第三步在启动类上使用@EnableWebMvc注解
    一定记住启动类加入@EnableWebMvc注解,不然会空指针异常
  4. 类上使用@Configuration注解,并使用@EnableSwagger2开启
  5. 出现问题就需要降版本,版本问题

Dubbo - Zookeeper

分布式微服务
SpringBoot-狂神(20. Springboot+Dubbo+Zookeeper)学习笔记
Dubbo是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。

Zookeeper ZooKeeper也可以作为注册中心

  • ZooKeeper主要服务于分布式系统,可以用ZooKeeper来做:统一配置管理、统一命名服务、分布式锁、集群管理。
  • 使用分布式系统就无法避免对节点管理的问题(需要实时感知节点的状态、对节点进行统一管理等等),而由于这些问题处理起来可能相对麻烦和提高了系统的复杂性,ZooKeeper作为一个能够通用解决这些问题的中间件就应运而生了。

图片

Dubbo是一种分布式的服务架构,用于改进 RPC远程服务呼叫机制,并提供 SOA服务管理。
SpringCloud是一组有序的框架。
Spring Boot开发的便利,使得分布式系统架构的开发变得更加简单,比如服务发现,配置中心,消息总线,负载平衡,断路器,数据监控等等。Spring并不是一个重复的过程,而是将各个公司开发的更加成熟、更加可靠的服务架构结合在一起,通过 Spring Boot的重新包装,避免了那些繁琐的设计和实现,从而为开发者提供了一系列易于理解、易于部署和维护的分布式系统开发工具箱。

Dubbo的性能更高,但是开发更难

测试Demo

  • zookeeper的默认端口号为:2181 即注册中心的端口号
    • zookeeper:服务注册与发现
  • Dubbo的默认端口号为:20880 即一个管理注册中心的容器
    • 它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。
  1. 导入Dubbo和zookeeper的Maven依赖

  2. 配置文件配置Dubbo相关配置

    • 提供者provider-server

    • #服务应用名字
      dubbo.application.name=provider-server
      #注册中心地址
      dubbo.registry.address=zookeeper://127.0.0.1:2181
      #哪些服务要被注册 有@DubboService注解的
      dubbo.scan.base-packages=com.mao.service
      
    • 在被扫描的包下的Bean(也就是想要注册的服务上)上使用 @DubboService + Spring的@Service 注解

      @DubboService  //可以被扫描到,在项目已启动就自动注册到注册中心
      @Service
      public class TicketserviceImpl implements Ticketservice {
          @Override
          public string getTicket() i
          return "《毛毛学Java》";
          }
      }
      
    • 消费者customer-server

    • #服务应用名字
      dubbo.application.name=customer-server
      #注册中心地址 127.0.0.1:2181 可以是任何一个电脑的zookeeper端口
      dubbo.registry.address=zookeeper://127.0.0.1:2181
      
      • 使用@DubboReference引入服务接口(前提是消费者的接口位置要跟提供者的接口位置相同)
      @Service
      public class CustomerService {
          //想拿到provider-server提供的票,要去注册中心拿到服务
          @DubboReference //引用, Pom坐标,可以定义路径相同的接口名
          Ticketservice ticketService;
      	public void buyTicket(){
              string ticket= ticketservice.getTicket();
          }
      }
      
  3. 运行SpringApplication

    • 运行zookeeper服务
    • 运行dubbo-admin服务(监控中心)
      1. 访问 localhost:7001 (他是一个管理注册中心服务的一个可视化web界面)

异步任务

  • @Async 注解 写在方法上面,高速程序这是异步执行的

  • @EnableAsync 在主程序类上开启这个功能,就能实现异步了

  • 就是例如

    //你进行了延时 3s  他会在三秒后才返回结果
    // 这个时候前端页面会一直处于加载状态
    Thread.sleep(3000);
    System.out.printLn("数据正在处理,,,,");
    

    但是此时你开启了异步任务 那么他会前端先返回前端的数据,后端按照程序延时后执行

邮件发送

定时任务~表达式

TaskScheduler	任务调度者
TaskExecutor	任务执行者

@EnableScheduling	// 开启定时功能的注解
@Scheduled	// 什么时候执行
// cron 表达式~ 	可以直接百度搜索cron表达式生成器
@Scheduled(cron = "")

注意:

整个项目中,只要是thymelef中的静态资源都只能通过访问controller中的映射地址来访问

学习网站

(22条消息) springboot项目简单介绍、启动和部署_Survivor001的博客-CSDN博客_springboot项目怎么启动

员工管理系统

请移步我的另一篇文章:
SpringBoot员工管理系统