关于“Spring Boot 中starter的原理详析”,我会给出以下完整攻略:
一、什么是 Starter
Spring Boot 中的起步依赖 Starter 是一个 Maven 项目,是一种便于其他 Spring Boot 项目使用的“快捷方式”。Starter 可以包括许多常用的库和依赖,例如 Spring Boot Web Starter,它包括了 Spring Boot Web 依赖,以及其他必要的库和依赖,让开发者能够更快捷地开发 Spring Boot Web 应用程序。
二、什么是自动配置
Spring Boot 自动配置是一种便捷方式,使得 Spring 应用程序可以不需要多余的 XML 配置文件或代码即可快速构建。Spring Boot 通过启动自动配置功能,根据当前项目中添加的依赖项进行一系列配置,可以让开发者专注于代码编写而不需要关注配置问题。
## 三、Starter 原理详解
Spring Boot 中通过读取 META-INF/spring.factories 文件中的内容,来动态导入配置类和启动类。Starter 也是这种方式导入的,只需在该文件中定义即可。
以 Spring Boot Web Starter 依赖库为例,它包括了 Spring Boot Web 依赖,以及其他必要的库和依赖。使用该 Starter 的开发者,只需要在自己的 Maven 项目中添加如下依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
Spring Boot 在启动时,会扫描项目中的 Starter,自动导入相关的依赖项,并完成相应的配置。这个过程中会使用到 Spring Boot 自带的自动配置类,如果需要自定义配置,则可以在自己的应用程序中编写相关的配置类。
Spring Boot 中的 Starter 可以有多个,每个 Starter 都会有一个或多个自动配置类。例如,spring-boot-starter-data-jpa 依赖包括了 Spring Data JPA 和 Hibernate 的依赖,并定义了多个自动配置类,如下:
- DataSourceAutoConfiguration:自动配置 DataSource
- HibernateJpaAutoConfiguration:自动配置 Hibernate
- JdbcTemplateAutoConfiguration:自动配置 JDBC 模板
- TransactionAutoConfiguration:自动配置事务管理器
如果不需要某种自动配置项,则可以使用 Spring Boot 的 @EnableAutoConfiguration 注释来忽略它们。
四、Starter 示例说明
示例1:创建自定义 Starter
我们可以创建一个自定义的 Starter,并在自己的项目中使用它。操作步骤:
- 创建 Maven 项目,并命名为 my-starter。
- 在项目的 pom.xml 文件中添加如下依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>${spring.boot.version}</version>
</dependency>
该 Starter 将会包含 Spring Boot 的常用依赖。
3. 在 src/main/resources/META-INF 目录下创建 spring.factories 文件,并添加如下配置:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.demo.MyAutoConfiguration
定义了自动配置类 MyAutoConfiguration。
4. 在 src/main/java/com/example/demo/ 目录下创建 MyAutoConfiguration.java 文件,并添加如下代码:
@Configuration
public class MyAutoConfiguration {
@Bean
public HelloService helloService() {
return new HelloService();
}
}
定义了一个 HelloService 的 Bean。
5. 在项目根目录下使用以下命令进行打包:
mvn clean package
即可在 target 目录下找到生成的 my-starter-1.0-SNAPSHOT.jar 文件。
6. 在其他 Spring Boot 项目中,可以通过添加以下依赖来使用该 Starter:
<dependency>
<groupId>com.example.demo</groupId>
<artifactId>my-starter</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
- 在应用程序中,即可使用 MyAutoConfiguration 中定义的 Bean:
@RestController
public class HelloController {
@Autowired
HelloService helloService;
@RequestMapping("/")
public String hello() {
return helloService.sayHello();
}
}
请求根路径,输出 hello world。可以在 MyAutoConfiguration 中定义更多的 Bean,让其他 Spring Boot 项目可以快速使用。
示例2:修改 Starter 自动配置项
对于一个 Spring Boot Starter,我们可以自定义某些自动配置项,并让其他使用该 Starter 的 Spring Boot 项目使用我们的自定义配置项。操作步骤:
- 在我们的 Starter 中添加自定义的自动配置项。
比如,我们添加一个 CaffeineCacheManager 的自动配置类,用于配置缓存管理器:
@Configuration
@ConditionalOnClass(Caffeine.class)
@EnableConfigurationProperties(CaffeineCacheProperties.class)
@AutoConfigureAfter(CacheAutoConfiguration.class)
public class CaffeineCacheAutoConfiguration {
private final CaffeineCacheProperties properties;
public CaffeineCacheAutoConfiguration(CaffeineCacheProperties properties) {
this.properties = properties;
}
@Bean
@Primary
public CaffeineCacheManager caffeineCacheManager() {
CaffeineCacheManager cacheManager = new CaffeineCacheManager();
cacheManager.setCaffeine(caffeineCacheBuilder());
return cacheManager;
}
private Caffeine caffeineCacheBuilder() {
return Caffeine.newBuilder()
.initialCapacity(properties.getInitialCapacity())
.maximumSize(properties.getMaximumSize())
.expireAfterWrite(properties.getExpireAfterWrite().toNanos(), TimeUnit.NANOSECONDS);
}
}
其中,@ConditionalOnClass 注解表示只有当类路径上存在 Caffeine 类时才会进行自动配置。@EnableConfigurationProperties 注解将 CaffeineCacheProperties 类注册为一个 Bean,可以通过它来访问配置文件中的属性。@AutoConfigureAfter 注解表示该自动配置类在 CacheAutoConfiguration 之后执行。
- 在 Spring Boot 项目中,添加如下自定义配置项:
spring.cache.type=caffeine
spring.cache.caffeine.spec=initialCapacity=100,maximumSize=1000,expireAfterWrite=100ms
其中,spring.cache.type 表示使用 CaffeineCacheManager 作为缓存管理器,spring.cache.caffeine.spec 表示使用以下属性来配置 CaffeineCacheManager。
- 运行该 Spring Boot 项目,就会使用我们自定义的 CaffeineCacheManager 缓存管理器。
通过这样的方式,我们可以对 Spring Boot Starter 进行自定义配置项的添加,并让其他 Spring Boot 项目可以方便地使用。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Spring Boot 中starter的原理详析 - Python技术站