【学习日记2023.5.12】之 自定义封装springboot-starter案例_SpringBoot监控_Web后端开发总结

文章目录

  • 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,也就是所说的起步依赖。
【学习日记2023.5.12】之 自定义封装springboot-starter案例_SpringBoot监控_Web后端开发总结_第1张图片

  • SpringBoot官方starter命名: spring-boot-starter-xxxx

  • 第三组织提供的starter命名: xxxx-spring-boot-starter
    【学习日记2023.5.12】之 自定义封装springboot-starter案例_SpringBoot监控_Web后端开发总结_第2张图片

Mybatis提供了配置类,并且也提供了springboot会自动读取的配置文件。当SpringBoot项目启动时,会读取到spring.factories配置文件中的配置类并加载配置类,生成相关bean对象注册到IOC容器中。

结果:可以直接在SpringBoot程序中使用Mybatis自动配置的bean对象。

在自定义一个起步依赖starter的时候,按照规范需要定义两个模块:

  1. starter模块(进行依赖管理[把程序开发所需要的依赖都定义在starter起步依赖中])
  2. 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中完成自动配置
    1. 定义一个自动配置类,在自动配置类中将所要配置的bean都提前配置好
    2. 定义配置文件,把自动配置类的全类名定义在配置文件中

1.2 自定义starter实现

首先我们先来创建两个Maven模块:

1). aliyun-oss-spring-boot-starter模块
【学习日记2023.5.12】之 自定义封装springboot-starter案例_SpringBoot监控_Web后端开发总结_第3张图片
【学习日记2023.5.12】之 自定义封装springboot-starter案例_SpringBoot监控_Web后端开发总结_第4张图片

创建完starter模块后,删除多余的文件,最终保留内容如下:
【学习日记2023.5.12】之 自定义封装springboot-starter案例_SpringBoot监控_Web后端开发总结_第5张图片

删除pom.xml文件中多余的内容后:


<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.0modelVersion>
	<parent>
		<groupId>org.springframework.bootgroupId>
		<artifactId>spring-boot-starter-parentartifactId>
		<version>2.7.11version>
		<relativePath/> 
	parent>

	<groupId>com.aliyun.ossgroupId>
	<artifactId>aliyun-oss-spring-boot-starterartifactId>
	<version>0.0.1-SNAPSHOTversion>

	<properties>
		<java.version>11java.version>
	properties>

	<dependencies>
		<dependency>
			<groupId>org.springframework.bootgroupId>
			<artifactId>spring-boot-starterartifactId>
		dependency>
	dependencies>

project>

2). aliyun-oss-spring-boot-autoconfigure模块
【学习日记2023.5.12】之 自定义封装springboot-starter案例_SpringBoot监控_Web后端开发总结_第6张图片
【学习日记2023.5.12】之 自定义封装springboot-starter案例_SpringBoot监控_Web后端开发总结_第7张图片

创建完starter模块后,删除多余的文件,最终保留内容如下(其中test文件也可以删除):
【学习日记2023.5.12】之 自定义封装springboot-starter案例_SpringBoot监控_Web后端开发总结_第8张图片

删除pom.xml文件中多余的内容后:


<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.0modelVersion>
	<parent>
		<groupId>org.springframework.bootgroupId>
		<artifactId>spring-boot-starter-parentartifactId>
		<version>2.7.11version>
		<relativePath/> 
	parent>

	<groupId>com.aliyun.ossgroupId>
	<artifactId>aliyun-oss-spring-boot-autoconfigureartifactId>
	<version>0.0.1-SNAPSHOTversion>

	<properties>
		<java.version>11java.version>
	properties>

	<dependencies>
     <dependency>
         <groupId>org.springframework.bootgroupId>
         <artifactId>spring-boot-starterartifactId>
     dependency>
	dependencies>

project>

需要在starter模块中来引入autoconfigure这个模块的。打开starter模块中的pom文件:


<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.0modelVersion>
	<parent>
		<groupId>org.springframework.bootgroupId>
		<artifactId>spring-boot-starter-parentartifactId>
		<version>2.7.11version>
		<relativePath/> 
	parent>

	<groupId>com.aliyun.ossgroupId>
	<artifactId>aliyun-oss-spring-boot-starterartifactId>
	<version>0.0.1-SNAPSHOTversion>

	<properties>
		<java.version>11java.version>
	properties>

	<dependencies>
		
		<dependency>
			<groupId>com.aliyun.ossgroupId>
			<artifactId>aliyun-oss-spring-boot-autoconfigureartifactId>
			<version>0.0.1-SNAPSHOTversion>
		dependency>

		<dependency>
			<groupId>org.springframework.bootgroupId>
			<artifactId>spring-boot-starterartifactId>
		dependency>
	dependencies>

project>

前两步已经完成了,接下来是最关键的就是第三步:在autoconfigure模块当中来完成自动配置操作。

将之前案例中所使用的阿里云OSS部分的代码直接拷贝到autoconfigure模块下,进行改造。
【学习日记2023.5.12】之 自定义封装springboot-starter案例_SpringBoot监控_Web后端开发总结_第9张图片

拷贝过来后,还缺失一些相关的依赖,需要把相关依赖也拷贝过来:


<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.0modelVersion>
	<parent>
		<groupId>org.springframework.bootgroupId>
		<artifactId>spring-boot-starter-parentartifactId>
		<version>2.7.11version>
		<relativePath/> 
	parent>

	<groupId>com.aliyun.ossgroupId>
	<artifactId>aliyun-oss-spring-boot-autoconfigureartifactId>
	<version>0.0.1-SNAPSHOTversion>

	<properties>
		<java.version>11java.version>
	properties>

	<dependencies>
     <dependency>
         <groupId>org.springframework.bootgroupId>
         <artifactId>spring-boot-starterartifactId>
     dependency>

		
		<dependency>
			<groupId>org.springframework.bootgroupId>
			<artifactId>spring-boot-starter-webartifactId>
		dependency>

		
		<dependency>
			<groupId>org.projectlombokgroupId>
			<artifactId>lombokartifactId>
		dependency>

		
		<dependency>
			<groupId>com.aliyun.ossgroupId>
			<artifactId>aliyun-sdk-ossartifactId>
			<version>3.15.1version>
		dependency>

		<dependency>
			<groupId>javax.xml.bindgroupId>
			<artifactId>jaxb-apiartifactId>
			<version>2.3.1version>
		dependency>
		<dependency>
			<groupId>javax.activationgroupId>
			<artifactId>activationartifactId>
			<version>1.1.1version>
		dependency>
		
		<dependency>
			<groupId>org.glassfish.jaxbgroupId>
			<artifactId>jaxb-runtimeartifactId>
			<version>2.3.3version>
		dependency>
	dependencies>
project>

请添加图片描述
【学习日记2023.5.12】之 自定义封装springboot-starter案例_SpringBoot监控_Web后端开发总结_第10张图片

在类上添加的@Component注解没用了。 在SpringBoot项目中,并不会去扫描com.aliyun.oss这个包,不扫描这个包那类上的注解也就失去了作用,可以从类上删除了。删除后报红色错误,暂时不理会,后面再来处理。
请添加图片描述

删除AliOSSUtils类中的@Component注解、@Autowired注解
请添加图片描述

定义一个自动配置类了,在自动配置类当中来声明AliOSSUtils的bean对象。
【学习日记2023.5.12】之 自定义封装springboot-starter案例_SpringBoot监控_Web后端开发总结_第11张图片

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
    

【学习日记2023.5.12】之 自定义封装springboot-starter案例_SpringBoot监控_Web后端开发总结_第12张图片

1.3 自定义starter测试

创建测试工程springboot-autoconfiguration-test
【学习日记2023.5.12】之 自定义封装springboot-starter案例_SpringBoot监控_Web后端开发总结_第13张图片

测试前准备:

  1. 在test工程中引入阿里云starter依赖

    • 通过依赖传递,会把autoconfigure依赖也引入了
    
    <dependency>
        <groupId>com.aliyun.ossgroupId>
        <artifactId>aliyun-oss-spring-boot-starterartifactId>
        <version>0.0.1-SNAPSHOTversion>
    dependency>
    
  2. 在test工程中的application.yml文件中,配置阿里云OSS配置参数信息(从以前的工程中拷贝即可)

    #配置阿里云OSS参数
    aliyun:
      oss:
        endpoint: https://oss-cn-shanghai.aliyuncs.com
        accessKeyId: ***
        accessKeySecret: ***
        bucketName: ***
    
  3. 在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容器中
    【学习日记2023.5.12】之 自定义封装springboot-starter案例_SpringBoot监控_Web后端开发总结_第14张图片

用postman工具进行文件上传:
【学习日记2023.5.12】之 自定义封装springboot-starter案例_SpringBoot监控_Web后端开发总结_第15张图片

通过断点可以看到自动注入AliOSSUtils的bean对象:
【学习日记2023.5.12】之 自定义封装springboot-starter案例_SpringBoot监控_Web后端开发总结_第16张图片

如果@Autowired注解存在error,实际上没有报错,可以讲error提示改为warn提示。光标在错误上鼠标右键,如下所示:
【学习日记2023.5.12】之 自定义封装springboot-starter案例_SpringBoot监控_Web后端开发总结_第17张图片
【学习日记2023.5.12】之 自定义封装springboot-starter案例_SpringBoot监控_Web后端开发总结_第18张图片

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所封装监控功能,可以以图形化页面的形式展示监控信息。内部是一个服务端+客户端的模型
【学习日记2023.5.12】之 自定义封装springboot-starter案例_SpringBoot监控_Web后端开发总结_第19张图片

2.2 小结

【学习日记2023.5.12】之 自定义封装springboot-starter案例_SpringBoot监控_Web后端开发总结_第20张图片

3. Web后端开发总结

web后端开发现在基本上都是基于标准的三层架构进行开发的,在三层架构当中,Controller控制器层负责接收请求响应数据,Service业务层负责具体的业务逻辑处理,而Dao数据访问层也叫持久层,就是用来处理数据访问操作的,来完成数据库当中数据的增删改查操作。
【学习日记2023.5.12】之 自定义封装springboot-starter案例_SpringBoot监控_Web后端开发总结_第21张图片

在三层架构当中,前端发起请求首先会到达Controller(不进行逻辑处理),然后Controller会直接调用Service 进行逻辑处理, Service再调用Dao完成数据访问操作。

如果在执行具体的业务处理之前,需要去做一些通用的业务处理,比如:要进行统一的登录校验,要进行统一的字符编码等这些操作时,就可以借助于Javaweb当中三大组件之一的过滤器Filter或者是Spring当中提供的拦截器Interceptor来实现。
【学习日记2023.5.12】之 自定义封装springboot-starter案例_SpringBoot监控_Web后端开发总结_第22张图片

为了实现三层架构层与层之间的解耦,学习了Spring框架当中的第一大核心:IOC控制反转与DI依赖注入。

所谓控制反转,指的是将对象创建的控制权由应用程序自身交给外部容器,这个容器就是我们常说的IOC容器或Spring容器。

而DI依赖注入指的是容器为程序提供运行时所需要的资源。

除了IOC与DI还讲到了AOP面向切面编程,还有Spring中的事务管理、全局异常处理器,以及传递会话技术Cookie、Session以及新的会话跟踪解决方案JWT令牌,阿里云OSS对象存储服务,以及通过Mybatis持久层架构操作数据库等技术。
【学习日记2023.5.12】之 自定义封装springboot-starter案例_SpringBoot监控_Web后端开发总结_第23张图片
【学习日记2023.5.12】之 自定义封装springboot-starter案例_SpringBoot监控_Web后端开发总结_第24张图片

Filter过滤器、Cookie、 Session这些都是传统的JavaWeb提供的技术。
JWT令牌、阿里云OSS对象存储服务,是现在企业项目中常见的一些解决方案。
IOC控制反转、DI依赖注入、AOP面向切面编程、事务管理、全局异常处理、拦截器等,这些技术都是 Spring Framework框架当中提供的核心功能。
Mybatis就是一个持久层的框架,是用来操作数据库的。

在Spring框架的生态中,对web程序开发提供了很好的支持,如:全局异常处理器、拦截器这些都是Spring框架中web开发模块所提供的功能,而Spring框架的web开发模块,也称为:SpringMVC
【学习日记2023.5.12】之 自定义封装springboot-starter案例_SpringBoot监控_Web后端开发总结_第25张图片

SpringMVC不是一个单独的框架,它是Spring框架的一部分,是Spring框架中的web开发模块,是用来简化原始的Servlet程序开发的。

外界俗称的SSM,就是由:SpringMVC、Spring Framework、Mybatis三块组成。

基于传统的SSM框架进行整合开发项目会比较繁琐,而且效率也比较低,所以在现在的企业项目开发当中,基本上都是直接基于SpringBoot整合SSM进行项目开发的。

你可能感兴趣的:(springboot入门案例,spring,boot,学习,java)