springBoot2(2核心技术)

【SpringBoot的坑】Restful请求报错Request method 'POST' not supported,HiddenHttpMethodFilter无法将POST转换为PUT原因分析 直接上结论: 因为 SpringBoot 版本原因,在我目前使用的 2.2.4 版本中,需要在springapplication.xml文件中 添加配置: spring.mvc.hiddenmethod.filter.enabled = true 什么是 REST Restful 目的只是让 url 看起来更简洁实用,是资源状态的一种表达。 Restful 的使用 由于 H5 的 form... 阅读详情

注:里面的各种原理不求完全掌握,可以看看最后一个章节,懂懂流程就行。

4 配置文件

配置文件两种类型,一种是properties,一种是yaml
yaml语法:
在这里插入图片描述
自定义的类写配置文件的时候没有提示,要提示需要依赖:

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>

 <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.springframework.boot</groupId>
                            <artifactId>spring-boot-configuration-processor</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>

5 web开发

5.1 自动配置概览

这个不求全懂,有个印象:
在这里插入图片描述
在这里插入图片描述

5.2 静态资源、index页、Favicon

5.2.1 静态资源

静态资源默认的存放地址:
在这里插入图片描述
访问:
当前项目根路径/ + 静态资源名
在这里插入图片描述
修改配置:

spring:
 mvc:
   #静态资源访问前缀
   static-path-pattern: /res/**
 resources:
   #静态资源路径修改
   static-locations: [classpath:/haha/]

当前项目 + static-path-pattern + 静态资源名 = 静态资源文件夹下找。
前后端分离后这种情况很少见了,静态资源放到前端工程的static里了。

5.2.2 欢迎页index.html

静态资源路径下放个index.html,访问项目路径直接可以跳到index页

5.2.3 Favicon图标

favicon.ico 放在静态资源目录下即可。

5.2.4 静态资源配置原理

SpringBoot启动默认加载 xxxAutoConfiguration 类(自动配置类),SpringMVC功能的自动配置类 WebMvcAutoConfiguration,所以我们debug看WebMvcAutoConfiguration这个类。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这里就可以看到默认的静态路径为什么是那4个:
在这里插入图片描述
在这里插入图片描述

5.3 请求参数

5.3.0 rest

rest风格:
在这里插入图片描述
rest使用条件:

  • 表单method=post,隐藏域 _method=put
  • yaml配置开启hiddenmethodfilter
spring:
  mvc:
    hiddenmethod:
      filter:
        enabled: true

rest风格就是通过HiddenHttpMethodFilter类中的方法,将post请求的_method属性的值(PUT/DELETE)替换请求类型,post变put/delete,然后放行给后面的dispatcherservlet,让它调具体的controller。
定制化"_method":
在这里插入图片描述

	//自定义filter
    @Bean
    public HiddenHttpMethodFilter hiddenHttpMethodFilter(){
        HiddenHttpMethodFilter methodFilter = new HiddenHttpMethodFilter();
       //更改rest风格需要的默认属性名:
        methodFilter.setMethodParam("_m");
        return methodFilter;
    }

5.3.1 普通参数和基本注解

注解

@PathVariable、@RequestHeader、@ModelAttribute、@RequestParam、@MatrixVariable、@CookieValue、@RequestBody
以上注解的具体描述:
在这里插入图片描述
html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h2>测试基本注解</h2>
<a href="/car/1/中文name?age=18&inters=basketball&inters=羽毛球">/car/1/中文name?age=18&inters=basketball&inters=羽毛球</a>
</body>
</html>

controller:

package com.atguigu.controller;

import org.springframework.web.bind.annotation.*;
import javax.servlet.http.Cookie;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@RestController
public class ParamTestController {
    @GetMapping("/car/{id}/{name}")
    public Map<String, Object> getCar(@PathVariable("id") Integer id,
                                      @PathVariable("name") String name,
                                      @PathVariable Map<String, String> pathVariableMap,
                                      @RequestHeader("User-Agent") String userAgent,
                                      @RequestHeader Map<String, String> header,
                                      @RequestParam("age") Integer age,
                                      @RequestParam("inters") List<String> inters,
                                      @RequestParam Map<String, String> requestParamMap
                                      //@CookieValue("_ga") String ga  (获取cookie,chrome浏览器没发cookie,这里就不获取了,免得报错)
    ) {
        HashMap<String, Object> map = new HashMap<>();
        map.put("id", id);
        map.put("name", name);
        map.put("pathVariableMap", pathVariableMap);
        map.put("userAgent", userAgent);
        map.put("header", header);
        map.put("age", age);
        map.put("inters", inters);
        map.put("requestParamMap",requestParamMap);

        return map;
    }
}

返回的map->json结果:
在这里插入图片描述post请求可以用@RequestBody,得到原始的请求体信息:
html:
在这里插入图片描述
controller:
在这里插入图片描述
返回结果:
在这里插入图片描述

@RequestAttribute,得到request请求域中的特定属性数据:
在这里插入图片描述
矩阵变量(了解):
在这里插入图片描述

Servlet API

WebRequest、ServletRequest、MultipartRequest、 HttpSession、javax.servlet.http.PushBuilder、Principal、InputStream、Reader、HttpMethod、Locale、TimeZone、ZoneId

复杂参数

Map、Model(map、model里面的数据会被放在request的请求域 request.setAttribute)、Errors/BindingResult、RedirectAttributes( 重定向携带数据)、ServletResponse(response)、SessionStatus、UriComponentsBuilder、ServletUriComponentsBuilder

参数处理原理

● HandlerMapping中找到能处理请求的Handler(Controller.method())
● 为当前Handler 找一个适配器 HandlerAdapter
● 通过该适配器下不同的参数解析器resolvers解析不同的参数,然后适配器执行目标方法

5.3.2 pojo封装

可以自动类型转换与格式化,可以级联封装。
在这里插入图片描述

pojo封装原理

首先创建个空的对象,然后通过绑定器把k-v和空对象一一对应,值填入空对象,值填入空对象之前用转换器把值变成对象需要的数据类型。

5.4 数据响应与内容协商

数据响应,分响应页面和响应数据,响应页面用的少,前后端分离后一般是后台给前台响应数据,怎么显示是前台(vue,jsp,html)的事。
在这里插入图片描述
内容协商是说,根据客户端接收能力不同,返回不同媒体类型的数据。

5.4.0 相应页面

客户端跳转(重定向redirect)和服务器端跳转:
在这里插入图片描述
服务端跳转:
在这里插入图片描述
客户端跳转:
在这里插入图片描述
区别:

  • 服务器端跳转时,浏览器地址栏中的URL不会改变(客户端并不知道页面进行了跳转);客户端跳转时,则地址栏会改变为第二次请求的URL。
  • 服务器端跳转时,未超出request的属性范围,request属性能够保存到跳转页;客户端跳转时,则超出了request的属性范围,无法进行其属性的传递。

5.4.1 响应json

jackson.jar+@ResponseBody:
web场景启动器里有json相关的jar包,然后再加@ResponseBody注解,返回的就是json。
在这里插入图片描述
原理:
在这里插入图片描述
springmvc支持的返回值类型:
在这里插入图片描述

5.4.2 内容协商

(1)基于header请求头的内容协商

浏览器能解析什么类型数据,一般默认由请求头信息说明,服务器给浏览器返回该类型的数据。

下面模拟返回xml和json两种不同数据:
(由于返回json方式在jackson的jar包中已经有了,所以这里添加个对应的能返回xml格式数据的jar包)

1 引入xml依赖
<dependency>
            <groupId>com.fasterxml.jackson.dataformat</groupId>
            <artifactId>jackson-dataformat-xml</artifactId>
</dependency>
2 postman分别测试返回json和xml

这里使用postman改变header请求头中Accept的值来让服务器得知返回什么类型的数据。
在这里插入图片描述
接收所有格式的k-v参数:
在这里插入图片描述

(2)基于请求参数的内容协商

除了默认的基于请求头,springmvc还自带一个基于请求参数的内容协商,只需要yaml配置一下就行:

spring:
    contentnegotiation:
      favor-parameter: true  #开启请求参数内容协商模式

然后路径中带format的参数:
在这里插入图片描述
这个操作有时候不起效不知道为什么,本人还是喜欢用前端ajax请求的时候在header中规定数据格式。

5.4.3 内容协商原理

在这里插入图片描述

5.5 视图解析

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5.6 拦截器

拦截器是使用的springmvc的拦截器,可以参考之前的博客:springmvc博客。
定义拦截器就实现HandlerInterceptor接口,实现里面三个方法就行:
在这里插入图片描述
比如创建一个可以在登录的controller执行前验证登录信息的拦截器:
在这里插入图片描述
然后将拦截器注册:
在这里插入图片描述
在这里插入图片描述
多拦截器执行:
在这里插入图片描述

5.7 文件上传

文件上传参照springmvc博客
文件上传自动配置内容:
在这里插入图片描述

5.8 异常处理

5.8.1 默认异常处理规则

  • 默认情况下,Spring Boot提供/error处理所有错误的映射
  • 对于机器客户端,它将生成JSON响应,其中包含错误,HTTP状态和异常消息的详细信息。
    对于浏览器客户端,响应一个“ whitelabel”错误视图,以HTML格式呈现相同的数据

    在这里插入图片描述

5.8.2 异常处理流程

异常处理流程:
在这里插入图片描述

5.8.3 异常处理的定义使用

参照springmvc博客

5.9 web原生组件注入

servlet、filter、listener,使用springmvc和springboot后,其实原生的组件用的少了,本人觉得5.9这节没啥用。

5.9.1 servlet

三大原生组件都需要这个@servletcomponentscan来扫描:
在这里插入图片描述
在这里插入图片描述

5.9.2 filter

在这里插入图片描述

5.9.3 listener

在这里插入图片描述

5.9.4 使用registrationbean注解

在这里插入图片描述
最好单实例:
在这里插入图片描述
使用这三个注解就不用加@webservlet之类的注解了。

5.10 嵌入式Servlet容器

servlet容器就是指tomcat之类的。

5.10.1 切换servlet容器

在这里插入图片描述
切换容器就是排除tomcat,然后导入别的服务器jar包:
在这里插入图片描述

5.10.2 修改容器属性

yaml里修改:server.xxxx

5.11 定制化原理

5.11.1 定制化常见方式

方法1:最简单的,直接改yaml

在这里插入图片描述

方法2:xxxxCustomizer 定制化器

在这里插入图片描述

方法3:编写自定义的配置类 xxxConfiguration;+ @Bean替换、增加容器中默认组件

在这里插入图片描述

5.11.2 原理分析套路

导入组件是在xxxAutoConfiguration里面的@Bean操作导入的。
在这里插入图片描述

6 数据访问

6.1 SQL

jdbc、mybatis、druid的关系:
在这里插入图片描述

6.1.1 整合druid+mybatis:

整合某些东西一般需要自定义或者用starter,这里使用starter。

  1. 引入druid的starter依赖和yaml配置
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.17</version>
        </dependency>
		 <!--springboot不知道你要用什么数据库,所以数据库驱动自己额外加,注意默认的驱动版本-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/guns211030?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true
    username: root
    password: password
    driver-class-name: com.mysql.cj.jdbc.Driver

    druid:
      aop-patterns: com.atguigu.*  #监控SpringBean
      filters: stat,wall     # 底层开启功能,stat(sql监控),wall(防火墙)

      stat-view-servlet:   # 配置监控页功能
        enabled: true
        login-username: admin
        login-password: admin
        resetEnable: false

      web-stat-filter:  # 监控web
        enabled: true
        urlPattern: /*
        exclusions: '*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*'

      filter:
        stat:    # 对上面filters里面的stat的详细配置
          slow-sql-millis: 1000
          logSlowSql: true
          enabled: true
        wall:
          enabled: true
          config:
            drop-table-allow: false
  1. mybatis依赖和yaml:
<dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.4</version>
</dependency>
# 配置mybatis规则
mybatis:
  #全局配置文件,autoconfig都配好了,可以不配
  #config-location: classpath:mybatis/mybatis-config.xml
  mapper-locations: classpath:mybatis/mapper/*.xml
  configuration:
    map-underscore-to-camel-case: true #开启数据库表里面的字段名xxx_yyy和实体类里面的属性名xxxYyy的自动驼峰对应。
  1. 使用:
    数据库里搞个表 show_jflow:
    在这里插入图片描述
    弄两个数据:
    在这里插入图片描述
    写个对应的实体类,加上get/set方法:
    在这里插入图片描述
    写个dao层的interface,标上mybatis独有的@Mapper注解:
    在这里插入图片描述
    在resources/mybatis/mapper里建个JflowMapper.xml:
    在这里插入图片描述
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.atguigu.dao.JflowMapper">
    <select id="getAll" resultType="com.atguigu.bean.JworkFlow">
        select * from  show_jflow
    </select>
</mapper>

搞个controller,service层这里就不弄了,直接注入dao层的mapper,测试从简:
在这里插入图片描述
运行起来访问有数据,可以了:
在这里插入图片描述
注:注解方式可以不用写xml,简单的查询可以,复杂查询建议还是xml走起,可以xml+注解
在这里插入图片描述

6.1.2 整合mybatisplus

MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
不引入mybatis,只引入mybatisplus,因为后者包括了前者的jar包:

<dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.1</version>
</dependency>

在这里插入图片描述
只需要我们的Mapper继承 BaseMapper 就可以拥有crud能力(图片里是user类),甚至如果没有自定义的查询语句需求的话,xml都可以不要:
在这里插入图片描述
因为我们的实体类名和表名不同,所以要使用注解对应:
在这里插入图片描述
写个controller:
在这里插入图片描述
测试:
在这里插入图片描述

6.2 NoSQL

这里以redis为例。
Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。 Redis 内置了复制(replication),LUA脚本(Lua scripting), LRU驱动事件(LRU eviction),事务(transactions) 和不同级别的磁盘持久化(persistence), 并通过 Redis哨兵(Sentinel)和自动分区(Cluster)提供高可用性(high availability)。

6.2.1 整合redis

操作redis数据库的框架官方推荐的java客户端只有Jedis、lettuce、Redisson。

  1. 安装redis,安装可以参照:how2j.cn的REDIS系列教材,然后按照教程运行起来redis服务。
  2. 导入redis的starter,配置yaml:
<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

可以看到,自带一个底层是用通信框架netty写的lettuce:
在这里插入图片描述
在这里插入图片描述
测试:
在这里插入图片描述
在这里插入图片描述

6.2.2 切换操作redis的框架lettuce–>jedis

在原有的starter依赖基础上加jedis依赖,然后yaml指定jedis框架,
在这里插入图片描述
在这里插入图片描述
测试类写法不动,测试依旧:
在这里插入图片描述

7 单元测试

7.1 junit5新特性

在这里插入图片描述
在这里插入图片描述
junit5使用:
在这里插入图片描述
在这里插入图片描述

7.2 常用注解

在这里插入图片描述
在这里插入图片描述

7.3 断言

断言(assertions)是测试方法中的核心部分,用来对测试需要满足的条件进行验证。这些断言方法都是 org.junit.jupiter.api.Assertions 的静态方法。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
异常断言例子:
在这里插入图片描述
项目上线前,先跑几遍测试,看看汇总报告,确保没问题再上线:
在这里插入图片描述
在这里插入图片描述

7.4 前置条件

在这里插入图片描述

7.5 嵌套测试

JUnit 5 可以通过 Java 中的内部类和@Nested 注解实现嵌套测试,从而可以更好的把相关的测试方法组织在一起。在内部类中可以使用@BeforeEach 和@AfterEach 注解,而且嵌套的层次没有限制。
在这里插入图片描述

7.6 参数化测试

参数化测试是JUnit5很重要的一个新特性,它使得用不同的参数多次运行测试成为了可能,也为我们的单元测试带来许多便利。

利用@ValueSource等注解,指定入参,我们将可以使用不同的参数进行多次单元测试,而不需要每新增一个参数就新增一个单元测试,省去了很多冗余代码。

@ValueSource: 为参数化测试指定入参来源,支持八大基础类以及String类型,Class类型
@NullSource: 表示为参数化测试提供一个null的入参
@EnumSource: 表示为参数化测试提供一个枚举入参
@CsvFileSource:表示读取指定CSV文件内容作为参数化测试入参
@MethodSource:表示读取指定方法的返回值作为参数化测试入参(注意方法返回需要是一个流)

当然如果参数化测试仅仅只能做到指定普通的入参还达不到让我觉得惊艳的地步。让我真正感到他的强大之处的地方在于他可以支持外部的各类入参。如:CSV,YML,JSON 文件甚至方法的返回值也可以作为入参。只需要去实现ArgumentsProvider接口,任何外部文件都可以作为它的入参。
在这里插入图片描述

8 指标监控

8.1 springboot Actuator

8.1.1 actuator介绍

未来每一个微服务在云上部署以后,我们都需要对其进行监控、追踪、审计、控制等。SpringBoot就抽取了Actuator场景,使得我们每个微服务快速引用即可获得生产级别的应用监控、审计等功能。
在这里插入图片描述

8.1.2 Actuator使用

首先引入依赖:

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

在这里插入图片描述
然后yaml配置:

management:
  endpoints:
    enabled-by-default: true #暴露所有监控端点信息
    web:
      exposure:
        include: '*'  #以web方式暴露所有端点

测试:
访问 http://localhost:8080/actuator/**,
可用的路径一般有:
在这里插入图片描述
这些beans、configprops等都是监控端点(Actuator Endpoint),具体有哪些监控端点可以查官网。
在这里插入图片描述
全代码看着费劲,下面介绍可视化的工具。

8.1.3 可视化

这里使用这个可视化框架:https://codecentric.github.io/spring-boot-admin/2.5.1/#getting-started
服务端:
1.初始化一个springboot项目,然后导依赖:
注意版本
在这里插入图片描述
2.启动程序上加个注解:
在这里插入图片描述
客户端:
(注意springboot的版本都是2.3.4;客户端端口号不要和服务端冲突了)
依赖:
在这里插入图片描述
yaml:
在这里插入图片描述
都启动,然后测试:
在这里插入图片描述
在这里插入图片描述

8.2 Actuator Endpoint

最常用的Endpoint
● Health:监控状况
● Metrics:运行时指标
● Loggers:日志记录

8.2.1 Health Endpoint

健康检查端点,我们一般用于在云平台,平台会定时的检查应用的健康状况,我们就需要Health Endpoint可以为平台返回当前应用的一系列组件健康状况的集合。
重要的几点:
● health endpoint返回的结果,应该是一系列健康检查后的一个汇总报告
● 很多的健康检查默认已经自动配置好了,比如:数据库、redis等
● 可以很容易的添加自定义的健康检查机制

看到默认的health端点不够详细:
在这里插入图片描述
不详细就设置一下:
在这里插入图片描述
设置后的详细health:
在这里插入图片描述

8.2.2 Metrics Endpoint

提供详细的、层级的、空间指标信息,这些信息可以被pull(主动推送)或者push(被动获取)方式得到;
● 通过Metrics对接多种监控系统
● 简化核心Metrics开发
● 添加自定义Metrics或者扩展已有Metrics

在这里插入图片描述
在这里插入图片描述

8.2.3 管理Endpoints

● 默认所有的Endpoint除过shutdown都是开启的。
● 需要开启或者禁用某个Endpoint。配置模式为 management.endpoint..enabled = true
在这里插入图片描述

8.3 定制 Endpoint

8.3.1 定制health

在这里插入图片描述
在这里插入图片描述

8.3.2 定制info

http://localhost:8080/actuator/info 会输出返回的所有info信息,默认是空的。
常用两种方式,yaml方式和java方式.
在这里插入图片描述
第二种方式在一些信息只能通过方法返回得到的场景会使用。
会返回方法1和方法2所有的合并结果:
在这里插入图片描述

8.3.3 定制Metrics信息

在这里插入图片描述
定制指标:
在这里插入图片描述
这样代码太耦合了,笔者现有知识推荐用aop。
查看:
在这里插入图片描述

8.3.4 定制(新增)endpoint

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

9 原理解析

9.1 profile功能

为了方便多环境适配,springboot简化了profile功能。
首先建三个配置:
在这里插入图片描述
依次配三个server.port,分别为8080,8081,8082
启动,观察发现第一个yaml生效了:
在这里插入图片描述
在application.yaml里加入:

spring:
  profiles:
    active: prod

发现prod的生效了:
在这里插入图片描述
结论:默认配置文件(application.yaml)永远加载,在里面指定加载的配置文件之后加载,有冲突的地方凭后加载的为准。
打jar包以后配置就固定了,如果要改配置,就java -jar xxx.jar --xxx.xxx.xxx=xxx,比如改profile配置:
在这里插入图片描述
还可以条件装配组件:
在这里插入图片描述
profile还能批量加载分组配置:
在这里插入图片描述

9.2 外部化配置

9.2.1 配置来源

将配置抽取出来放在外部,加载的时候让springboot调配置加载。
外部化配置来源:
1…yaml/properties文件
2.来自环境、系统变量
在这里插入图片描述
主要能访问的东西都来源于系统的环境变量和系统属性:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
3.启动时命令行额外带着的配置
在这里插入图片描述

9.2.2 配置查找位置

(后面的覆盖前面的)
在这里插入图片描述

9.2.3 配置文件加载顺序

上节第3点config data 配置文件的查找位置:
在这里插入图片描述
classpath类路径:java路径、resources路径都是类路径。
其实也不是优先级低,而是下面的后加载,导致覆盖了上面的配置。

9.2.4 总结

指定环境优先,外部优先,后面的可以覆盖前面的同名配置项

9.3 自定义starter

9.3.1 starter启动原理

在这里插入图片描述

9.3.2 自定义starter案例

  1. 新建一个Empty project,在里面新建两个模块,一个maven模块叫atguigu-hello-spring-boot-starter,另一个springboot模块叫atguigu-hello-spring-boot-starter-autoconfigure。
  2. 在starter模块中引入autoconfigure模块的依赖:
    在这里插入图片描述
  3. autoconfigure模块配置:
    在这里插入图片描述
    HelloServiceAutoConfiguration:
package com.atguigu.hello.auto;

import com.atguigu.hello.bean.HelloProperties;
import com.atguigu.hello.service.HelloService;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@ConditionalOnMissingBean(HelloService.class)
@EnableConfigurationProperties(HelloProperties.class)
public class HelloServiceAutoConfiguration {

    @Bean
    public HelloService helloService() {
        HelloService helloService = new HelloService();
        return helloService;
    }
}

HelloProperties:

package com.atguigu.hello.bean;

import org.springframework.boot.context.properties.ConfigurationProperties;

@ConfigurationProperties("atguigu.hello")
public class HelloProperties {
    private String prefix="default prefix";
    private String suffix="default suffix";

    public String getPrefix() {
        return prefix;
    }

    public void setPrefix(String prefix) {
        this.prefix = prefix;
    }

    public String getSuffix() {
        return suffix;
    }

    public void setSuffix(String suffix) {
        this.suffix = suffix;
    }
}

HelloService:

package com.atguigu.hello.service;

import com.atguigu.hello.bean.HelloProperties;
import org.springframework.beans.factory.annotation.Autowired;

public class HelloService {

    @Autowired
    HelloProperties helloProperties;

    public String sayhello(String userName) {
        return helloProperties.getPrefix() + ":" + userName + "," + helloProperties.getSuffix();
    }
}

spring.factories把我们的自动配置类加上,其他保持springboot的自动配置类,(其实可以不用加springboot原来的,他应该是额外增加,不是替换):
在这里插入图片描述
4. clean-install:
先auto,再starter,作用是加到maven仓库里?
在这里插入图片描述
5. 测试
测试就是找个项目,pom里加上starter,然后测试类测试:

<dependency>
            <groupId>com.atguigu</groupId>
            <artifactId>atguigu-hello-spring-boot-starter</artifactId>
            <version>1.0-SNAPSHOT</version>
</dependency>
@SpringBootTest(classes = MainApplication.class)
public class TestApplication {

    @Autowired
    HelloService helloService;
    @Test
    void test1(){
        String s=helloService.sayhello("coderhao");
        System.out.println(s);
    }
}

在这里插入图片描述
yaml里配置点东西再测:
在这里插入图片描述
在这里插入图片描述

9.4 springboot原理

9.4.1 启动过程

两步,创建SpringApplication,运行SpringApplication
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
还可以参考:
springboot启动原理
SPRINGBOOT启动流程及其原理
在这里插入图片描述
在这里插入图片描述

9.4.2 @SpringbootApplication注解如何将启动过程中需要的信息都联系起来的?

在这里插入图片描述

其中@EnableAutoConfiguration那条线组件的创建过程:在这里插入图片描述

9.4.3 springmvc处理请求原理

在这里插入图片描述

9.4.4 springboot中bean的生命周期

资料来自于Spring基本用法5——容器中Bean的生命周期
对于prototype作用域的Bean,Spring容器仅仅负责创建,当容器创建了Bena实例之后,Bean实例完全交给客户端代码管理,容器不再跟踪其生命周期。
对于singleton作用域的Bean,每次客户端代码请求时,都返回同一个贡献实例,客户端代码不能控制Bean的销毁,Spring容器负责跟踪Bean实例的产生、销毁。

我们将Spring容器中Bean的生命周期级别分为四级,分别是:Bean自身方法、Bean级生命周期接口方法、容器级生命周期接口方法、工厂后处理器接口方法。

  1. Bean自身的方法,包括:
    • Bean本身调用的方法
    • 通过配置文件中的init-method和destroy-method指定的方法;
  2. Bean级生命周期接口方法,包括:
    • InitializingBean接口
    • DiposableBean接口
    • BeanNameAware接口
    • ApplicationContextAware接口
    • BeanFactoryAware接口
    • 其他
  3. 容器级生命周期接口方法,包括:
    • InstantiationAwareBeanPostProcessor接口实现
    • BeanPostProcessor 接口实现
    • 一般称它们的实现类为“后处理器”
  4. 工厂级生命周期口方法(BeanFactoryPostProcessor接口的实现类)
    • AspectJWeavingEnabler
    • ConfigurationClassPostProcessor
    • CustomAutowireConfigurer等
    • 工厂后处理器也是容器级的。在应用上下文装配配置文件之后立即调用。

在这里插入图片描述

9.4.5 自定义事件监听组件

将9.4.1中黄色标注的接口实现,然后重写方法,再将MyApplicationRunner,MyCommandLineRunner加@component注解,因为这两个方法是在容器中找的。再在spring.factories里注册剩下3个类,运行看看。
在这里插入图片描述
实现runlistener的类要加个构造器,不然报错,至于为什么这样写,是因为实现这个接口的自带的类是这么写的:
在这里插入图片描述
在这里插入图片描述
可以观察调用顺序:在这里插入图片描述

nvidia-container-toolkit 国内镜像源安装 nvidia-container-toolkit 国内镜像源安装 阅读详情

相关推荐

Springboot计算机毕业设计校园树洞微信小程序【附源码】开题+论文+mysql+程序+部署

因此,开发一款专门针对校园用户的树洞微信小程序,为学生提供一个安全、私密、便捷的倾诉和交流平台,具有重要的现实意义和应用价值。通过本研究的实施,我们预期能够开发出一款功能全面、操作便捷的校园树洞微信小程序,为校园师生提供一个安全、私密、便捷的倾诉和交流平台。此外,通过不断优化和改进小程序的功能和服务,我们预期能够提升用户体验和满意度,推动校园树洞小程序的持续发展,并为校园生活的和谐与健康发展做出积极贡献。同时,通过不断优化小程序的功能和服务,提升用户体验和满意度,推动校园树洞小程序的广泛应用和持续发展。

光冯毕设程序 1666

SpringBoot核心笔记

一,配置文件 1.properties 同以前的properties用法 2.yaml ①简介: YAML是一个可读性高,用来表达数据序列的格式。非常适合用来做以数据为中心的配置文件 ②基本语法: key: value;kv之间有空格 大小写敏感 使用缩进表示层级关系 缩进不允许使用tab,只允许空格 缩进的空格数不重要,只要相同层级的元素左对齐即可 '#'表示注释 字符串无需加引号,如果要加,''与""表示字符串内容 会被 转义/不转义 ③数据类型: 字面量:单个的、不可再分的值.

weixin_62226325的博客 1354

RFSOC实战解析:MTS多片同步的时序校准与相位相干实现

本文深入解析了在RFSOC平台上实现MTS多片同步的关键技术与实战流程。文章从相位相干的重要性出发,详细阐述了SYSREF与SYNC信号的协同工作机制,并提供了从硬件时钟配置到软件API调用的完整MTS实现步骤。重点探讨了时序校准的核心方法,旨在帮助工程师解决多通道系统相位不一致的难题,确保ADC与DAC达到精确的相位相干,从而构建高性能的MIMO和相控阵系统。

weixin_29206669的博客 193

# 启用hiddenMethod过滤器 spring.mvc.hiddenmethod.filter.enabled=true的作用

https://blog.csdn.net/Arctan_/article/details/102957615

黄坤的博客 6383

Modscan32连接上了却没数据?一文拆解所有报错(从“Device NOT CONNECTED”到“Checksum Error”)

本文深入解析Modscan32连接异常问题,从状态栏报错到数据异常,提供系统化的诊断思路和解决方案。涵盖物理层问题、配置参数错位、端口占用冲突等常见故障,帮助工程师快速定位和解决Modbus通信中的各类错误。

weixin_30384217的博客 398

RseQC实战指南:从安装到RNA-Seq数据质控全流程解析

本文提供了一份详尽的RseQC实战指南,涵盖从安装配置到RNA-Seq数据质控的全流程。文章重点解析了RseQC作为专业质控工具的核心价值,手把手指导如何通过Conda或pip完成安装,并深入讲解了bam_stat.py、geneBody_coverage.py等关键模块的使用方法与结果解读技巧,帮助用户有效评估RNA完整性、文库构建质量及链特异性,确保下游分析的可靠性。

weixin_29200741的博客 202

Spring Boot学习笔记总结(四)

1. Web请求参数处理 Rest映射源码解析 1.1 OrderedHiddenHttpMethodFilter对象原理 1.2 表单提交要使用Rest的使用 1.3 Rest使用客户端工具发送不同类型的请求 1.4 如何改变默认的_method? 2. Web请求参数处理 请求映射原理 3. 请求处理常用的参数注解 3.1 SpringMvc常用的一些注解 3.2 SpringBoot的矩阵变量 和 UrlPathHelper类 4. 请求参数处理 类型参数的解析原理 4.1 找到合适的HandlerA

探索技术与实践的旅程,分享编程经验与工具使用心得,助力开发者提升技能。 2110

47、利用组策略配置 Windows 防火墙与 IPsec 全解析

本文深入解析了如何利用组策略配置Windows防火墙与IPsec,涵盖防火墙规则基础、IPsec身份验证与加密机制、服务器和域隔离实现方法、WFAS中新旧IPsec规则的区别与配置流程,并详细说明了防火墙属性与规则的优先级计算方式。同时介绍了证书服务、EFS等未详述的安全功能及相关学习资源,帮助管理员通过组策略有效提升网络安全性。

onion的博客 103

Spring Boot核心技术之Rest映射以及源码的分析

Title controller package com.xbhong.Controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; @RestController public class myContro { @RequestMapp...

weixin_45032957的博客 537

BART non-Cartesian 重建:并行成像 压缩感知

本文主要使用并行成像和压缩感知方法实现non-Cartesian MRI 数据的重建。

张哥频道:电生理信号和磁共振成像 1182

第4.4节:保护轴承与安全系统

飞轮储能系统的保护轴承是磁悬浮失效时的最后安全屏障,其设计需满足非干涉性、高可靠性和有限寿命承载原则。转子跌落过程包括自由下落、碰撞、进动和滑行减速等复杂非线性阶段,产生远超常规工况的冲击载荷。保护轴承需具备极限冲击容量、高温耐受性和抗卡死能力。系统采用多层级安全架构,结合故障诊断与健康管理,通过监测振动、电流等参数实现预测性维护。安全停机序列有序结合主动制动与被动摩擦制动,确保系统在极端工况下的安全。保护轴承类型多样,需根据系统规模与可靠性要求合理选择。

技术工作者 229

SpringBoot2核心技术详解

点击链接SpringBoot2核心技术详解 涉及到SpringBoot2的核心技术和响应式编程

hcyxsh的博客 206

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

springboot2核心技术文档

链接: springboot2核心技术文档.

小十木的博客 277

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

【SpringBoot】SpringBoot2核心技术-基础入门

一、参考资料 第一季:SpringBoot2核心技术-基础入门

后端研发工程师Marion的博客 248

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Springboot2核心技术

SpringBoot是整合Spring技术栈的一站式框架SpringBoot是简化Spring技术栈的快速开发脚手架当然springboot也有一些缺点:版本迭代快,需要时刻关注变化。封装太深,内部原理复杂,不容易精通James Lewis and Martin Fowler (2014) 提出微服务完整概念。

Qifen123321的博客 4万+

【SpringBoot】01 基础入门-SpringBoot2:从核心技术到响应式编程

本文全面介绍了SpringBoot2的核心技术与响应式编程应用。主要内容包括:SpringBoot2的基础入门、自动配置原理、核心功能模块(如web开发、数据访问、监控等)以及与其他技术的整合方案(如Docker、Redis等)。在响应式编程部分,重点分析了Webflux框架、R2DBC数据库访问、响应式安全等特性,并对比了传统与响应式开发的差异。文章还提供了源码地址和项目结构示例,帮助开发者实践应用。SpringBoot2通过简化配置和提供丰富功能,成为构建高性能Java应用的首选框架。

杰西笔记 6074

SpringBoot2核心技术

文章目录学习目标一、SpringBoot2核心技术,基础入门1、Spring与SpringBoot1.1 Spring可以做什么1.2 Sping的生态2、为什么要学习使用SpringBoot1、Spirng的优点2、Spirng的缺点3、背景3.1 微服务(2014年提出)3.2 分布式3.2 云原生(有点空洞暂时不做了解) 学习目标 熟悉使用SpringBoot进行快速构建并开发项目。 一、SpringBoot2核心技术,基础入门 学习要求: 熟悉Spring基础、熟悉Maven使用 环境要求:

VIP_1205169154的博客 1995

SpringBoot2核心技术基础入门

文章目录SpringBoot2核心技术基础入门一、环境要求二、HelloWord1、maven设置2、创建maven工程3、创建主程序4、编写业务5、测试6、简化配置7、简化部署三、了解自动装配原理1、springBoot依赖管理1.1 父项目做依赖管理1.2 开发导入starter场景启动器1.3 无需关注版本号,自动版本仲裁1.4 可以修改默认版本号2、自动装配3、容器功能3.1 @Configuration3.2 其他组件3.3 @Import3.4 @Conditional4、原生配置文件引入4.1

www?的博客 1851

SpringBoot2核心技术与响应式编程-核心技术基础入门

SpringBoot2核心技术与响应式编程 基于SpringBoot2.3与2.4版本 第一季:SpringBoot2核心技术-基础入门 学习要求 熟悉Spring基础 熟悉Maven使用 环境要求 Java8及以上 Maven 3.3及以上:https://docs.spring.io/spring-boot/docs/current/reference/html/getting-started.html#getting-started-system-requirements 学习资料 文档地址

qq_36595761的博客 774

尚硅谷SpringBoot2核心技术与响应式编程--语雀笔记地址

尚硅谷SpringBoot2核心技术与响应式编程--语雀笔记地址

瓦莉拉啦啦的博客 1795

探秘Spring Boot 2:从核心技术到实战应用

创建独立应用:Spring Boot 2 允许开发者轻松创建独立的 Spring 应用,无需繁琐的部署过程。以往在传统 Spring 框架中,开发的 Web 应用通常需要部署到外部的应用服务器(如 Tomcat、Jetty 等)中,需要手动将项目打包成 WAR 文件,然后部署到应用服务器,还要对服务器进行额外配置和管理。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 1553

SpringBoot2核心技术(基础入门)- 02、SpringBoot2入门【安装配置】

安装配置

一只菜鸟夹 681

java框架核心技术_[Java框架] Spring Boot 2.0深度实践之核心技术篇

第1章 系列总览总览 Spring Boot 2.0 深度实践系列课程的整体议程,包括 Spring Boot 三大核心特性(组件自动装配、嵌入式Web容器、生产准备特性)、Web 应用(传统 Servlet、Spring Web MVC、Spring WebFlux)、数据相关(JDBC、JPA、事务)、功能扩展(SpringApplication、Spring Boot 配置、Spring B...

weixin_35725862的博客 278

SpringBoot2核心技术-基础入门

SpringBoot2核心技术-基础入门## 标题 1.熟悉Spring 2.以及Maven的运用 发展趋势:## 标题 微服务: James Lewis and Martin Fowler (2014) 提出微服务完整概念。https://martinfowler.com/microservices/ 微服务是一种架构风格 一个应用拆分为一组小型服务 -每个服务运行在自己的进程内,也就是可独立部署和升级 服务之间使用轻量级HTTP交互 服务围绕业务功能拆分 可以由全自动部署机制独立部署 去中心化,服务

weixin_45094438的博客 209

SpringBoot2-核心技术(一)

yaml格式的配置文件在springboot中的使用,包括配置格式,如何表示对象、数组、map映射等基本使用,以及如何在配置编写yaml时的代码提示

qq_56056920的博客 1154
上一篇: springBoot2(1基础入门)
下一篇: SpringSecurity
anotherQu
博客等级 码龄6年 21粉丝 36原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值