SpringBoot的Starter自动化配置,自己编写配置maven依赖且使用及短信发送案例
目录
一、Starter机制
1. 是什么
SpringBoot中的starter是一种非常重要的机制(自动化配置),能够抛弃以前繁杂的配置,将其统一集成进starter,应用者只需要在maven中引入starter依赖,SpringBoot就能自动扫描到要加载的信息并启动相应的默认配置。starter让我们摆脱了各种依赖库的处理,需要配置各种信息的困扰。
SpringBoot中的starter也可以说是一种用于简化依赖管理和配置的工具。它们是一组预先配置好的依赖项和自动配置的模块,可以帮助开发人员快速地构建和部署SpringBoot应用程序。starter通常包含了所需的依赖项、自动配置和其他必要的设置,使开发人员可以更轻松地开始开发应用程序,而不必担心繁琐的配置和依赖项管理。SpringBoot提供了许多官方和第三方的starter,涵盖了各种不同的功能和需求,开发人员可以根据自己的需求选择合适的starter来加速应用程序的开发和部署过程。
2. 有什么用
在项目开发中使用SpringBoot Starter有以下几个好处:
1. 简化配置:SpringBoot Starter包含了一组预先配置好的依赖项和自动配置,可以帮助开发人员快速地构建和部署SpringBoot应用程序,减少了繁琐的配置工作。
2. 提高开发效率:使用SpringBoot Starter可以减少开发人员在配置和依赖项管理上的时间和精力,使开发人员可以更专注于业务逻辑的实现,从而提高开发效率。
3. 统一依赖管理:SpringBoot Starter可以帮助开发人员统一管理项目中的依赖项,避免因为版本冲突或者配置错误而导致的问题,简化了项目的依赖管理。
4. 提供标准化的配置:SpringBoot Starter提供了一种标准化的配置方式,使得不同的开发团队可以更容易地理解和维护项目的配置,降低了项目的维护成本。
总之,使用SpringBoot Starter可以帮助开发人员简化项目的配置和依赖管理,提高开发效率,降低项目的维护成本,是项目开发中的一个很好的选择。
3. 应用场景
在我们的日常开发工作中,可能会需要开发一个通用模块,以供其它工程复用。SpringBoot就为我们提供这样的功能机制,我们可以把我们的通用模块封装成一个个starter,这样其它工程复用的时候只需要在pom中引用依赖即可,由SpringBoot为我们完成自动装配。
常见应用场景
1)通用模块-短信发送模块
2)基于AOP技术实现日志切面
3)分布式雪花ID,Long转String,解决精度问题
4)微服务项目的数据库连接池配置
5)微服务项目的每个模块都要访问redis数据库,每个模块都要配置redisTemplat
在日常开发工作中,常见的应用场景包括但不限于:
-
Web应用开发:开发基于Web的应用程序,包括前端和后端开发,使用各种框架和技术栈进行开发。
-
数据库开发:设计和维护数据库,编写SQL查询和存储过程,进行数据库优化和性能调优。
-
API开发:设计和开发RESTful API或GraphQL API,用于不同系统之间的数据交换和通信。
-
移动应用开发:开发iOS和Android应用程序,使用Swift、Kotlin、React Native等技术进行开发。
-
容器化和微服务:使用Docker、Kubernetes等技术进行应用的容器化和微服务化,实现应用的高可用和可扩展性。
-
云平台开发:在云平台上进行开发,包括AWS、Azure、Google Cloud等,利用云服务进行应用部署和管理。
-
DevOps实践:实施持续集成、持续交付和持续部署,自动化测试和部署流程,提高开发和部署效率。
-
数据分析和人工智能:开发数据分析和人工智能应用,使用机器学习、深度学习等技术解决实际问题。
-
物联网应用开发:开发连接物联网设备的应用程序,处理传感器数据和控制设备。
-
安全和隐私保护:实施应用安全和隐私保护措施,包括身份认证、授权、数据加密等。
这些应用场景涵盖了软件开发的各个方面,开发人员根据具体项目需求和技术栈选择相应的开发方式和工具。
二、短信发送案例
1. 创建
新建一个Starter(启动项)的SpringBoot项目,创建如图 :
其中Starter(启动项)的SpringBoot项目的工件名命名规范
SpringBoot官方命名方式:
spring-boot-starter-{模块名}
? ?例如:spring-boot-starter-web
自定义命名方式:
{模块名}-spring-boot-starter
? ? 例如:mystarter-spring-boot-starter?
选择如图中的两项即可。
创建完成之后,就直接修改maven设置,设置为自己的本地仓库,将maven引进项目中。?
2.?配置?
将application.properties的文件换成.yml后缀的文件
所用的依赖,pom.xml?中引入
将其中的
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
依赖修改为以下依赖 (去掉其中的[ -web ])
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency>
starter项目和SpringBoot工程结构没有什么区别。必须引入的依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency>
pom.xml 所有依赖
<?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> <groupId>com.CloudJun.depend</groupId> <artifactId>sms-spring-boot-start</artifactId> <version>0.0.1-SNAPSHOT</version> <name>depend</name> <description>depend</description> <properties> <java.version>1.8</java.version> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <spring-boot.version>2.7.6</spring-boot.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <!--starter项目的依赖--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </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-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>${spring-boot.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <source>1.8</source> <target>1.8</target> <encoding>UTF-8</encoding> </configuration> </plugin> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>${spring-boot.version}</version> <configuration> <mainClass>com.cloudjun.depend.DependApplication</mainClass> <skip>true</skip> </configuration> <executions> <execution> <id>repackage</id> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </project>
其starter项目中 application.yml 配置文件的配置如下 :?
#server: # port: 8080 sms: key: 2000 secret: 2023 enable: true
3. 编写?
创建?SmsProperties 短信配置类
package com.cloudjun.depend;
import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
* @author CloudJun
* @create? 2023-12-14 17:55
*/
@Data
//@Component定义组件,交给spring进行管理
//@Component
//prefix = "sms"定义配置文件前缀,如果在yml文件中有sms前缀将进行匹配获取
@ConfigurationProperties(prefix = "sms")
public class SmsProperties {
@Value("${sms.key}")
private String key;//应用标识
@Value("${sms.secret}")
private String secret; //应用密钥
private String enable; //是否启用
}
创建?ISmsService 接口
package com.cloudjun.depend.service;
public interface ISmsService {
/**
* 发送短信
* @param phone 要发送的手机号
* @param data 要发送的内容
*/
void send(String phone, String data);
}
实现接口??SmsServiceImpl
package com.cloudjun.depend.service;
import com.cloudjun.depend.SmsProperties;
public class SmsServiceImpl implements ISmsService {
private SmsProperties smsProperties; //null
public SmsServiceImpl(SmsProperties smsProperties) {
this.smsProperties=smsProperties;
}
@Override
public void send(String phone, String data) {
String key = smsProperties.getKey();
String secret = smsProperties.getSecret();
System.out.println("接入短信系统,Key=" + key + ",Secret=" + secret);
System.out.println("短信发送,phone=" + phone + ",data=" + data);
}
}
创建一个控制类?SmsConfig? ? ,service是否加载到spring里面去,(true)加载就使用这个依赖项目,(false)不加载就不使用这个依赖项目
package com.cloudjun.depend;
import com.cloudjun.depend.service.ISmsService;
import com.cloudjun.depend.service.SmsServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
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({SmsProperties.class})//开启配置加载,加载指定的SmsProperties.class
//添加一个条件 (prefix):匹配.yml文件中sms前缀的 (name): 属性enable的 (havingValue): 值 true 为开启配置加载 false 为禁用配置加载
@ConditionalOnProperty(prefix = "sms",name = "enable",havingValue = "true")
public class SmsConfig {
//控制当前的service是否加载到spring里面去
@Autowired
private SmsProperties smsProperties;
@Bean //该@Bean注解在方法上,表示该方法在spring运行的时候自动执行该方法,如有返回值,会被放到spring的容器中
public ISmsService smsService(){
return new SmsServiceImpl(smsProperties);
}
}
在resources下新建META-INF文件夹,然后创建spring.factories文件;
在该文件中加入如下配置,该配置指定上步骤中定义的配置类为自动装配的配置:
?配置指定的配置类
org.springframework.boot.autoconfigure.EnableAutoConfiguration =com.cloudjun.depend.SmsConfig
在测试类中进行测试 DependApplicationTests
package com.cloudjun.depend;
import com.cloudjun.depend.service.ISmsService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class DependApplicationTests {
@Autowired
private SmsProperties smsProperties;
@Autowired
private ISmsService iSmsService;
@Test
void contextLoads() {
iSmsService.send("158","IKUN");
}
}
执行方法
展示的结果为 :?
4. 形成依赖
将完成好的Starter项目安装下载成依赖,操作如图 :?
在右侧点击Maven,打开生命周期,双击执行install
找到我们的Maven本地仓库的路径,在按照项目的组名进行查找,这个依赖是否已经完成。
在pom.xml文件中可以查询组名 :?
查询如图,有生成的依赖即可。
6. 其他项目的使用
我们在打开一个项目,在项目中增加这个依赖就可以使用短信发送的项目了
在新打开的项目中增加引用短信发送的项目的依赖
<dependency> <groupId>com.CloudJun.depend</groupId> <artifactId>sms-spring-boot-start</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency>
这里的引用是短信发送的项目中pom.xml文件中对应的groupId,artifactId,version
并且在新打开的项目中,找到.yml文件,增加配置
#定义应用
sms:
key: 2000 #标识
secret: 2023 #密钥
enable: true #true 启用 false 禁用
在新打开的项目中,进行测试使用
每篇一获
学习以上这些技术可以为我们带来很多收获,包括但不限于:
1. 扩展技术视野:学习不同的技术和工具可以帮助我们拓宽技术视野,了解不同领域的发展趋势和最佳实践。
2. 提升解决问题的能力:掌握多种技术和工具可以帮助我们更好地解决复杂的问题,选择合适的技术栈和解决方案。
3. 增强适应能力:学习多种技术可以增强我们的适应能力,更快速地适应新的工作环境和项目需求。
4. 提高职业竞争力:掌握多种技术和工具可以提高我们在职场上的竞争力,更容易找到理想的工作机会。
5. 促进跨团队合作:了解多种技术可以更好地与其他团队成员合作,促进跨团队的协作和沟通。
6. 增加创新思维:学习多种技术可以激发我们的创新思维,帮助我们更好地解决问题和提出新的解决方案。
总之,学习多种技术可以为我们带来丰富的收获,有助于提升个人能力和职业发展。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!