文章目录
- 1. 自定义封装springboot-starter案例
- 1.1 自定义starter分析
- 1.2 自定义starter实现
- 1.3 自定义starter测试
- 2. SpringBoot优势
- 2.1 SpringBoot监控
- 2.1.1 Actuator
- 2.1.2 Springboot-Admin
- 2.2 小结
- 3. Web后端开发总结
1. 自定义封装springboot-starter案例
1.1 自定义starter分析
所谓starter指的就是SpringBoot当中的起步依赖。自定义 starter 起步依赖是因为在实际的项目开发当中,可能会用到很多第三方的技术,并不是所有的第三方的技术官方都提供了与SpringBoot整合的starter起步依赖,但是这些技术又非常的通用,在很多项目组当中都在使用。
业务场景:
- 前面案例当中所使用的阿里云OSS对象存储服务,现在阿里云的官方是没有提供对应的起步依赖的,这个时候使用起来就会比较繁琐,需要引入对应的依赖。还需要在配置文件当中进行配置,还需要基于官方SDK示例来改造对应的工具类,在项目当中才可以进行使用。
- 当前项目当中使用了阿里云OSS,需要进行这么多步的操作。在别的项目组当中要想使用阿里云OSS,也需要进行这么多步的操作,所以这个时候就可以自定义一些公共组件,在这些公共组件当中,就可以提前把需要配置的bean都提前配置好。将来在项目当中,要想使用这个技术,直接将组件对应的坐标直接引入进来,就已经自动配置好了,直接使用就可以了。也可以把公共组件提供给别的项目组进行使用,这样就可以大大的简化开发。
在SpringBoot项目中,一般都会将这些公共组件封装为SpringBoot当中的starter,也就是所说的起步依赖。
SpringBoot官方starter命名: spring-boot-starter-xxxx
第三组织提供的starter命名: xxxx-spring-boot-starter
Mybatis提供了配置类,并且也提供了springboot会自动读取的配置文件。当SpringBoot项目启动时,会读取到spring.factories配置文件中的配置类并加载配置类,生成相关bean对象注册到IOC容器中。
结果:可以直接在SpringBoot程序中使用Mybatis自动配置的bean对象。
在自定义一个起步依赖starter的时候,按照规范需要定义两个模块:
- starter模块(进行依赖管理[把程序开发所需要的依赖都定义在starter起步依赖中])
- autoconfigure模块(自动配置)
将来在项目当中进行相关功能开发时,只需要引入一个起步依赖就可以了,因为它会将autoconfigure自动配置的依赖给传递下来。
自定义starter的案例
需求:自定义aliyun-oss-spring-boot-starter,完成阿里云OSS操作工具类AliyunOSSUtils的自动配置。
目标:引入起步依赖引入之后,要想使用阿里云OSS,注入AliyunOSSUtils直接使用即可。
之前阿里云OSS的使用:
- 配置文件
#配置阿里云OSS参数 aliyun: oss: endpoint: https://oss-cn-shanghai.aliyuncs.com accessKeyId: *** accessKeySecret: *** bucketName: ***
- AliOSSProperties类
@Data @Component @ConfigurationProperties(prefix = "aliyun.oss") public class AliOSSProperties { //区域 private String endpoint; //身份ID private String accessKeyId ; //身份密钥 private String accessKeySecret ; //存储空间 private String bucketName; }
- AliOSSUtils工具类
@Component //当前类对象由Spring创建和管理 public class AliOSSUtils { @Autowired private AliOSSProperties aliOSSProperties; /** * 实现上传图片到OSS */ public String upload(MultipartFile multipartFile) throws IOException { // 获取上传的文件的输入流 InputStream inputStream = multipartFile.getInputStream(); // 避免文件覆盖 String originalFilename = multipartFile.getOriginalFilename(); String fileName = UUID.randomUUID().toString() + originalFilename.substring(originalFilename.lastIndexOf(".")); //上传文件到 OSS OSS ossClient = new OSSClientBuilder().build(aliOSSProperties.getEndpoint(), aliOSSProperties.getAccessKeyId(), aliOSSProperties.getAccessKeySecret()); ossClient.putObject(aliOSSProperties.getBucketName(), fileName, inputStream); //文件访问路径 String url =aliOSSProperties.getEndpoint().split("//")[0] + "//" + aliOSSProperties.getBucketName() + "." + aliOSSProperties.getEndpoint().split("//")[1] + "/" + fileName; // 关闭ossClient ossClient.shutdown(); return url;// 把上传到oss的路径返回 } }
当在项目当中要使用阿里云OSS,就可以注入AliOSSUtils工具类来进行文件上传。但这种方式其实是比较繁琐的。
所以就可以制作一个公共组件(自定义starter)。starter定义好之后,将来要使用阿里云OSS进行文件上传,只需要将起步依赖引入进来之后,就可以直接注入AliOSSUtils使用了。
具体的实现步骤:
- 第1步:创建自定义starter模块(进行依赖管理)
- 把阿里云OSS所有的依赖统一管理起来
- 第2步:创建autoconfigure模块
- 在starter中引入autoconfigure (我们使用时只需要引入starter起步依赖即可)
- 第3步:在autoconfigure中完成自动配置
- 定义一个自动配置类,在自动配置类中将所要配置的bean都提前配置好
- 定义配置文件,把自动配置类的全类名定义在配置文件中
1.2 自定义starter实现
首先我们先来创建两个Maven模块:
1). aliyun-oss-spring-boot-starter模块
创建完starter模块后,删除多余的文件,最终保留内容如下:
删除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> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.7.11</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.aliyun.oss</groupId> <artifactId>aliyun-oss-spring-boot-starter</artifactId> <version>0.0.1-SNAPSHOT</version> <properties> <java.version>11</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> </dependencies> </project>
2). aliyun-oss-spring-boot-autoconfigure模块
创建完starter模块后,删除多余的文件,最终保留内容如下(其中test文件也可以删除):
删除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> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.7.11</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.aliyun.oss</groupId> <artifactId>aliyun-oss-spring-boot-autoconfigure</artifactId> <version>0.0.1-SNAPSHOT</version> <properties> <java.version>11</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> </dependencies> </project>
需要在starter模块中来引入autoconfigure这个模块的。打开starter模块中的pom文件:
<?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> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.7.11</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.aliyun.oss</groupId> <artifactId>aliyun-oss-spring-boot-starter</artifactId> <version>0.0.1-SNAPSHOT</version> <properties> <java.version>11</java.version> </properties> <dependencies> <!--引入autoconfigure模块--> <dependency> <groupId>com.aliyun.oss</groupId> <artifactId>aliyun-oss-spring-boot-autoconfigure</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> </dependencies> </project>
前两步已经完成了,接下来是最关键的就是第三步:在autoconfigure模块当中来完成自动配置操作。
将之前案例中所使用的阿里云OSS部分的代码直接拷贝到autoconfigure模块下,进行改造。
拷贝过来后,还缺失一些相关的依赖,需要把相关依赖也拷贝过来:
<?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> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.7.11</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.aliyun.oss</groupId> <artifactId>aliyun-oss-spring-boot-autoconfigure</artifactId> <version>0.0.1-SNAPSHOT</version> <properties> <java.version>11</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <!--引入web起步依赖--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--Lombok--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> <!--阿里云OSS--> <dependency> <groupId>com.aliyun.oss</groupId> <artifactId>aliyun-sdk-oss</artifactId> <version>3.15.1</version> </dependency> <dependency> <groupId>javax.xml.bind</groupId> <artifactId>jaxb-api</artifactId> <version>2.3.1</version> </dependency> <dependency> <groupId>javax.activation</groupId> <artifactId>activation</artifactId> <version>1.1.1</version> </dependency> <!-- no more than 2.3.3--> <dependency> <groupId>org.glassfish.jaxb</groupId> <artifactId>jaxb-runtime</artifactId> <version>2.3.3</version> </dependency> </dependencies> </project>
在类上添加的@Component注解没用了。 在SpringBoot项目中,并不会去扫描com.aliyun.oss这个包,不扫描这个包那类上的注解也就失去了作用,可以从类上删除了。删除后报红色错误,暂时不理会,后面再来处理。
删除AliOSSUtils类中的@Component注解、@Autowired注解
定义一个自动配置类了,在自动配置类当中来声明AliOSSUtils的bean对象。
AliOSSAutoConfiguration类:
@Configuration//当前类为Spring配置类 @EnableConfigurationProperties(AliOSSProperties.class)//导入AliOSSProperties类,并交给SpringIOC管理 public class AliOSSAutoConfiguration { //创建AliOSSUtils对象,并交给SpringIOC容器 @Bean public AliOSSUtils aliOSSUtils(AliOSSProperties aliOSSProperties){ AliOSSUtils aliOSSUtils = new AliOSSUtils(); aliOSSUtils.setAliOSSProperties(aliOSSProperties); return aliOSSUtils; } }
AliOSSProperties类:
/*阿里云OSS相关配置*/ @Data//如果不使用idea或者没安装Lombok插件,可以手动getter/setter @ConfigurationProperties(prefix = "aliyun.oss") public class AliOSSProperties { //区域 private String endpoint; //身份ID private String accessKeyId ; //身份密钥 private String accessKeySecret ; //存储空间 private String bucketName; }
AliOSSUtils类:
@Data //如果不使用idea或者没安装Lombok插件,可以手动getter/setter public class AliOSSUtils { private AliOSSProperties aliOSSProperties; /** * 实现上传图片到OSS */ public String upload(MultipartFile multipartFile) throws IOException { // 获取上传的文件的输入流 InputStream inputStream = multipartFile.getInputStream(); // 避免文件覆盖 String originalFilename = multipartFile.getOriginalFilename(); String fileName = UUID.randomUUID().toString() + originalFilename.substring(originalFilename.lastIndexOf(".")); //上传文件到 OSS OSS ossClient = new OSSClientBuilder().build(aliOSSProperties.getEndpoint(), aliOSSProperties.getAccessKeyId(), aliOSSProperties.getAccessKeySecret()); ossClient.putObject(aliOSSProperties.getBucketName(), fileName, inputStream); //文件访问路径 String url =aliOSSProperties.getEndpoint().split("//")[0] + "//" + aliOSSProperties.getBucketName() + "." + aliOSSProperties.getEndpoint().split("//")[1] + "/" + fileName; // 关闭ossClient ossClient.shutdown(); return url;// 把上传到oss的路径返回 } }
在aliyun-oss-spring-boot-autoconfigure模块中的resources下,新建自动配置文件:
META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
com.aliyun.oss.AliOSSAutoConfiguration
1.3 自定义starter测试
创建测试工程springboot-autoconfiguration-test
测试前准备:
在test工程中引入阿里云starter依赖
- 通过依赖传递,会把autoconfigure依赖也引入了
<!--引入阿里云OSS起步依赖--> <dependency> <groupId>com.aliyun.oss</groupId> <artifactId>aliyun-oss-spring-boot-starter</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency>
在test工程中的application.yml文件中,配置阿里云OSS配置参数信息(从以前的工程中拷贝即可)
#配置阿里云OSS参数 aliyun: oss: endpoint: https://oss-cn-shanghai.aliyuncs.com accessKeyId: *** accessKeySecret: *** bucketName: ***
在test工程中的UploadController类编写代码
@RestController public class UploadController { @Autowired private AliOSSUtils aliOSSUtils; @PostMapping("/upload") public String upload(MultipartFile image) throws Exception { //上传文件到阿里云 OSS String url = aliOSSUtils.upload(image); return url; } }
编写完代码后,启动当前的SpringBoot测试工程:
- 随着SpringBoot项目启动,自动配置会把AliOSSUtils的bean对象装配到IOC容器中
用postman工具进行文件上传:
通过断点可以看到自动注入AliOSSUtils的bean对象:
如果@Autowired注解存在error,实际上没有报错,可以讲error提示改为warn提示。光标在错误上鼠标右键,如下所示:
2. SpringBoot优势
- 起步依赖
- 自动配置
- 辅助功能
- 内嵌的web服务器
- 项目监控功能
2.1 SpringBoot监控
2.1.1 Actuator
介绍
由springboot官方提供的监控功能,以json格式,展示监控信息
使用步骤
- 导入依赖坐标
- 做配置
- 开启详细的健康功能
- 开启其他监控功能
management: endpoint: health: show-details: always endpoints: web: exposure: include: '*'
2.1.2 Springboot-Admin
第三方基于actuator所封装监控功能,可以以图形化页面的形式展示监控信息。内部是一个服务端+客户端的模型
2.2 小结
3. Web后端开发总结
web后端开发现在基本上都是基于标准的三层架构进行开发的,在三层架构当中,Controller控制器层负责接收请求响应数据,Service业务层负责具体的业务逻辑处理,而Dao数据访问层也叫持久层,就是用来处理数据访问操作的,来完成数据库当中数据的增删改查操作。
在三层架构当中,前端发起请求首先会到达Controller(不进行逻辑处理),然后Controller会直接调用Service 进行逻辑处理, Service再调用Dao完成数据访问操作。
如果在执行具体的业务处理之前,需要去做一些通用的业务处理,比如:要进行统一的登录校验,要进行统一的字符编码等这些操作时,就可以借助于Javaweb当中三大组件之一的过滤器Filter或者是Spring当中提供的拦截器Interceptor来实现。
为了实现三层架构层与层之间的解耦,学习了Spring框架当中的第一大核心:IOC控制反转与DI依赖注入。
所谓控制反转,指的是将对象创建的控制权由应用程序自身交给外部容器,这个容器就是我们常说的IOC容器或Spring容器。
而DI依赖注入指的是容器为程序提供运行时所需要的资源。
除了IOC与DI还讲到了AOP面向切面编程,还有Spring中的事务管理、全局异常处理器,以及传递会话技术Cookie、Session以及新的会话跟踪解决方案JWT令牌,阿里云OSS对象存储服务,以及通过Mybatis持久层架构操作数据库等技术。
Filter过滤器、Cookie、 Session这些都是传统的JavaWeb提供的技术。 JWT令牌、阿里云OSS对象存储服务,是现在企业项目中常见的一些解决方案。 IOC控制反转、DI依赖注入、AOP面向切面编程、事务管理、全局异常处理、拦截器等,这些技术都是 Spring Framework框架当中提供的核心功能。 Mybatis就是一个持久层的框架,是用来操作数据库的。
在Spring框架的生态中,对web程序开发提供了很好的支持,如:全局异常处理器、拦截器这些都是Spring框架中web开发模块所提供的功能,而Spring框架的web开发模块,也称为:SpringMVC
SpringMVC不是一个单独的框架,它是Spring框架的一部分,是Spring框架中的web开发模块,是用来简化原始的Servlet程序开发的。
外界俗称的SSM,就是由:SpringMVC、Spring Framework、Mybatis三块组成。
基于传统的SSM框架进行整合开发项目会比较繁琐,而且效率也比较低,所以在现在的企业项目开发当中,基本上都是直接基于SpringBoot整合SSM进行项目开发的。