当前位置: 代码网 > it编程>编程语言>Java > SpringBoot自定义Starter的教程指南

SpringBoot自定义Starter的教程指南

2024年11月16日 Java 我要评论
什么是springboot starterspringboot starter是一个特殊的依赖描述符,它包含了一系列的库依赖,这些库依赖定义了某个功能领域(如web应用、数据库访问等)所需的所有类库。

什么是springboot starter

springboot starter是一个特殊的依赖描述符,它包含了一系列的库依赖,这些库依赖定义了某个功能领域(如web应用、数据库访问等)所需的所有类库。springboot通过spring-boot-autoconfigure模块提供的自动配置机制来自动配置这些依赖。

web应用开发

  • spring-boot-starter-web:用于创建web应用和restful服务,包含tomcat和spring mvc。
  • spring-boot-starter-webflux:用于构建响应式web应用,基于reactor和spring webflux。

数据库访问

  • spring-boot-starter-data-jpa:集成spring data jpa和hibernate,用于关系数据库的操作。
  • spring-boot-starter-data-mongodb:用于与mongodb数据库的集成。
  • spring-boot-starter-data-redis:用于与redis键值存储的集成。

库依赖

把具备某些功能的坐标打包到一起,简化依赖导入。

比如导入了spring-boot-starter-web这个starter,那么和web相关的jar包都一起自动导入到项目中了。

在这里插入图片描述

自动配置

无需手动配置xml,由starter进行自动配置并管理bean,简化开发过程。

mybatis-spring-boot-starter为例。

1)当引入了mybatis-spring-boot-starter后,其引入的相关依赖如下:

在这里插入图片描述

2)它导入了一个mybatis-spring-boot-autoconfigure 的jar包,其中有一个自动配置类mybatisautoconfiguration

在这里插入图片描述

3)打开看看,里面的关键代码

在这里插入图片描述

4)其中@configuration@bean注解,结合使用替代传统的xml配置文件,把sqlsessiontemplatesqlsessionfactory注入到spring容器。

注解@enableconfigurationproperties,其作用是让后面指定的配置属性mybatisproperties类生效。

在这里插入图片描述

把此类标记为一个配置属性类,prefix指定了前缀,其属性就是配置的可选参数。

如配置包的别名:mybatis.type-aliases-package=com.yyh.entity

5)那么这个mybatisautoconfiguration类是怎么被加载的呢?

meta-inf/spring.factories文件中,定义了mybatisautoconfiguration

在这里插入图片描述

当 springboot 应用程序启动时,会去加载该 jar 包下的meta-inf/spring.factories文件。

详情可以参考:springboot自动装配原理解析

命名规范

spring-boot-starter-xxx是springboot官方定义的jar,如 spring-bbot-starter-web。
xxx-spring-boot-starter是非官网定义的,如第三方jar包 mybatis-spring-boot-starter。

自定义 starter

一般来说,需要我们自定义 starter 的原因如下:

  • 封装功能:封装一组特定的功能,使其可以轻松地在其他项目中复用。
  • 简化配置:自动配置相关类库,减少重复的配置工作。
  • 模块化设计:保持应用的模块化,将特定功能隔离在单独的模块中。

比如,我们现在要新建一个 token-redis-spring-boot-starter

1)新建项目,配置 pom。

在这里插入图片描述

2)在包util下创建类tokenproperties,此类是一个配置属性类。

在这里插入图片描述

3)在包service下创建类tokenservice,作为一个服务。

在这里插入图片描述

4)在包config下创建类tokenautoconfiguration,实现自动配置,把服务注入到spring中。

在这里插入图片描述

5)创建 spring.factories文件

#后面的路径是tokenautoconfiguration所在的路径
org.springframework.boot.autoconfigure.enableautoconfiguration=\
  com.example.demo.config.tokenautoconfiguration

6)把项目打包发布到 maven 仓库。

7)新建一个项目,并引入token-redis-spring-boot-starter

在这里插入图片描述

8)在配置文件中配置

在这里插入图片描述

9)测试运行

在这里插入图片描述

输出:127.0.0.1,0000,8888888

条件注解

在文中出现了好几个类似于这样的注解@conditionalxxx

比如:@conditionalonproperty@conditionalonclass@conditionalonmissingbean

@conditional 是在 springframework 4.0 版本正式推出的,它可以让 bean的装载基于一些指定的条件,换句话说,被标注 @conditional 注解的 bean 要注册到 ioc 容器时,必须全部满足 @conditional 上指定的所有条件才可以。

@conditionalonproperty

@conditionalonproperty 注解用于根据配置文件中的属性值来决定是否加载某个自动配置类。

  • 属性名称:可以指定一个或多个属性名称,只有当这些属性被设置时,自动配置类才会被加载。
  • 属性值:可以进一步指定需要匹配的属性值,只有当属性的值与指定值相匹配时,自动配置类才会被加载。
@configuration
@enableconfigurationproperties({tokenproperties.class})
@conditionalonproperty(
    value = {"token.enabled"},
    havingvalue = "true"
)
public class tokenautoconfiguration {
    public tokenautoconfiguration() {
    }

    @bean
    public tokenservice tokenservice() {
        return new tokenservice();
    }
}

在这个例子中,只有当配置文件中存在token.enabled属性,tokenautoconfiguration类才会被加载。

@conditionalonclass

@conditionalonclass 注解用于检查类路径上是否存在某个类,如果存在,则加载自动配置类。

  • classes:指定一个或多个类,如果这些类在类路径上被找到,自动配置类就会被加载。
@configuration
@conditionalonclass(name = {"com.mysql.cj.jdbc.driver"})
public class mysqlautoconfiguration {
    // ...
}

在这个例子中,只有当类路径上存在com.mysql.cj.jdbc.driver类时,mysqlautoconfiguration类才会被加载,这通常意味着mysql jdbc驱动已经添加到了项目的依赖中。

@conditionalonmissingbean

@conditionalonmissingbean 注解用于检查spring容器中是否已经存在某个特定的bean,如果不存在,则创建一个新的bean。

  • value:指定需要检查的bean的类型。
  • search:指定搜索bean的范围,默认为searchstrategy.all,意味着在当前上下文和父上下文中搜索。
@configuration
public class myserviceautoconfiguration {

    @bean
    @conditionalonmissingbean(myservice.class)
    public myservice myservice() {
        return new defaultmyservice();
    }
}

在这个例子中,如果spring容器中没有myservice类型的bean,那么myservice方法将被调用以创建一个新的myservice bean。

组合使用条件注解

这些条件注解可以单独使用,也可以组合使用,以满足更复杂的条件判断需求。

例如,可以同时使用@conditionalonproperty@conditionalonclass来确保某个自动配置类只在满足特定属性值和类路径上有特定类时才被加载。

@configuration
@conditionalonproperty(name = "myapp.enabled")
@conditionalonclass(name = "com.mysql.cj.jdbc.driver")
public class mysqlautoconfiguration {
    // ...
}

在这个例子中,mysqlautoconfiguration只有在配置文件中设置了myapp.enabled属性,并且类路径上存在com.mysql.cj.jdbc.driver类时才会被加载。

以上就是springboot自定义starter的教程指南的详细内容,更多关于springboot自定义starter的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com