简介
<!--特殊的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实现
- 新建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>
- 编写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 +'}';
}
}
- 编写配置类
@Configuration
public class MyAutoConfiguration {
static {
System.out.println("MyAutoConfiguration init....");
}
@Bean
public SimpleBean simpleBean(){
return new SimpleBean();
}
}
- 创建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 全栈知识体系
- 使用starter
-
- 导入自定义starter
<dependency>
<groupId>com.lagou</groupId>
<artifactId>zdy-spring-boot-starter</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
-
- 在全局配置文件中配置属性值
simplebean.id=1
simplebean.name=自定义starter
-
- 编写测试方法
//测试自定义starter
@Autowired
private SimpleBean simpleBean;
@Test
public void zdyStarterTest(){
System.out.println(simpleBean);
}
- 热插拔技术
在启动类Application上面加@EnableXXX注解,@Enablexxx注解就是一种热拔插技术,加了这个注解就可以启动对应的starter,当不需要对应的starter的时候只需要把这个注解注释掉就行
常见的starter
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>
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>
spring-boot-starter-data-redis
-
- 功能:用于集成 Redis 数据库,支持 Redis 数据库的操作。
- 依赖包:Spring Data Redis 等。
- 示例:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
spring-boot-starter-data-solr
-
- 功能:用于集成 Solr 搜索平台,支持 Solr 数据的操作。
- 依赖包:Spring Data Solr 等。
- 示例:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-solr</artifactId>
</dependency>
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>
spring-boot-starter-security
-
- 功能:用于集成 Spring Security,实现应用的安全控制。
- 依赖包:Spring Security 核心模块等。
- 示例:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
spring-boot-starter-test
-
- 功能:用于集成测试相关的库,简化单元测试和集成测试的编写。
- 依赖包:JUnit, Mockito, Spring Test 等。
- 示例:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
spring-boot-starter-thymeleaf
-
- 功能:用于集成 Thymeleaf 模板引擎,构建动态 Web 页面。
- 依赖包:Thymeleaf, Spring MVC 等。
- 示例:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
spring-boot-starter-data-mongodb
-
- 功能:用于集成 MongoDB 数据库,简化 MongoDB 的数据访问。
- 依赖包:Spring Data MongoDB 等。
- 示例:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
spring-boot-starter-websocket
-
- 功能:用于构建 WebSocket 应用程序,支持双向通信。
- 依赖包:Spring WebSocket 等。
- 示例:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
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
。