自学内容网 自学内容网

SpringBoot是如何简化Spring开发的,以及SpringBoot的特性以及源码分析

目录

1.什么是springboot

2.配置文件的优先级

2.1  配置文件的优先级

2.2  系统配置以及命令行配置

3.Bean对象的管理

3.1  如何获取对应的bean对象

3.2  bean的作用域

3.3  声明第三方bean

@Component 及衍生注解 与 @Bean注解使用场景?

如何查看项目已有的bean对象?

4.SpringBoot原理

4.1  起步依赖

4.2  自动配置

如何将第三方依赖引入项目?

自动配置的原理,源码分析?

如何自定义starter?


一张图让你认识SSM对应的技术,Springboot简化Spring框架的开发

1.什么是springboot

Spring Boot 是一个开源的 Java 开发框架,它简化了基于 Spring 框架的应用程序的创建和部署过程。Spring Boot 构建于经典的 Spring Framework 之上,并提供了诸多开箱即用的特性,使得开发者可以更快速地创建独立的、生产级别的 Spring 应用程序。

具体来说,Spring Boot 提供了以下几个主要特点和优势:

  1. 简化配置:Spring Boot 采用约定大于配置的理念,通过自动配置(auto-configuration)来减少开发者对应用程序配置的需求。它通过分析 classpath、配置文件、注解等,自动配置 Spring 应用所需的组件。

  2. 内嵌容器:Spring Boot 内置了多种常用的 HTTP 容器(如Tomcat、Jetty),开发者可以将应用打包成一个独立的 JAR 文件,直接运行在这些内嵌容器中,无需外部部署。

  3. 起步依赖:Spring Boot 提供了一系列的“起步依赖”(Starter Dependencies),这些依赖项封装了常用的库和框架,简化了项目的依赖管理和配置。

  4. 自动化的管理:Spring Boot 提供了丰富的 Actuator 组件,可以实现应用的监控、度量和管理,例如健康检查、审计、配置查看等功能。

  5. 生态系统:Spring Boot 集成了大量的第三方库和插件,支持与各种数据库、消息队列、缓存等技术的集成,使得开发者可以轻松构建复杂的企业级应用。

总之,Spring Boot 通过简化开发流程、提升生产效率和降低学习门槛,成为了现代 Java 应用开发的首选框架之一。

2.配置文件的优先级

2.1  配置文件的优先级

如果一个springboot项目同时写了以上三个配置文件

优先级:properties > yml > yaml

注意:虽然springboot支持多种格式配置文件,但是在项目开发时,推荐统一使用一种格式的配置 (yml是主流)。

2.2  系统配置以及命令行配置

SpringBoot 除了支持配置文件属性配置,还支持Java系统属性和命令行参数的方式进行属性配置。

优先级:命令行参数  >  java系统属性  >  配置文件

但是一般系统属性和命令行参数是项目被打包(jar包)时,运行指定的

注意:Springboot项目进行打包时,需要引入插件 spring-boot-maven-plugin (基于官网骨架创建项目,会自动添加该插件)

3.Bean对象的管理

控制反转(Inversion of Control,IoC)和依赖注入(Dependency Injection,DI)是面向对象编程中重要的设计原则和模式,特别在Spring框架中广泛应用。

  1. 控制反转(IoC)

    • IoC 是一种软件设计原则,它反转了传统的程序设计流程。传统情况下,程序员需要在代码中显式地创建对象并管理它们的依赖关系。而IoC容器则负责管理应用程序中对象的生命周期及其依赖关系。
    • 在IoC容器中,对象的创建和依赖关系的管理被容器托管,而不是由对象自己来完成。这种控制权的反转使得程序更加灵活,解耦了组件之间的依赖关系。
  2. 依赖注入(DI)

    • DI 是实现IoC的一种方式。它是指在创建对象时,将对象所依赖的其他对象(依赖)传递给它,而不是对象自己创建或查找依赖对象。
    • 依赖注入可以通过构造函数注入、属性注入或者接口注入等方式实现。Spring框架通常使用构造函数或者属性注入的方式来实现依赖注入,以确保对象在被创建时能够获得所需的依赖对象。

在Spring框架中,控制反转和依赖注入的结合使用使得开发者能够更加专注于业务逻辑的实现,而不必关注对象的创建和依赖关系的管理,从而提高了代码的可维护性和可测试性。

类上添加什么注解就可以交给IOC管理呢?

@Component

  • 这是最基本的注解,用于将一个类标记为 Spring 容器中的一个组件。被标记为 @Component 的类会被自动检测并注册到 Spring 容器中,成为一个 Bean。

@Repository

  • @Repository 注解是 @Component 的一个特化,用于标识数据访问层的组件。它不仅将类标记为 Spring Bean,还提供了额外的功能,比如异常转换。

@Service

  • @Service 注解也是 @Component 的一个特化,用于标识服务层的组件。它用于标记业务逻辑层的类,并且可以与事务管理等功能结合使用。

@Controller

  • @Controller 注解用于标识控制器层的组件,它通常用于 Spring MVC 中的控制器类。被标记为 @Controller 的类会作为请求处理器,并能够将请求映射到相应的处理方法。

@RestController

  • @RestController 是 @Controller 和 @ResponseBody 的组合注解,用于定义 RESTful API 的控制器。它自动将方法的返回值转为 JSON 或 XML 格式的响应体。

方法如何交给IOC容器管理呢?

只需整一个配置类@Configuration,然后在其方法中加上@Bean注解

3.1  如何获取对应的bean对象

Bean对象如果没有自定义名称,默认就是类名的小驼峰式

默认情况下,Spring项目启动时,会把bean都创建好放在IOC容器中,如果想要主动获取这些bean,可以通过如下方式:

  • 根据name获取bean:Object getBean(String name)
  • 根据类型获取bean:<T> T getBean(Class<T> requiredType)
  • 根据name获取bean(带类型转换):<T> T getBean(String name, Class<T> requiredType)

注意:上述所说的 【Spring项目启动时,会把其中的bean都创建好】还会受到作用域及延迟初始化影响,这里主要针对于 默认的单例非延迟加载的bean而言。

上述得到的是同一个bean对象,默认也是一个bean对象



3.2  bean的作用域

bean的作用域可以让bean对象实现单例和非单例

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

注意:

  • 默认singleton的bean,在容器启动时被创建,可以使用@Lazy注解来延迟初始化(延迟到第一次使用时)。
  • prototype的bean,每一次使用该bean的时候都会创建一个新的实例。
  • 实际开发当中,绝大部分的Bean是单例的,也就是说绝大部分Bean不需要配置scope属性。

3.3  声明第三方bean

一般第三方的bean是只读不可写,因此你不能在类上加注解

这就需要通过@Bean方法注解来创建对象并且交给IOC容器来管理

这样也可以实现,然后用@Autowired注入就可以使用这个对象了

@Component 及衍生注解 与 @Bean注解使用场景?

  • 项目中自定义的,使用@Component及其衍生注解
  • 项目中引入第三方的,使用@Bean注解,因为第三方源码不给添加注解

如何查看项目已有的bean对象?

4.SpringBoot原理

4.1  起步依赖

如果基于Spring框架开发,我们引入java-web依赖需要以下四个依赖,

而且这四个依赖之间的版本要互相兼容,不然就会出现版本异常

而我们用springboot项目时,只需要引入java-web这一个起步依赖,起步依赖

还包含其他可能需要依赖的依赖,也就是maven的依赖传递

4.2  自动配置

SpringBoot的自动配置就是当Spring容器启动后,一些配置类、bean对象就自动存入到IOC容器中,不需要我们手动去声明,从而简化了开发,省去了繁琐的配置操作。

举例:

我们并没有引入gson对应的maven依赖,但是springboot会自动帮我们配置相关的bean对象

因此这就是springboot的自动配置.

如何将第三方依赖引入项目?

把第三方依赖引入maven之后会发现,运行时项目并没有对应的第三方依赖的bean对象,

原因是springboot项目,默认扫描的是启动类的包及其子包

解决方案:

方案一:在启动类上加@ComponentScan 组件扫描

@ComponentScan({"com.example","com.itheima","com.alibaba","com.google","org.springframework","org.mybatis",...})

@SpringBootApplication

public class SpringbootWebConfig2Application { }

这种方法有点繁琐

方案二:@Import 导入。使用@Import导入的类会被Spring加载到IOC容器中,导入形式主要有以下几种:

  • 导入 普通类(也就是不需要加任何注解)
  • 导入 配置类(就是@Configuration的注解类)
  • 导入 ImportSelector 接口实现类(该类实现了ImportSelector接口)

案例:

上面两种方案都需要我们一个一个去手动引入,一般第三方会提供一个@EnableXxxx注解,

封装所有的@Import注解,因此我们只需要引入对应的@EnableXxxx注解即可

自动配置的原理,源码分析?

@SpringBootApplication启动类注解的作用?

该注解标识在SpringBoot工程引导类上,是SpringBoot中最最最重要的注解。该注解由三个部分组成:  

  • @SpringBootConfiguration:该注解与 @Configuration 注解作用相同,用来声明当前也是一个配置类。  
  • @ComponentScan:组件扫描,默认扫描当前引导类所在包及其子包。
  • @EnableAutoConfiguration:SpringBoot实现自动化配置的核心注解。底层封装了@Import({AutoConfigurationImportSelector.class})注解

追@Import({AutoConfigurationImportSelector.class})注解源码发现,当springboot项目启动时,

就会去加载以下的文件

也就是

文件里面就定义了一系列需要的自动配置

是不是这些bean对象在springboot项目启动就一定会被创建呢?

答案:并不是,创建时机可以通过一系列@ConditionalXxx注解进行控制

@ConditionXxx注解

作用:按照一定的条件进行判断,在满足给定条件后才会注册对应的bean对象到Spring IOC容器中。  

位置:方法、类  @Conditional 本身是一个父注解,派生出大量的子注解:

  •  @ConditionalOnClass:判断环境中是否有对应字节码文件,才注册bean到IOC容器。  
  • @ConditionalOnMissingBean:判断环境中没有对应的bean(类型 或 名称) ,才注册bean到IOC容器。  
  • @ConditionalOnProperty:判断配置文件中有对应属性和值,才注册bean到IOC容器。

案例:

@Bean
@ConditionalOnClass(name = "io.jsonwebtoken.Jwts") //当前环境存在指定的这个类时,才声明该
bean public HeaderParser headerParser(){...}
@Bean
@ConditionalOnMissingBean //当不存在当前类型(HeaderParser)的bean时,才声明该bean 
public HeaderParser headerParser(){...}

@Bean
@ConditionalOnProperty(name = "name",havingValue = "itheima") //配置文件中存在对应的属性和值,才注册bean到IOC容器。
public HeaderParser headerParser(){...}

如何自定义starter?

使用场景:

在实际开发中,经常会定义一些公共组件,提供给各个项目团队使用。而在SpringBoot的项目中,一般会将这些公共组件封装为SpringBoot 的 starter。

编辑好对应的autoconfigure和starter之后,我们在项目中只需要引入其起步依赖,因为autoconfigure会被作为starter的依赖传递,传递下去

需求:

自定义aliyun-oss-spring-boot-starter,完成阿里云OSS操作工具类 AliyunOSSUtils 的自动配置。 目标:引入起步依赖引入之后,要想使用阿里云OSS,注入 AliyunOSSUtils直接使用即可。

(这里实现直接使用,就需要把类上的@Component注解,想办法变成不用组件扫描就可以直接使用的方案,也就是@Configuration中定义@Bean方法,自动生成对应的bean对象放到IOC容器中)

实现:

创建 aliyun-oss-spring-boot-starter 模块

创建 aliyun-oss-spring-boot-autoconfigure  模块

1.aliyun-oss-spring-boot-starter 模块

需要引入autoconfigure  模块

2.aliyun-oss-spring-boot-autoconfigure  模块

引入第三方依赖

还需要写需要自动配置的类到springboot会去扫描的文件上

配置完成之后,其他项目需要用到该依赖,只需要引入该起步依赖即可使用


原文地址:https://blog.csdn.net/2301_77358195/article/details/140545663

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!