让我详细讲解SpringBoot定制化Starter实现方法的完整攻略。
什么是 SpringBoot Starter
SpringBoot Starter 是一个提供很多开箱即用功能的集成包(或者说是依赖包)。通常情况下,我们只需要引入这个 Starter,配置一下参数即可,相关的依赖和配置都已经自动完成了。
SpringBoot Starter 的作用
SpringBoot Starter 的作用是帮助我们快速地集成第三方库的依赖,开发者可以更加专注业务逻辑的实现而不必关心配置实现。
SpringBoot Starter 的实现方法
首先,创建一个 SpringBoot 项目,然后定义自己的 Starter,要完成以下步骤:
- 定义 Starter
定义 Starter 的类要实现 org.springframework.context.ApplicationContextInitializer
接口。它需要的主要是 做一些初始化的工作。以下为定义 Starter 的示例代码:
public class MyStarterInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {
@Override
public void initialize(ConfigurableApplicationContext applicationContext) {
// 打印日志
System.out.println("My starter is initializing...");
}
}
- 定制化 Starter
经过了第一步,我们已经可以创建一个 Starter 了。接下来就是如何让用户使用这个 Starter,并能够通过配置来更改 Starter 的默认行为。
我们需要在项目中定义一个类,来完成以下任务:
-
继承
org.springframework.boot.autoconfigure.condition.ConditionalOnProperty
接口,指定这个 Starter 的实现需要基于某个配置。 -
继承
org.springframework.boot.autoconfigure.EnableAutoConfiguration
接口,且将这个 Starter 作为参数传入构造方法中。 -
创建一个配置类,定义 Starter 相关的配置项。
示例代码如下:
@Configuration
@ConditionalOnProperty(prefix = "my.starter", name = "enabled", havingValue = "true", matchIfMissing = true) // 只有当 my.starter.enabled 配置为 true 时,才启用 Starter
@EnableConfigurationProperties(MyStarterProperties.class) // 启用配置类
public class MyStarterAutoConfiguration {
private MyStarterProperties myStarterProperties;
MyStarterAutoConfiguration(MyStarterProperties myStarterProperties) {
this.myStarterProperties = myStarterProperties;
}
@Bean
public MyStarter myStarter() {
return new MyStarter(myStarterProperties.getName()); // 返回自定义的 Starter 实例
}
}
@ConfigurationProperties(prefix = "spring.my.starter") // 指定配置项的前缀,用于与 Starter 相关的属性定义
public class MyStarterProperties {
private String name = "my starter name"; // 设置默认值
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
在以上示例代码中,我们定义了一个前缀为 my.starter
的配置项。我们使用 @ConditionalOnProperty
注解来制定这个 Starter 仅在 my.starter
配置项的 enabled
属性都为 true 时,才会生效。默认情况下,我们定义为 true。
示例1:自定义 Starter
例如我们要开发一个 Starter,这个 Starter 的功能是在系统启动时打印一段信息给用户。我们定义一个 HelloWorldStarter
,并在启动时输出 "Hello, World!"。
首先,定义 Starter :
public class HelloWorldStarter implements ApplicationContextInitializer<ConfigurableApplicationContext> {
@Override
public void initialize(ConfigurableApplicationContext applicationContext) {
System.out.println("Hello, World!");
}
}
然后,定义 Starter AutoConfiguration:
@Configuration
@EnableConfigurationProperties(HelloWorldProperties.class)
@ConditionalOnProperty(
prefix = "spring.hello",
name = "enabled",
havingValue = "true",
matchIfMissing = true
)
public class HelloWorldAutoConfiguration {
private final HelloWorldProperties props;
public HelloWorldAutoConfiguration(HelloWorldProperties props) {
this.props = props;
}
@Bean
public HelloWorldStarter helloWorldStarter() {
return new HelloWorldStarter();
}
}
接着,定义 Starter Properties:
@ConfigurationProperties(prefix = "spring.hello")
public class HelloWorldProperties {
private boolean enabled = true;
private String msg = "default message";
public boolean isEnabled() {
return enabled;
}
public void setEnabled(boolean enabled) {
this.enabled = enabled;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
}
这个 Starter 就完成了,如果在应用启动时配置了 "spring.hello.enabled=true" 的话,将会打印 "Hello, World!" 消息。
示例2:扩展 Spring Data Elasticsearch
此示例演示如何通过自定义 Starter 扩展 Spring Data Elasticsearch 的功能。下面的 Starter 可以让系统启动时创建一个 Elasticsearch 的 index。
首先,定义 Starter:
public class ElasticsearchStarter implements InitializingBean {
private final ElasticsearchOperations elasticsearchOperations;
public ElasticsearchStarter(ElasticsearchOperations elasticsearchOperations) {
this.elasticsearchOperations = elasticsearchOperations;
}
@Override
public void afterPropertiesSet() {
final String indexName = "my_index"; // 定义 index 名称
IndexOperations indexOperations = this.elasticsearchOperations.indexOps(indexName);
if (!indexOperations.exists() && indexOperations.create()) { // 当不存在 index 时创建
System.out.println("Index [" + indexName + "] is created.");
}
}
}
然后,定义 Starter AutoConfiguration:
@Configuration
@EnableConfigurationProperties(ElasticsearchProperties.class)
@ConditionalOnProperty(
prefix = "spring.data.elasticsearch",
name = {"host","port"},
matchIfMissing = false
)
public class ElasticsearchAutoConfiguration {
private final ElasticsearchProperties props;
public ElasticsearchAutoConfiguration(ElasticsearchProperties props) {
this.props = props;
}
@Bean
public ElasticsearchStarter elasticsearchStarter(ElasticsearchOperations elasticsearchOperations) {
return new ElasticsearchStarter(elasticsearchOperations);
}
}
最后,定义 Starter Properties:
@ConfigurationProperties(prefix = "spring.data.elasticsearch")
public class ElasticsearchProperties {
private String host;
private int port;
public String getHost() {
return host;
}
public void setHost(String host) {
this.host = host;
}
public int getPort() {
return port;
}
public void setPort(int port) {
this.port = port;
}
}
这个 Starter 就完成了,如果用户配置了 spring.data.elasticsearch.host
和 spring.data.elasticsearch.port
两个属性,应用启动后将会根据 Starter 的定义创建一个 index。
总结
通过以上的两个示例,我们可以看到 SpringBoot Starter 的强大兼容性和封装性:在 Starter 启动时,会检查用户定义的配置项,从而确定哪些 Starter 是需要生效的。
最后,我们通过以上的实现方法,可以定制化自己的 Starter。同时,Spring Boot Starter 对于第三方库的依赖集成提供了很好的解决方案,省略了引用的繁琐过程。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot定制化Starter实现方法 - Python技术站