Springboot Starter机制

简介

<!--特殊的starter,它用来提供相关的Maven默认依赖。使用它之后,常用的包依赖可以省去version标签。-->
<parent>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-parent</artifactId>
  <version>3.4.1</version>
  <relativePath/> <!-- lookup parent from repository -->
</parent>

可独立于业务代码之外的功配置模块封装成一个个starter,复用的时候只需要将其在pom中引用依赖即可,再由springBoot为我们完成自动装配,就非常轻松了。SpringBoot提供的starter以spring-boot-starter-xxx 的方式命名的。官方建议自定义的starter使用xxx-spring-boot-starter 命名规则。以区分SpringBoot生态提供的starter

自定义start实现

  1. 新建maven jar 工程 命名为xxx-spring-boot-starter

导入依赖

<dependencies>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-autoconfigure</artifactId>
    <version>2.2.9.RELEASE</version>
  </dependency>
</dependencies>
  1. 编写javaBean
@EnableConfigurationProperties(SimpleBean.class)
@ConfigurationProperties(prefix = "simplebean")
public class SimpleBean {
    private int id;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }

    @Override
    public String toString() {
        return "SimpleBean{" + "id=" + id +'}';
    }
}
  1. 编写配置类
@Configuration
public class MyAutoConfiguration {
    static {
        System.out.println("MyAutoConfiguration init....");
    }
    @Bean
    public SimpleBean simpleBean(){
        return new SimpleBean();
    }
}
  1. 创建spring.factories

resources下创建/META-INF/spring.factories 注意:META-INF是自己手动创建的目录,spring.factories也是手动创建的文件,在该文件中配置自己的自动配置类。SpringBoot启动的时候会去加载我们的simpleBean到IOC容器中。这其实 是一种变形的SPI机制

备注:SPI(Service Provider Interface),是JDK内置的一种 服务提供发现机制,可以用来启用框架扩展和替换组件,主要是被框架的开发人员使用,比如java.sql.Driver接口,其他不同厂商可以针对同一接口做出不同的实现,MySQL和PostgreSQL都有不同的实现提供给用户,而Java的SPI机制可以为某个接口寻找服务实现。Java中SPI机制主要思想是将装配的控制权移到程序之外,在模块化设计中这个机制尤其重要,其核心思想就是 解耦

当服务的提供者提供了一种接口的实现之后,需要在classpath下的META-INF/services/目录里创建一个以服务接口命名的文件,这个文件里的内容就是这个接口的具体的实现类。当其他的程序需要这个服务的时候,就可以通过查找这个jar包(一般都是以jar包做依赖)的META-INF/services/中的配置文件,配置文件中有接口的具体实现类名,可以根据这个类名进行加载实例化,就可以使用该服务了。JDK中查找服务的实现的工具类是:java.util.ServiceLoader

Java常用机制 - SPI机制详解 | Java 全栈知识体系

  1. 使用starter
    1. 导入自定义starter
<dependency>
    <groupId>com.lagou</groupId>
    <artifactId>zdy-spring-boot-starter</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>
    1. 在全局配置文件中配置属性值
simplebean.id=1
simplebean.name=自定义starter
    1. 编写测试方法
//测试自定义starter
@Autowired
private SimpleBean simpleBean;
@Test
public void zdyStarterTest(){
    System.out.println(simpleBean);
}
  1. 热插拔技术

在启动类Application上面加@EnableXXX注解,@Enablexxx注解就是一种热拔插技术,加了这个注解就可以启动对应的starter,当不需要对应的starter的时候只需要把这个注解注释掉就行

常见的starter

  1. spring-boot-starter-web
    • 功能:用于构建 Web 应用,包括 RESTful 应用。内置 Tomcat 服务器,支持 Servlet 和 JSP。
    • 依赖包:Spring MVC, Jackson (用于 JSON 处理), Tomcat 等。
    • 示例
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
</dependency>
  1. spring-boot-starter-data-jpa
    • 功能:用于集成 Spring Data JPA,简化数据库访问和操作。
    • 依赖包:Spring Data JPA, Hibernate, HikariCP (连接池) 等。
    • 示例
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
  1. spring-boot-starter-data-redis
    • 功能:用于集成 Redis 数据库,支持 Redis 数据库的操作。
    • 依赖包:Spring Data Redis 等。
    • 示例
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
  1. spring-boot-starter-data-solr
    • 功能:用于集成 Solr 搜索平台,支持 Solr 数据的操作。
    • 依赖包:Spring Data Solr 等。
    • 示例
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-solr</artifactId>
</dependency>
  1. mybatis-spring-boot-starter
    • 功能:第三方的 MyBatis 集成 Starter,用于集成 MyBatis 框架。
    • 依赖包:MyBatis, MyBatis-Spring-Boot 等。
    • 示例
<dependency>
  <groupId>org.mybatis.spring.boot</groupId>
  <artifactId>mybatis-spring-boot-starter</artifactId>
  <version>2.1.4</version>
</dependency>
  1. spring-boot-starter-security
    • 功能:用于集成 Spring Security,实现应用的安全控制。
    • 依赖包:Spring Security 核心模块等。
    • 示例
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-security</artifactId>
</dependency>
  1. spring-boot-starter-test
    • 功能:用于集成测试相关的库,简化单元测试和集成测试的编写。
    • 依赖包:JUnit, Mockito, Spring Test 等。
    • 示例
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-test</artifactId>
  <scope>test</scope>
</dependency>
  1. spring-boot-starter-thymeleaf
    • 功能:用于集成 Thymeleaf 模板引擎,构建动态 Web 页面。
    • 依赖包:Thymeleaf, Spring MVC 等。
    • 示例
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
  1. spring-boot-starter-data-mongodb
    • 功能:用于集成 MongoDB 数据库,简化 MongoDB 的数据访问。
    • 依赖包:Spring Data MongoDB 等。
    • 示例
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
  1. spring-boot-starter-websocket
    • 功能:用于构建 WebSocket 应用程序,支持双向通信。
    • 依赖包:Spring WebSocket 等。
    • 示例

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
  1. spring-boot-starter-cache
    • 功能:用于集成缓存功能,支持多种缓存实现(如 EhCache, Hazelcast 等)。
    • 依赖包:Spring Cache 等。
    • 示例

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-cache</artifactId>
</dependency>

其他的:

  • spring-boot-starter-data-elasticsearch
    - 用于整合SpringData ElasticSearch
    - 处理项目中使用ElasticSearch实现搜索功能

SpringCloud服务发现框架的starter

  • ospring-cloud-starter-netflix-eureka-server
    - 用于整合SpringCloud中的Eureka服务器端ospring-cloud-starter-netflix-eureka-client
    - 用于整合SpringCloud中的Eureka客户端
    - 提示:如果你使用的“服务发现框架”不是Eureka,请更换为你使用的

SpringCloud网关的starter

  • spring-cloud-starter-netflix-zuul
    - 用于整合SpringCloud中的Zuul一实现网关路由等功能
    - 提示:如果你使用的“网关框架”不是Zuul,请更换为你使用的
  • mybatis-spring-boot-starter
    - 用于整合Mybatis
    - 由于不是SpringBoot团队开发的,所以命名风格略有不同
  • mybatis-plus-boot-starter
    - 用于整合MybatisPlus
    - 由于不是SpringBoot团队开发的,所以命名风格略有不同
  • pagehelper-spring-boot-starter
    - 用于整合PageHelper -处理Mybatis查询分页
    - 由于不是SpringBoot团队开发的,所以命名风格略有不同
  • aop starter
    • 支持面向方面的编程即AOP,包括spring-aop和AspectJ。
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

starter机制的优点

通过使用这些 Starters,可以快速集成各种常见功能和技术,使开发过程更加高效和便捷。这些 Starters 包含了常用的依赖和最佳实践配置,极大地简化了开发者的工作。

原理SPI机制

resources下创建/META-INF/spring.factories 注意:META-INF是自己手动创建的目录,spring.factories也是手动创建的文件,在该文件中配置自己的自动配置类。SpringBoot启动的时候会去加载我们的simpleBean到IOC容器中。这其实 是一种变形的SPI机制

备注:SPI(Service Provider Interface),是JDK内置的一种 服务提供发现机制,可以用来启用框架扩展和替换组件,主要是被框架的开发人员使用,比如java.sql.Driver接口,其他不同厂商可以针对同一接口做出不同的实现,MySQL和PostgreSQL都有不同的实现提供给用户,而Java的SPI机制可以为某个接口寻找服务实现。Java中SPI机制主要思想是将装配的控制权移到程序之外,在模块化设计中这个机制尤其重要,其核心思想就是 解耦

当服务的提供者提供了一种接口的实现之后,需要在classpath下的META-INF/services/目录里创建一个以服务接口命名的文件,这个文件里的内容就是这个接口的具体的实现类。当其他的程序需要这个服务的时候,就可以通过查找这个jar包(一般都是以jar包做依赖)的META-INF/services/中的配置文件,配置文件中有接口的具体实现类名,可以根据这个类名进行加载实例化,就可以使用该服务了。JDK中查找服务的实现的工具类是:java.util.ServiceLoader

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值