微服务springboot详细解析(一)

目录

1.Spring概述

2.什么是SpringBoot?

3.第一个SpringBoot程序

4.配置参数优先级

5.springboot自动装配原理

6.@SpringBootApplication&SpringApplication.run

[7.@ConfigurationProperties(prefix = "")](#7.@ConfigurationProperties(prefix = ""))

8.@Validated数据校验


29、聊聊该如何写一个网站_哔哩哔哩_bilibili

学习路线:【狂神说Java】SpringBoot最新教程IDEA版通俗易懂_哔哩哔哩_bilibili

1.Spring概述

Spring是一个开源框架,2003 年兴起的一个轻量级的Java 开发框架

目的:Spring是为了解决企业级应用开发的复杂性而创建的,简化开发

那么Spring是如何简化Java开发的?为了降低Java开发的复杂性,Spring采用了以下4种关键策略:

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

2.什么是SpringBoot?

学过javaweb的就知道,开发一个web应用,从最初开始接触Servlet结合Tomcat,在前端跑出一个Hello Wolrld程序,是要经历特别多的步骤;后来就用了框架Struts,再后来是SpringMVC,到了现在的SpringBoot,过一两年又会有其他web框架出现;什么是SpringBoot呢,就是一个javaweb的开发框架而已,和SpringMVC类似,对比其他javaweb框架的好处,官方说是简化开发,约定大于配置(核心思想,越是简化的东西越是有规定,比如文件夹的上下位置、命名都是有规定的),you can"just run",能迅速的开发web应用,几行代码开发一个http接口即可。

所有的技术框架的发展似乎都遵循了一条主线规律:从一个复杂应用场景衍生一种规范框架,人们只需要进行各种配置而不需要自己去实现它,这时候强大的配置功能成了优点;发展到一定程度之后,人们根据实际生产应用情况,选取其中实用功能和设计精华,重构出一些轻量级的框架;之后为了提高开发效率,嫌弃原先的各类配置过于麻烦,于是开始提倡"约定大于配置",进而衍生出一些一站式的解决方案。

约定大于配置场景:maven、spring、springmvc、springboot、docker...

程序猿的程序 = 数据结构 + 算法(集合框架map、list)

码农的程序 = 面向对象 + 框架

3.第一个SpringBoot程序

看懂pom.xml文件:4、第一个springboot程序_哔哩哔哩_bilibili

在前端发出hello请求

若想要实现热部署,在创建项目时勾选DevTools即可

4.配置参数优先级

此外,如果你在相同优先级位置同时有application.propertiesapplication.yml,那么application.properties里的属性里面的属性就会覆盖application.yml

微服务 SpringBoot 2.0(二):配置文件解析 - 简书

5.springboot自动装配原理

如果面试的时候问到springboot,谈谈理解,能聊的有自动装配和run()方法,在下面视频10min处7、了解下主启动类怎么运行_哔哩哔哩_bilibili

狂神说SpringBoot02:运行原理初探 - 遇见狂神说 - 博客园

6.@SpringBootApplication&SpringApplication.run

首先我们来看一段启动代码:

java 复制代码
@SpringBootApplication
public class DemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

从上面代码来看,@SpringBootApplicationSpringApplication.run长得很相似,但是前者是一个注解,后者是一个SpringApplication类的静态方法,首先我们来看@SpringBootApplication

java 复制代码
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
    excludeFilters = {@Filter(
    type = FilterType.CUSTOM,
    classes = {TypeExcludeFilter.class}
), @Filter(
    type = FilterType.CUSTOM,
    classes = {AutoConfigurationExcludeFilter.class}
)}
)
public @interface SpringBootApplication {
...
}

首先我们来分析@SpringBootConfiguration,在此之前我们要知道@Configuration(它与@Bean是一套的,一个是配置类一个是组件),任何一个标注了@Configuration的Java类定义都是一个JavaConfig配置类,凡是经过该注解修饰的,均被实例化到Spring应用程序上下文中,由spring统一管理生命周期,也就是IOC

至于第二部分SpringApplication.run,分析该方法主要分两部分,一是SpringApplication实例化,二是run方法的执行,请看以下流程图:

最主要的功能在我看来有两个:

  1. 推断应用的类型是普通的项目还是Web项目
  2. 推断并设置main方法的定义类,找到运行的主类(这也就是为什么run方法要传入启动类的字节码文件)

微服务 SpringBoot 2.0(三):启动剖析之@SpringBootApplication - 简书

微服务 SpringBoot 2.0(四):启动剖析之SpringApplication.run - 简书

7.@ConfigurationProperties(prefix = "")

如下所示在application.yml中给person配置属性

java 复制代码
person:
  id: 12345
  name: tianming
  age: 18

然后实现实体类与配置类绑定,Person就有值了(或者@Value一个一个绑定)

java 复制代码
@Data
@AllArgsConstructor
@NoArgsConstructor
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
    private int id;
    private String name;
    private int age;
}

8.@Validated数据校验

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

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

    @Email(message="邮箱格式错误") //name必须是邮箱格式
    private String name;
}

常见参数如下所示:

java 复制代码
@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 对象是否符合正则表达式的规则

.......等等
除此以外,我们还可以自定义一些数据校验规则
相关推荐
伏游6 分钟前
【BUG】生产环境死锁问题定位排查解决全过程
服务器·数据库·spring boot·后端·postgresql·bug
此木|西贝18 分钟前
【设计模式】模板方法模式
java·设计模式·模板方法模式
wapicn9927 分钟前
手机归属地查询Api接口,数据准确可靠
java·python·智能手机·php
hycccccch1 小时前
Springcache+xxljob实现定时刷新缓存
java·后端·spring·缓存
爱的叹息1 小时前
SpringBoot集成Redis 灵活使用 TypedTuple 和 DefaultTypedTuple 实现 Redis ZSet 的复杂操作
spring boot·redis·bootstrap
wisdom_zhe1 小时前
Spring Boot 日志 配置 SLF4J 和 Logback
java·spring boot·logback
揣晓丹1 小时前
JAVA实战开源项目:校园失物招领系统(Vue+SpringBoot) 附源码
java·开发语言·vue.js·spring boot·开源
你的人类朋友1 小时前
MQTT协议是用来做什么的?此协议常用的概念有哪些?
javascript·后端·node.js
于过1 小时前
Spring注解编程模型
java·后端
北随琛烬入1 小时前
Spark(10)配置Hadoop集群-集群配置
java·hadoop·spark