《别看了,你学不会的》——Springboot入门与实践

Springboot概述

springboot并非是一个全新的框架,而是在spring之上封装了一层。使用springboot能够非常快速的搭建系统,并且springboot的自动配置大大简化了开发流程,springboot还提供了大量注解,使得开发非常方便

创建独立的spring应用

springboot就可以创建独立的spring应用,它比用原生的spring Framework开发的应用更简单,配置更少

内嵌web服务器

以前开发web应用,会把项目打包成war包,然后部署到外部Tomcat运行项目,现在直接运行jar包即可

提供可选的start依赖,简化构建配置

启动器start,可以引入该场景下所有的包依赖,并且多个jar包对应的版本也会选择好

自动配置spring以及第三方插件

以前开发spring项目,有很多常规配置需要配置,并且引入其他技术时,都需要手动配置。有了自动配置以后,就不需要自己配置,创建好springboot项目后,只需要关注业务代码,而不必把注意力集中在大量繁琐的配置上

提供生产级别的特性

springboot自带了生产级别的指标和运行状态检查,可以很方便的查看服务运行的最新状况。并且当我们需要修改某些配置的时候,也不需要直接在项目源码上进行修改了,可以通过外部化配置,就可以将修改生效

完全不需要代码生成,也不需要XML配置

springboot是整合spring生态圈技术栈的一站式框架,是简化spring技术栈道快速开发脚手架

通过IDEA脚手架创建springboot项目

在这里插入图片描述

springboot依赖管理

在这里插入图片描述

自动配置介绍

springboot所有的自动配置都在spring-boot-autoconfigure包里面
在这里插入图片描述

默认包扫描路径

主程序Application.java所在的包及其下面的子包都会默认被扫描
在这里插入图片描述
当然,也可以自定义包扫描路径
如果想要类被扫描到,可以使用注解

@SpringBootApplication(scanBasePackages = "com.yang")

或者是

@ComponentScan("com.yang")
springboot配置文件

springboot配置文件支持两种类型的文件properties文件yaml文件

两种文件的书写方式不同
  • application.properties

yang.real-name=xiaoming
yang.age=20
yang.sex=1
teacher.name=cangjingkong
teacher.age=30
teacher.sex=0

  • application.yaml
yang:
  real-name:xiaoming
  yage:20
  sex:1
  
teacher:
  name:cangjingkong
  age:30
  sex:0
常用注解
  • @Configuration
    定义配置类(Spring的配置是写在XML文件中,而springboot建议把配置写在配置类中)
  • @ComponentScan
    定义包扫描路径
  • @Bean
    默认方法名就说bean的id,返回类型就是方法返回的类型。也可以使用@Bean(“xiaoming”),指定bean的名称
  • @Import
    给容器中自动创建出注解中指定类型的组件,默认组件的名字就是全类名
  • @Conditional
    满足Conditional指定的条件时,才向IOC容器中注入组件
  • ImportResource
    指定对应的xml文件,Spring就可以把xml中配置的Bean都加载到IOC中,而不用一个个的手写@Bean
自动配置特征介绍
@SpringBootApplication 注解源码解析
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM,classes = TypeExcludeFilter.class),@Filter(type = FilterType.CUSTOM,classes = AutoConfigurationExcludeFilter.class)})
public @interface SpringBootApplication {
}
@SpringBootConfiguration
@Configuration // 标注某个类是配置类
@Indexed
public @interface SpringBootConfiguration {
}
@ComponentScan

扫描配置类的注解

@EnableAutoConfiguration
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
}
@AutoConfigurationPackage
static class Registrar implements ImportBeanDefinitionRegistrar, DeterminableImports {
		@Override
		public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {
			register(registry, new PackageImports(metadata).getPackageNames().toArray(new String[0]));
		}

		@Override
		public Set<Object> determineImports(AnnotationMetadata metadata) {
			return Collections.singleton(new PackageImports(metadata));
		}

	}

通过metadata获取到Application类,再调用getPackageNames()方法,获取到Application类所在的包,然后以PackageName作为注册bean的路径。
所以也就印证了主程序Application.java所在的包及其下面的子包都会默认被扫描到

@Import(AutoConfigurationImportSelector.class)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
LoadFactory加载的是spring.factories,通过传进来的factoryTypeName来确定加载的所有的jar包中,如果有路径是META-INFO,并且有spring.factories的所有内容的集合里面,再获取key是EnableAutoConfiguration的靠右侧的识别类
在这里插入图片描述

代码写死了解析路径为META-INF/spring.factories

在这里插入图片描述

针对所有引⼊的jar中,包含路径为META-INF/spring.factories⽂件,进⾏循环解析(⼀共循环3 次)

在这里插入图片描述

第一次:/spring-boot-2.5.1.jar!/META-INF/spring.factories
第二次:/spring-boot-autoconfigure-2.5.1.jar!/META-INF/spring.factories
第三次:/spring-beans-5.3.8.jar!/META-INF/spring.factories

真正缓存到cache里面是以classLoader作为key,result解析所有配置文件作为value

  • 自动配置按需加载原理
    • @ConditionalOnClass是红色,说明这个类不在classpath中,无法初始化这个类。随着xxxAutoConfiguration的初始化,那么其中的bean也会注入到IOC中。
      在这里插入图片描述
  • 容错兼容
    • 需要有这个类型的bean存在IOC中
    • 要求IOC中没有指定name名称的bean
    • 没有做任何处理就执行返回
    • 其实这里是指,我配置了IOC中的这个类,但是名称起错了,不过没关系,这里把bean的名称改过来,还是叫multipartResolver
      在这里插入图片描述
  • 用户配置优先,外部配置项修改组件行为
    • 默认用户配置在这里插入图片描述
  • 查看自动配置情况
    • 在配置文件中配置debug=true
springboot Web
静态资源访问

默认访问META-INF,public,resources,static,这4个文件夹

private static final String[] CLASSPATH_RESOURCE_LOCATIONS = {"classpath:/META-INF/resources/","classpath:/resources/", "classpath:/static/", "classpath:/public/" };

可以在配置文件中配置静态资源访问路径

spring:
  mvc:
    static-path-pattern: /static/**
  web:
    resources:
      static-locations: [classpath:/yang/]
静态资源配置原理解析

在这里插入图片描述

Rest风格

请求路径使用@RequestMapping或者@xxMapping

是否使用REST获取用户信息删除用户更新用户信息保存用户信息
/getUser/deleteUser/updateUser/saveUser
/user method=GET/user method=DELETE/user method=PUT/user method=POST

携带method的表单提交

# 开启hiddenMethod过滤
spring:
  mvc:
    hiddenmethod:
      filter:
        enabled: true
Spring MVC请求映射原理

在这里插入图片描述

Springboot启动流程
@SpringBootApplication
public class SpringbootDemoApplication {
    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(SpringbootDemoApplication.class, args);
        }

首先会进入run方法

    public static ConfigurableApplicationContext run(Class<?> primarySource, String... args) {
        return run(new Class[]{primarySource}, args);
    }

然后把所需要的设置初始化,调用run方法

public static ConfigurableApplicationContext run(Class<?>[] primarySources, String[] args) {
		return new SpringApplication(primarySources).run(args);
	}

初始化的内容
在这里插入图片描述
获取resourceLoader

getSpringFactoriesInstances是获取springfactories文件里面描述的类 的实例
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值