Spring-Boot-Starter 学习笔记(1)

这篇具有很好参考价值的文章主要介绍了Spring-Boot-Starter 学习笔记(1)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Spring-Boot-Starter

1. 准备配置类和 Bean 对象

Spring Boot 提供了两个注解:

  • @Configuration:Spring 提供的配置类注解,作用在类上,代表整个类是个 Spring 配置类,对照传统的 Spring XML 配置文件。
  • @Bean:作用于方法上,代表此方法的返回值(对象)将会被 Spring 容器所管理,从而完成 Bean 的自动注册。

这两个组合起来搭配可以完美的代替传统的 Spring XML 配置文件,并给 Spring Boot 的自动配置提供基本数据体。

2. 自动配置条件依赖

有些情况下自动配置类并不是在任何条件下都能生效的,此时我们需要制定自动配置生效的条件,可以使用 Spring Boot 提供的注解来指定生效条件。

这些注解是 spring boot 特有的,常见的条件依赖注解有:

注解 功能说明
@ConditionalOnBean 仅在当前上下文中存在某个 bean 时,才会实例化这个 Bean
@ConditionalOnClass 某个 class 位于类路径上,才会实例化这个 Bean
@ConditionalOnExpression 当表达式为 true 的时候,才会实例化这个 Bean
@ConditionalOnMissingBean 仅在当前上下文中不存在某个 bean 时,才会实例化这个 Bean
@ConditionalOnMissingClass 某个 class 在类路径上不存在的时候,才会实例化这个 Bean
@ConditionalOnNotWebApplication 不是 web 应用时才会实例化这个 Bean
@AutoConfigureAfter 在某个 Bean 完成自动配置后实例化这个 Bean
@AutoConfigureBefore 在某个 Bean 完成自动配置前实例化这个 Bean

3. Bean 的参数获取

举个例子,例如在 Spring Boot Web 项目中,我们经常会导入 MyBatis 相关的依赖,帮助我们与数据库打交道,那么在传统的 Spring 项目中,我们一般会在 Spring 容器配置 XML 文件中去使用 <bean> 标签生成相关数据源(DataSource),那么这个 DataSource 需要我们提供数据库连接参数:driver、url、username、password 这四个最基本的参数,这些数据可能放在一个叫做 db.properties 文件中,这种文件我们称为外部数据源文件,在 Spring 配置文件中声明:<context:property-placeholder location="classpath:db.properties"/>

这样就可以引入文件中的配置参数了,从而赋值给 DataSource 这个 Bean 所需要的属性参数。最后完成对象初始化。

这个过程在传统 Spring 开发,无疑是略显繁琐,如果在某些我们需要自定义类和大量参数属性从外部文件引入,这个时候 properties 文件格式也比较复杂,文件可能较多,在初始化 Bean 时,需要手写大量的属性赋值。

那么 Spring Boot 提供了注解帮助我们减小开发量,更加规范 Bean 参数的获取方式。

默认情况下我们 Bean 的参数配置在 application.yml 文件中,使用 YAML 文件格式定义,比 properties 文件更有层级感,更简约。

搭配 @EnableConfigurationProperties、@ConfigurationProperties 这两个注解可以直接实现自动配置类的 Bean 参数获取。

3.1 @EnableConfigurationProperties 注解

这个注解使用情况:自动配置类中需要从外部文件获取参数,来进行初始化。

在注解中指定一个类,这个时候可以配置类可以在这个类中获取到外部文件的参数,交给配置类中的 Bean 进行初始化。

3.2 @ConfigurationProperties 注解

注解使用情况:从外部文件获取参数信息,加载到自身类属性中,给 Spring 配置类提供外部数据来源,外部数据文件通常指的是 application.yml

在注解中指定从 application.yml 文件获取的前缀,例如 @ConfigurationProperties(prefix="spring.datasource"),会获取以这个字符串为前缀的所有参数进行自动匹配赋值。

所以可以看出两个注解的关系是:

@EnableConfigurationProperties 注解作用在配置类中,并且使得该注解指定的数据文件类中的 @ConfigurationProperties 注解生效。

4. Bean 的发现

4.1 自己项目的 Bean 扫描

在写 Spring Boot 项目时,一般在项目的代码的根目录会有一个 Spring Boot 启动类:xxxApplication.java,这个类被 @SpringBootApplication 注解修饰标记成 Spring Boot 项目的启动类。

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

此时再来看看如何完成 Bean 扫描,我们需要查看 @SpringBootApplication 注解源码:

@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 注解:

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
@Indexed
public @interface SpringBootConfiguration {
    @AliasFor(
        annotation = Configuration.class
    )
    boolean proxyBeanMethods() default true;
}

可以看到这个注解被熟悉的 @Configuration 注解修饰。@SpringBootConfiguration 应用标注在某个类上说明这个类是SpringBoot 的主配置类,SpringBoot 需要运行这个类的 main 方法来启动 SpringBoot 应用。

底层 Spring Boot 会帮我们将启动类的当前路径包以及子包的所有 Spring 组件(可能需要 @ComponentScan注解去做组件扫描)以及 Bean 扫描初始化。暂时只说浅层的流程,后续会深入 Spring 源码学习。

4.2 jar 包的 Bean 扫描

那么前面聊了自己项目的 Bean 扫描,且 Spring Boot 默认扫描启动类所在包下的主类与子类的所有组件,其中并没有包括项目依赖包中的类,那么这些类是如何被 Spring Boot 发现的呢?

这就是第二个主要注解:@EnableAutoConfiguration,开启自动配置:

这里引入其他博客的理解,觉得这几句话简单易懂:

一、@EnableAutoConfiguration 的作用
简单点说就是 Spring Boot 根据依赖中的 jar 包,自动选择实例化某些配置,配置类必须有 @Configuration 注解。

说白了,还是实例化对象,只是实例化的是依赖包中的类。

另外,我们也可以按照自动装配的规范自己定义装配的类。

接下来查看一下注解源码:

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {
    //...
}

主要看 @Import({AutoConfigurationImportSelector.class}),这个注解导入了 AutoConfigurationImportSelector.class 这个类(如果是其他版本,可能会是 @EnableAutoConfigurationImportSelector 这个是子类)。

我们找到 getCandidateConfigurations() 方法,这个方法就是用来加载依赖所需要的自动配置相关。

看到 SpringFactoriesLoader.loadFactoryNames() 的源码:

其他版本可能是只有 loadFactoryNames() 方法,但是我们主要关注 classLoader.getResources() 方法中的常量:

很明显这个方法是用来加载资源文件,而这个 Spring 工厂资源的路径就是依赖中自动配置的相关路径,根据这个路径找到需要自动配置的类,最后完成依赖的自动配置。我们导入 mybatis-spring-boot-starter 依赖看看这个 META-INF/spring.factories 里边是怎么样的:

# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.mybatis.spring.boot.autoconfigure.MybatisLanguageDriverAutoConfiguration,\
org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration

简单概括的流程:Spring Boot 会根据 jar 包的 META-INF/spring.factories 文件的配置进行自动装配,装配的流程是 SpringFactoriesLoader.loadFactoryNames() 方法顶层实现的(底层实现需深入源码),而开始外部自动装配的注解是:@SpringBootApplication 注解中的 @Import({AutoConfigurationImportSelector.class})

主导整个过程。

5. Bean 的加载

在 Spring Boot 中将一个普通类交给 Spring 容器管理,通常有以下几个方法:

  1. 使用 @Configuration 配合 @Bean 注解使用(配置类)。
  2. 使用 @Controller、@Service、@Repository、@Component 注解标注类并且使用 @ComponentScan 自动扫描(组件扫描)。
  3. 使用 @Import 方法(加载外部依赖的类)。

在上面可以看到 Spring Boot 实现自动配置使用的是 @Import 注解这种方式。AutoConfigurationImportSelector 类的 selectImports() 方法(其中调用了 getAutoConfigurationEntry() 方法主要过程)返回一组从 META-INF/spring.factories 文件中读取的 Bean 的全限定名,这样 Spring Boot 就可以加载到这些 Bean 并完成实例的初始化工作。

自动配置总结

经过前面的分析,将自动配置的关键步骤以及对应注解抽取出来:

  1. 定义需要自动装配的类信息:@Configuration、@Bean,Spring Boot 配置类。
  2. 设置自动配置条件依赖:@Conditional
  3. 将外部配置文件读取并封装成 Bean,让配置类读取参数:@EnableConfigurationProperties、@ConfigurationProperties
  4. 实现 Bean 的发现与加载:@EnableAutoConfiguration、@Import

以上的内容是基于其他相关博客内容的基础,进行自己的学习记录,接下来需要自定义一个 Spring Boot Starter 来进一步加深理解,后续可能还需要对 Spring 、Spring Boot 的源码进行学习。文章来源地址https://www.toymoban.com/news/detail-710283.html

到了这里,关于Spring-Boot-Starter 学习笔记(1)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spring Boot Starter设计实现

    Starter 是 Spring Boot 非常重要的一个硬核功能。 通过 Starter 我们可以快速的引入一个功能或模块,而无须关心模块依赖的其它组件。关于配置,Spring Boot 采用“约定大于配置”的设计理念,Starter 一般都会提供默认配置,只有当我们有特殊需求的时候,才需要在 application.yaml 里

    2024年01月18日
    浏览(48)
  • 自定义Spring Boot Starter

    Spring Boot starter 我们知道Spring Boot大大简化了项目初始搭建以及开发过程,而这些都是通过Spring Boot提供的starter来完成的。在实际项目中一些基础模块其本质就是starter,所以我们需要对Spring Boot的starter有一个全面深入的了解,这是我们的必备知识。 starter介绍 spring boot 在配置

    2024年02月10日
    浏览(83)
  • Spring Boot Starter Parent

    在这,您将学习了解 Spring Boot Starter Parent, 它是 Spring Boot 提供的父级 Pom 文件,旨在提供自动版本依赖管理,帮助我们轻松快速地进行 Spring Boot 开发。 通过 Spring Boot Starter Parent, 我们可以进行简单便捷地包依赖管理。在 Spring Boot 每一个发行版中, 均提供了该版本所兼容的依

    2024年02月08日
    浏览(38)
  • shiro-spring-boot-starter针对不同Spring Boot版本

    对于Spring Boot 2.4.10,无法找到shiro-spring-boot-starter的2.7.2版本,这是一个错误的版本号。 shiro-spring-boot-starter针对不同Spring Boot版本,推荐使用的版本如下: Spring Boot 1.x - 使用版本1.4.1 Spring Boot 2.0.x - 使用版本1.5.3 Spring Boot 2.1.x - 使用版本1.6.0 Spring Boot 2.2.x - 使用版本1.7.0 Spring Boot 2.3

    2024年02月13日
    浏览(44)
  • 【Spring Boot 初识丨三】starter

    上一篇讲了如何构建 MAVEN 项目 本篇来讲一讲 starter 依赖项 Spring Boot 初识: 【Spring Boot 初识丨一】入门实战 【Spring Boot 初识丨二】maven 【Spring Boot 初识丨三】starter 【Spring Boot 初识丨四】主应用类   启动器是一组方便的依赖关系描述符,它包含了一系列可以集成到应用里

    2024年02月09日
    浏览(40)
  • Spring Boot Starter介绍和实战

    Spring Boot Starter 是 Spring Boot 提供的一种机制,用于简化和集成应用程序的依赖管理。通过创建自定义的 Starter,可以将一组相关的依赖打包成一个简单的、可重用的模块,使应用程序的配置和依赖管理更加方便。在本文中,我们将深入探讨 Spring Boot Starter 的原理、创建过程,

    2024年01月23日
    浏览(51)
  • Spring Boot Starter 剖析与实践

    对于 Java 开发人员来说,Spring 框架几乎是必不可少的。它是一个广泛用于开发企业应用程序的开源轻量级框架。近几年,Spring Boot 在传统 Spring 框架的基础上应运而生,不仅提供了 Spring 的全部功能,还使开发人员更加便捷地使用。在使用 Spring Boot 时,我们经常会接触到各种

    2024年02月14日
    浏览(45)
  • 自定义 Spring Boot Starter 组件

    自定义 Spring Boot Starter 组件是为了封装和简化特定功能的配置和集成,让用户能够更容易地集成你提供的库或功能。Spring Boot Starter 组件通常包括自动配置、依赖管理和必要的配置。 下面是创建一个简单的 Spring Boot Starter 的基本步骤: 步骤: 创建一个新的 Maven 或 Gradle 项目

    2024年02月05日
    浏览(44)
  • 如何自己实现一个Spring Boot Starter

    现在很多开源的组件都会提供对应的 springboot-starter 包给我们去用,要做一个 starter 包并不难。参照Spring内置的实现就好了: 1、在工程里引入 starter 打包相关的依赖。 2、在我们工程内建 spring.factories 文件,编写我们配置类的全限类名。 使用AOP实现拦截方法执行和打印日志的

    2024年01月22日
    浏览(48)
  • 46、如何理解Spring Boot中的Starter

    使用spring + springmvc,如果需要引入mybatis等框架,需要到xml中定义mybatis需要的bean starter就是定义一个starter的iar包,写一个@Configuration配置类、将这些bean定义在里面,然后在starter包的META-INF/spring.factories中写入该配置类,springboot会按照约定来加载该配置类 开发人员只需要将相应

    2024年02月16日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包