starter 实现
本文章诞生于实战开发后总结记录
项目写的稀里糊涂
原理也是一知半解
互相探讨共同进步
官方starter 与 自封装starter 有什么差别
官方的starter只需要关注springboot版本而不需要关注starter版本 , 这就是正规军和杂牌军的差别呀
-
官方starter版本被spring-boot-starter-parent 统一管理
-
自己写的也可以被管理吗?
这个我也不太知道,可能实现继承某些父项目可以实现统一管理
自定义starter
最近项目需要,我需要封装一些依赖提供给其他项目引入使用
-
网上查了很多关于 "如何自己写一个spring-boot-starter" 的文章, 发现大家都是表亲呀, 你的文章和我长得很像,我的又和你的长得差不多,甚至代码都高度相似 所以才想自己写一篇文章, 给大家提供另一种思路
-
文章需要有一定基础知识并且独立思考能力强的人,如您还是新手,等两年再看
开始
-
新建项目 springboot 或 maven 都可以
-
maven项目需要实现依赖管理
<dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>${org.springframework.boot.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
-
无论那种项目都要保证starter的基本装配能力 -> 被动扫描 ->主动装配 -> 注册bean -> 生效
-
引入依赖不易过多
-
-
配置pom的重要性 (下方示例为 springboot 项目)
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <!-- 确保项目中有最基本的被动捕获能力 不加parent也可以 下方依赖中已经添加 spring-boot-starter --> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.4.4</version> <relativePath/> <!-- lookup parent from repository --> </parent> <!-- 本体坐标 --> <groupId>com.qm</groupId> <artifactId>logger-spring-boot-starter</artifactId> <version>0.2.9-TEST-SNAPSHOT</version> <packaging>jar</packaging> <!-- 本体名称 及其说明 项目地址 符合maven发布规定 --> <name>logger</name> <description>Annotation project for Spring boot</description> <url>http://106.15.249.102:3000/chenzs/custom-logger</url> <!-- 授权协议 --> <licenses> <license> <name>The Apache Software License, Version 2.0</name> <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url> </license> </licenses> <!-- scm 分支地址 项目地址 开发人员 --> <scm> <connection>http://106.15.249.102:3000/chenzs/custom-logger</connection> <url>http://106.15.249.102:3000/chenzs/custom-logger.git</url> <developerConnection>http://106.15.249.102:3000/chenzs</developerConnection> </scm> <!-- 开发人员 --> <developers> <developer> <name>ChenZS</name> <email>chenzeshi@live.com</email> <url>https://github.com/chen1749144759</url> </developer> </developers> <!-- 此处 profiles 替换本地maven中 settings中的配置 --> <!-- 为符合maven发布规定 项目采用gpg 加密校验方式 --> <!-- deploy 版本发布设置 其中各项配置参考maven插件版本介绍 --> <profiles> <profile> <id>oss</id> <activation> <activeByDefault>true</activeByDefault> </activation> <properties> <gpg.executable>gpg</gpg.executable> <gpg.passphrase>chenzeshi</gpg.passphrase> </properties> </profile> <profile> <id>deploy</id> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-source-plugin</artifactId> <version>2.2.1</version> <executions> <execution> <id>attach-sources</id> <goals> <goal>jar-no-fork</goal> </goals> </execution> </executions> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-javadoc-plugin</artifactId> <version>2.9.1</version> <executions> <execution> <id>attach-javadocs</id> <goals> <goal>jar</goal> </goals> </execution> </executions> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-gpg-plugin</artifactId> <version>1.5</version> <executions> <execution> <id>sign-artifacts</id> <phase>verify</phase> <goals> <goal>sign</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </profile> </profiles> <!-- 分配管理 当后缀名称带 SNAPSHOT 时会自动发布到 快照仓库中 --> <!-- ! 重要 指定当前项目发布后上传地址 自动读取项目坐标并上传至下配置项地址, 如需要密码则settings中对应server节点应设置账户密码 --> <distributionManagement> <repository> <id>releases</id> <name>smartd-release</name> <url>http://1.1.1.1:8081/repository/release/</url> </repository> <snapshotRepository> <id>snapshots</id> <name>smartd-snapshot</name> <url>http://1.1.1.1:8081/repository/snapshot/</url> <uniqueVersion>false</uniqueVersion> </snapshotRepository> </distributionManagement> <properties> <java.version>1.8</java.version> <java.fastjson.version>1.2.47</java.fastjson.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-autoconfigure</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.kafka</groupId> <artifactId>spring-kafka</artifactId> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>${java.fastjson.version}</version> <optional>true</optional> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.9.2</version> <scope>provided</scope> <optional>true</optional> </dependency> </dependencies> <!-- 本体并不具备运行能力 --> <build> <plugins> <!-- <plugin>--> <!-- <groupId>org.springframework.boot</groupId>--> <!-- <artifactId>spring-boot-maven-plugin</artifactId>--> <!-- <configuration>--> <!-- <excludes>--> <!-- <exclude>--> <!-- <groupId>org.projectlombok</groupId>--> <!-- <artifactId>lombok</artifactId>--> <!-- </exclude>--> <!-- </excludes>--> <!-- </configuration>--> <!-- </plugin>--> </plugins> </build> </project>
-
剩下项目里的业务 你随便上网一搜 都是
-
需要注意的是 在项目中有些配置需要 @Component 或者 @Configuration 直接把他注册成为bean就好了
例如:
@Configuration @EnableConfigurationProperties(KafkaConfigModelProperties.class) @ConditionalOnClass({KafkaConfigService.class, KafkaProducerService.class,LoginRecordAspect.class}) @ConditionalOnProperty(prefix = "logger",name = "filter",havingValue = "true") public class LoggerAutoConfiguration { @Resource private KafkaConfigModelProperties kafkaConfigModelProperties; /** * 手动将 kafkaConfigService 加入bean管理 * - 通过spring管理以声明资源的形式获取内部值 * @return bean 实体 */ @Bean @ConditionalOnMissingBean(KafkaConfigService.class) public KafkaConfigService kafkaConfigService() { KafkaConfigService kafkaConfigService = new KafkaConfigService(); if (kafkaConfigService.getServers() == null) kafkaConfigService.setServers(kafkaConfigModelProperties.getServers()); if (kafkaConfigService.getTopic() == null) kafkaConfigService.setTopic(kafkaConfigModelProperties.getTopic()); return kafkaConfigService; } @Bean @ConditionalOnMissingBean(KafkaProducerService.class) public KafkaProducerService kafkaProducerService() { return new KafkaProducerService(kafkaConfigModelProperties.getServers()); } // 这里我定义了一些注解 并通过@Aspect 重写注解业务逻辑 但是在正常的spring-boot项目中需要加入 @Configuration 标识 表示这个类的特殊性 // 但是通过源码发现 @Configuration 最终也是将这个类注册为bean 我就不麻烦他了 在下面直接给他注册成bean @Bean public LoginRecordAspect loginRecordAspect() { return new LoginRecordAspect(); } }
-