首页 > 其他分享 >SpringBoot原理

SpringBoot原理

时间:2023-12-21 16:46:43浏览次数:20  
标签:容器 依赖 SpringBoot Spring bean 原理 IOC

配置

  • SpringBoot中支持三种格式的配置文件

.properties

.yml

.yaml

虽然Springboot支持多种文件配置,但是通常在项目开发中,我们一般推荐使用yml文件配置

优先级

在SpringBoot项目中,常见的属性配置有5种,3种配置文件加上两种外部的配置,生效优先级

  • SrpingBoot配置优先级(低 -> 高):

1.application.yaml(忽略)

2.application.yml

3.application.properties

4.java系统属性(-Dxxx=xxx)

5.命令行参数(--xxx=xxx)

Bean管理

获取Bean

默认情况下,Springboot项目在启动的时候会自动创建IOC容器,并在创建好的bean对象存放在IOC容器当中,以供应用程序直接进行依赖注入

我们有三种方式可以从IOC容器中获取Bean

  • 根据name获取bean
  • 根据类型获取bean
  • 根据name获取bean(带类型转换)

我们要先拿到IOC容器对象,才能获取bean对象

我们直接将IOC容器对象注入进来就可以

测试类:

@SpringBootTest
class SpringbootWebConfig2ApplicationTests {

    @Autowired
    private ApplicationContext applicationContext; //IOC容器对象

    //获取bean对象
    @Test
    public void testGetBean(){
        //根据bean的名称获取
        DeptController bean1 = (DeptController) applicationContext.getBean("deptController");
        System.out.println(bean1);

        //根据bean的类型获取
        DeptController bean2 = applicationContext.getBean(DeptController.class);
        System.out.println(bean2);

        //根据bean的名称 及 类型获取
        DeptController bean3 = applicationContext.getBean("deptController", DeptController.class);
        System.out.println(bean3);
    }
}

测试类输出后的bean对象地址值是一样的,这说明IOC容器中的bean对象只有一个

Bean作用域

在IOC容器中,默认bean对象是单例模式,也就是上面案例输出的bean对象地址值相同,即容器中同名称的bean只有一个实例

在Spring中支持五种作用域,后三种在Web环境中才生效

作用域 说明
singleton 容器内同名称的bean只有一个实例(单例)(默认)
prototype 每次使用该bean时会创建新的实例(非单例)
request 每个请求范围内会创建新的实例(web环境中,了解)
session 每个会话范围内会创建新的实例(web环境中,了解)
application 每个应用范围内会创建新的实例(web环境中,了解)

在IOC容器中默认是单例模式,我们可以通过Spring中的@Scope注解来进行配置作用域

@Scope("prototype")

IOC容器中的bean在容器启动时被创建,可以使用@Lazy注解来延迟初始化(延迟到第一次使用时)

第三方Bean

我们在项目中自己定义的类,如果我们要声明这些bean,我们只需要在类上加上@Component以及它的三个衍生注解@Controller,@Service,@Repository.就可以来声明这个bean对象

但是如果在项目开发中,有类不是我们自己编写的,而是我们引入的第三方依赖当中提供的。

当我们需要使用其他类时,我们无法在第三方类上添加@Component注解或衍生注解,那么如何定义第三方的bean呢,我们就需要用到@Bean注解

列如我们要使用SAXReader的方法我们只需要在启动类上添加@Bean标识的方法就可以了

  • 在启动类上添加@Bean标识的方法
@SpringBootApplication
public class SpringbootWebConfig2Application {

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

    //声明第三方bean
    @Bean //将当前方法的返回值对象交给IOC容器管理, 成为IOC容器bean
    public SAXReader saxReader(){
        return new SAXReader();
    }
}

xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<emp>
    <name>Tom</name>
    <age>18</age>
</emp>

测试类:

@SpringBootTest
class SpringbootWebConfig2ApplicationTests {

    @Autowired
    private SAXReader saxReader;

    //第三方bean的管理
    @Test
    public void testThirdBean() throws Exception {
        Document document = saxReader.read(this.getClass().getClassLoader().getResource("1.xml"));
        Element rootElement = document.getRootElement();
        String name = rootElement.element("name").getText();
        String age = rootElement.element("age").getText();

        System.out.println(name + " : " + age);
    }

    //省略其他代码...
}

重启SpringBoot服务,执行测试方法后,控制台输出日志:

Tom : 18

注意:在项目中我们自己定义的类,我们想要把这些类交给IOC容器管理,我们可以直接使用@Component或者衍生注解来声明就可以,

如果这个类不是我们自己定义的,而是引入的第三方依赖当中提供的类,我们想把这个类交给IOC容器管理,此时我们就需要在配置类中定义一个方法,在方法上加上一个@Bean注解

SpringBoot原理

前言

我们接下来来刨析一下SpringBoot的底层原理,因为SpringBoot能够是我们更加简单的进行业务能力的开发,不必过多的关注框架本身的配置使用。

Spring是世界上最流行Java框架,他可以帮助我们更加快速的,更加容易的构建Java项目。在Spring家族中有很多的优秀的框架,而所有的框架都是基于一个基础框架的SpringFramework。

由于Spring框架直接进行项目开发,会比较繁琐

  • 在pom.xml中依赖配置比较繁琐,在项目开发时,需要自己去找到对应的依赖,还需要找到依赖它所配套的依赖以及对应版本,否则就会出现版本冲突问题。
  • 在使用Spring框架进行项目开发时,需要在Spring的配置文件中做大量的配置,这就造成Spring框架入门难度较大,学习成本较高。

所以我们在Spring框架4.0版本之后,又推出了一个全新的框架SpringBoot,我们可以通过SpringBoot来简化Spring框架的开发,直接基于SpringBoot来构建Java项目

为什么要使用SpringBoot来构建开发呢?

主要有两个特别重要的功能

  1. 起步依赖
  2. 自动配置

起步依赖

我们没有使用SpringBoot,用的是Spring框架进行web程序的开发,此时我们就需要引入web程序开发所需要的一些依赖。

spring-webmvc依赖:这是Spring框架进行web程序开发所需要的依赖

servlet-api依赖:Servlet基础依赖

jackson-databind依赖:JSON处理工具包

如果要使用AOP,还需要引入aop依赖、aspect依赖

项目中所引入的这些依赖,还需要保证版本匹配,否则就可能会出现版本冲突问题。

如果我们使用SpringBoot,就只需要引入一个依赖就可以了,这就是Web开发的起步依赖:springboot-starter-web

原理是 Maven的依赖传递

在起步依赖中以提供了当前程序开发所需要的所有常见依赖,只需要引入这一个依赖,其他依赖就会自动的通过Maven的依赖传递进来

自动配置

自动配置就是当Spring容器启动后,一些配置类,bean对象就自动存入IOC容器中。不需要手动声明,简化操作。

SpringBoot项目在启动时通过自动配置完成了bean对象的创建。

在启动类中,有一个注解@SpringBootApplication,点进注解,有三个注解是比较重要的。

  • @SpringBootConfiguration:进去这个注解我们可以发现底层是Configuaration注解,也就是支持JavaConfig的方式来进行配置(使用Configuration配置类等同于XML文件)

  • @EnableAutoConfiguration:开启自动配置功能

  • @ComponentScan:扫描注解,默认是扫描当前类下的package。将

    `@Controller/@Service/@Component/@Reposito

    ry`等注解加载到IOC容器中

“约定大于配置”,在SpringBoot中是怎么做的呢,其实靠的就是@EnableAutoConfiguration,简单来说,这个注解可以帮助我们自动载入应用程序所需要的所有默认配置,点进去我们会发现

  • @AutoConfigurationPackage:自动配置包
  • @Import:给IOC容器导入组件

我们再进入@AutoConfigurationPackage

可以发现,依靠的还是@Import注解,再点进去查看,我们发现重要的就是以下的代码:

@Override
public void registerBeanDefinitions(AnnotationMetadata metadata,
        BeanDefinitionRegistry registry) {
    register(registry, new PackageImport(metadata).getPackageName());
}

默认的情况下就是将:主配置类(@SpringBootApplication)的所在包及其子包里边的组件扫描到Spring容器中。

我们回到@Import(AutoConfigurationImportSelector.class)这句代码上,再点进去AutoConfigurationImportSelector.class

  • FACTORIES_RESOURCE_LOCATION的值是META-INF/spring.factories

  • Spring启动的时候会扫描所有jar路径下的META-INF/spring.factories,将其文件包装成Properties对象

  • 从Properties对象获取到key值为EnableAutoConfiguration的数据,然后添加到容器里边。

    其中@EnableAutoConfiguration是关键(启用自动配置),内部实际上就去加载META-INF/spring.factories文件的信息,然后筛选出以EnableAutoConfiguration为key的数据,加载到IOC容器中,实现自动配置功能!

标签:容器,依赖,SpringBoot,Spring,bean,原理,IOC
From: https://www.cnblogs.com/yifan0820/p/17919388.html

相关文章

  • 【汽车科普】汽车构造与原理 5.传动装置
    汇总【汽车科普】汽车构造与原理更白话科普式的变速箱介绍:【汽车科普】汽车变速箱与MT、AT、AMT、CVT、DCT目录1.引言跳转到目录TBD......
  • POE工业交换机的原理和工作方式是什么?
    POE工业交换机是现代工业网络通信中不可或缺的一部分。该工业级交换机的完整名称是“PoweroverEthernet(以太网供电)”,其主要特点是能够通过网络连接线同时传输数据和电力。在这篇文章中,我们将详细讨论一下POE工业交换机的原理和工作方式。工作原理POE工业交换机的工作原理主要借助电......
  • 《Java架构师的第一性原理》31分布式计算之微服务RPC(Dubbo)
    1 互联网架构,究竟为啥要做服务化互联网架构,究竟为啥要做服务化?2 微服务架构,多“微”才合适?微服务架构,多“微”才合适? 3 离不开的微服务架构,脱不开的RPC细节离不开的微服务架构,脱不开的RPC细节3.1服务化解决的问题1)服务化需要解决的问题:一套序列化、反序列化、网络框......
  • 《Java架构师的第一性原理》30分布式计算之分布式算法
    极客时间 韩健 121.分布式协议与算法实战00 开篇词|想成为分布式高手?那就先把协议和算法烂熟于心吧为什么要单独讲分布式协议和算法呢?在我看来,它其实就是决定分布式系统如何运行的核心规则和关键步骤。如果一个人想真正搞懂分布式技术,开发出一个分布式系统,最先需要掌握的......
  • 《Java架构师的第一性原理》32分布式计算之分布式缓存第3篇LevelDB
    互联网业务,绝大部分场景,会使用缓存服务。但有时候,确实会使用到进程内存缓存/数据库,这个时候,LevelDB就能派上用场了。啥是LevelDB?LevelDB是Google开发的,一个速度非常块的KV存储库(storagelibrary),它支持字符串的key与字符串的value,并且这种映射关系按key排序(orderedmapping)。L......
  • 《Java架构师的第一性原理》32分布式计算之分布式缓存第1篇如何使用Redis搭建玩家排行
    今天我们用Redis搭建一个玩家的排行榜,假设一个服务器存储了10万名玩家的数据,我们想给这个区(这台服务器)上的玩家做个全区的排名,该如何用Redis实现呢?不妨一起来思考下面几个问题:MySQL是如何实现玩家排行榜的?有哪些难题需要解决?如何用Redis模拟10万名玩家数据?Redis里......
  • 《Java架构师的第一性原理》33分布式计算之分布式注册中心、分布式配置中心
    待补充1分布式注册中心2分布式配置中心2.1Apollo2.1.1Apollo是怎样注入到SpringBean的容器里的   99直接读这些牛人的原文apollo不使用MQ如何实现pub/sub场景?13张图彻底搞懂分布式系统服务注册与发现原理为什么@Value可以获取配置中心的值?Spring8:一些......
  • 《Java架构师的第一性原理》32分布式计算之分布式锁(Redis、Zookeeper)
    1 这才是真正的分布式锁技术领域,我觉得了解来龙去脉,了解本质原理,比用什么工具实现更重要:(1)进程多线程如何互斥?(2)一个手机上两个APP访问一个文件如何互斥?(3)分布式环境下多个服务访问一个资源如何互斥?归根结底,是利用一个互斥才能访问的公共资源来实现分布式锁,具体这个公共资源是r......
  • SpringBoot集成Memcached实现高效缓存
    一、前言Memcached是一款高性能的分布式内存对象缓存系统,可以用来缓存SQL查询结果、API调试结果等。使用Memcached可以减少对数据库的查询次数,提高系统性能。它主要用于减轻数据库负载,提供应用系统,减少数据库压力。SpringBoot可以快速集成Memcached实现对缓存到读写操作。二、安装......
  • SpringBoot整合Dubbo常用注解类说明
    SpringBoot与Dubbo的整合pom依赖:<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.spr......