SpringBoot学习笔记

前言:

这篇文章主要介绍一下SpringBoot的主要特性:起步依赖、自动配置等。跟着黑马的课来边看边学并做了一些笔记,刚好记录在博客上。

学习收获:

SpringBoot概述:

SpringBoot是Spring提供的一个子项目,用于快速构建Spring应用程序。其设计目的就是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式进行配置,从而使开发人员不需要定义额外的配置。

  • Spring Framework:是核心,提供依赖注入、消息转递等核心支持,是整个Spring体系的基础。
  • Spring Data:为数据访问提供统一方式,涵盖关系型、非关系型数据库等多种数据源,方便进行数据操作
  • Spring AMQP:将Spring的核心概念应用于基于AMQP协议的消息系统开发,用以消息传递场景。
  • Spring Security:为应用提供认证和授权支持,保障应用安全,防止非法访问。
  • Spring Cloud:提供一系列工具,用于构建分布式系统中常见的模式,方便搭建和部署微服务。
  • Spring Boot:采用约定优先于配置的理念,能够快速构建Spring应用,简化项目搭建过程,加速项目启动和运行。

起步依赖:

本质上就是一个Maven坐标,整合了完成一个功能所需要的所有坐标。以往开发需要手动选择、配置不同的库和依赖项,还要关注版本的兼容性。而起步依赖针对常见使用场景,提供了预定义好的依赖集合。开发者只需要引入特定的起步依赖,就能获取该功能场景下的所有库。

 自动配置:

遵循约定大于配置的原则,在boot程序启动后,一些bean对象就会被自动注入到IOC容器中,不需要手动声明,简化开发。能够依据类路径中的依赖、定义Bean等因素,自动为开发者配置必要的Bean。比如引入spring-boot-starter-web依赖,会自动配置Tocat服务器等Web开发组件。解决了配置繁琐的问题,快速构建Spring程序。

其他特性:

  • 内嵌的Tomcat、Jetty(无需部署WAR文件)

支持内嵌 Tomcat、Jetty、Undertow 等 Servlet 容器,应用无需打包成 war 包,可直接以可执行 jar 文件部署运行 。

  • 外部化配置

外部化配置就是说如果你的工程部署完毕,有一些配置需要修改,只用在外部配置文件修改,不需要重新的编译打包部署。

  • 不需要XML配置

借助application.properties或application.yml文件集中管理配置,而无需XML配置。

SpringBoot工程创建:

  • 创建Maven工程
  • 导入spring-boot-stater-web起步依赖

  • 编写Controller

  • 提供启动类

配置文件:

SpringBoot提供了多种属性配置方式,分别有以.properties为后缀和以.yml.yaml为后缀的两种方式。

  • application.properties:

 格式为key=value,列如:server.port=8080。

  • application.yml / application.yaml:

 以.yml或.yaml为后缀,采用缩进方式表示层级关系,数据格式更加简洁易读,所以我们一般都会用.yml格式来书写我们的配置文件。

书写格式:

值前面必须有空格,作为分隔符。

使用空格作为缩进表示层级关系,相同的层级左侧对齐。

在SpringBoot应用中,我们有两种方式来使用我们的配置文件。

  • 在代码中注入配置属性

使用@Value注解将配置文件中的属性注入到Bean中。

  • 使用@ConfigurationProperties注解绑定配置属性 

定义一个Java类,使用@ConfigurationProperties注解将配置文件中的属性绑定到该类的属性上。

 Bean注册:

  • 使用@Component以及其派生注解

通过上述四个注解,来去声明bean。然后通过SpringBoot的启动类 的@SpringBootApplication注解的子注解@ComponentScan来启动组件扫面来扫描启动类所在的包及其子包。

  •  使用@Configuration注解和@Bean注解

如果要注册的bean对象来自于第三方(不是自定义的),或者对一些复杂的、非自定义的Bean进行配置时,是无法用@Component及其衍生注解声明bean的。

所以如果要注册第三方bean,建议我们在配置类中集中注册。一般来说,我们会在启动类所在的子包下,创建一个配置类。用@Configuration来标记一个类为配置类,相当于传统的XML配置文件。用@Bean在配置类中定义Bean,方法返回值会被注册为Bean。

@Configuration
public class AppConfig {
    @Bean
    public DataSource dataSource() {
        
        //返回这个Bean
        return DataSourceBuilder.create()
            .url("jdbc:mysql://localhost:3306/mydb")
            .username("root")
            .password("password")
            .build();
    }
}
  • 使用@Import注解

用于在一个配置类中引入其他配置类或组件,来实现Bean的注册和配置的模块化。

1.直接导入其他配置类的Bean定义。

假设我们有两个配置类,可以在第二个配置类上通过@Import注解来直接导入第一个配置类中的Bean。或者说如果配置类不在启动类的子包下,则也需要用@Import来导入这个配置类的字节码文件,然后会吧这个类中所有用Bean注解的对象添加到IOC容器中。@Import(要导入类的字节码文件)

// DatabaseConfig.java
@Configuration
public class DatabaseConfig {
    @Bean
    public DataSource dataSource() {
        return DataSourceBuilder.create()
            .url("jdbc:mysql://localhost:3306/mydb")
            .username("root")
            .password("password")
            .build();
    }
}

// AppConfig.java
@Configuration
@Import(DatabaseConfig.class) // 导入DatabaseConfig中的Bean
public class AppConfig {
    // 其他配置...
}

2. 实现ImportSelector接口的类

如果要导入的配置类过多,就可以创建一个CommonImportSelector类实现ImportSelector接口,重写里面的方法,在方法内部返回要注入的全类名。

在启动类里,直接导入该实现类的字节码文件就可以。

不过在此我们有提出一个优化的方法,来降低耦合。 

我们可以将要返回的全类名,写道一个配置文件中,然后直接在重写的方法中读取这个配置文件的内容,最后返回这个import数组。

这里我还学到了一个知识点:

组合注解:定义一个注解,加入元注解,再加上要组合的注解。

我们定义了一个EnableCommonConfig注解,封装了Import注解和两个基础注解 。并且在CommonImportSelector这个实现类中,又有@Import(CommonConfig.class)注解。

所以在该启动类中,用一个组合注解就可以代替两个注解。 来简化代码,减少重复,并且便于我们的维护和修改,只需要在组合注解定义处修改一次,所有使用该注解的地方都会自动生效。

 

自动配置分析:

在SpringBoot启动类上有一个@EnableAutoConfiguration自动配置注解,这个注解里面封装了一个@Import注解导入了实现了ImportSelectorAutoConfigurationImportSelector实现类,这个实现类返回了一个Imports数组,它读取了配置类的.imports文件。这里自动配置的核心就是这个.imports文件,里面装了类的全类名,通过这个配置文件来读取这些全类名,读取之后会把满足注册条件的Bean对象自动注入到IOC容器中。 

比如说:

所以说自动配置的原理:

在主启动类上添加了SpringBootApplication注解,这个注解组合EnableAutoConfiguration注解就是开启自动配置的意思。

EnableAutoConfiguration注解又组合了Import注解,导入了AutoConfigurationImportSelector类,实现了selectImports方法,这个方法经过层层调用,最终会读取META-INF目录下的后缀名为imports的文件,当然了,boot2.7以前的版本,读取的时spring.factories文件,这个文件中配置了很多很多自动配置类的全类名。

Springboot读取到了全类名以后,会解析注册条件,也就是@Conditional及衍生注解,把满足注册条件的Bean对象自动注入到IOC容器中。

个人感悟:

在通过查看源码之后,感觉对SpringBoot的起步依赖和自动配置的原理更加清晰了,明白了每一步的具体流程以及实现原理,收获颇丰。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值