????????在Spring Boot中,創建一個自定義starter可以簡化特定功能或組件的配置過程,讓其他項目能夠輕松地重用這些功能。
這里我們以自定義一個xxl-job的starter為例,介紹下如何簡化配置。
添加依賴
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><!-- 其他需要的依賴 -->
</dependencies>
實現自動配置
????????
import org.springframework.boot.context.properties.ConfigurationProperties;/*** */
@ConfigurationProperties(prefix = XxlJobProperties.PREFIX)
public class XxlJobProperties {public static final String PREFIX = "spring.xxl.job";private boolean enabled;private String adminAddresses;private String accessToken;private String appName;private String ip;private int port;private String logPath;private int logRetentionDays = 30;//getter setter
}
接下來定義Configuration,并且在其中創建需要的bean:
import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** */
@Configuration
@EnableConfigurationProperties(XxlJobProperties.class)
public class XxlJobConfiguration {private static final Logger logger = LoggerFactory.getLogger(XxlJobConfiguration.class);@Autowiredprivate XxlJobProperties properties;@Bean@ConditionalOnMissingBean@ConditionalOnProperty(prefix = XxlJobProperties.PREFIX, value = "enabled", havingValue = "true")public XxlJobSpringExecutor xxlJobExecutor() {logger.info(">>>>>>>>>>> xxl-job config init.");XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();xxlJobSpringExecutor.setAdminAddresses(properties.getAdminAddresses());xxlJobSpringExecutor.setAppname(properties.getAppName());xxlJobSpringExecutor.setIp(properties.getIp());xxlJobSpringExecutor.setPort(properties.getPort());xxlJobSpringExecutor.setAccessToken(properties.getAccessToken());xxlJobSpringExecutor.setLogPath(properties.getLogPath());xxlJobSpringExecutor.setLogRetentionDays(properties.getLogRetentionDays());return xxlJobSpringExecutor;}
}
?這里面用@Bean 注解聲明了一個bean,并且使用@ConditionalOnMissingBean類指定這個bean的創建條件,即在確實的時候創建。
@ConditionalOnProperty(prefix = XxlJobProperties.PREFIX, value = "enabled", havingValue = "true")約定了當我們配置了spring.xxl.job.enable=true的時候才會生效。
在你的starter項目的src/main/resources下,創建META-INF/spring目錄,并且創建一個
org.springframework.boot.autoconfigure.AutoConfiguration.imports文件,內容如下:
cn.hollis.nft.turbo.job.config.XxlJobConfiguration
以上就定義好了一個starter,只需要在需要的地方引入,并且配置上相應的配置項就行了,配置項內容就是我們定義在XxlJobProperties中的。