自定义一个Spring Boot Starter并实现自动装配

目录

 

前言    

开始创建

1.创建模块

2.添加依赖

3.工具类的编写   

4.打包下载

测试


前言    

       我们为什么要自定义SpringBoot starter?它有什么作用?

       实际上自定义starter主要是方便在不同工程上简洁方便的使用其中的工具类。下面我将以阿里云文件上传来讲解如何简单快速的自定义一个SpringBoot starter;

开始创建

整体结构:

1.创建模块

       首先在一个工程下创建一个maven模块,模块名为XXX-spring-boot-starter(Springboot框架中的starter都是这么命名的),Artifact Coordinates下的三条就是添加依赖所写的组名、依赖名、版本名。

      然后在这个工程下再创建一个maven模块,用于自动装配,模块名为XXX-spring-boot-autoconfigure。组名和之前的starter处于同一个组。

2.添加依赖

        创建好了之后就需要对分别在这两个模块中添加所需的依赖(也就是修改pom文件)。Starter模块只需要将autoconfigure的坐标加入其中就可以,其他创建maven生产的无用文件夹都可删除。

       接着就是在autoconfigure模块中添加对应的依赖。因为我们需要使用到springboot中的ioc容器,并且需要实现文件上传,是属于web中的内容,因此只需要导入spring-boot-start-web的依赖,相关spring-boot框架的依赖也会导入。其余依赖都是更具具体功能需求添加。 

        spring-boot-configuration-processor  : 该依赖是在配置文件(yml\yaml\properties)中会出现相关提示。

        lombok : 这是用来简化Javabean编写的一个插件,需要在idea下载对应插件然后导入依赖即可使用。

        最后导入阿里云oss需要使用到的依赖及完成依赖的添加。

<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.mystarter</groupId>
    <artifactId>aliyun-oss-spring-boot-autoconfigure</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>2.7.10</version>
        </dependency>


        <!--        配置文件中提示信息配置-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <version>2.7.10</version>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.20</version>
        </dependency>


        <!--导入阿里云的依赖-->
        <dependency>
            <groupId>com.aliyun.oss</groupId>
            <artifactId>aliyun-sdk-oss</artifactId>
            <version>3.15.1</version>
        </dependency>

        <!-- 如果是JDK9以及以上的版本,还需要加上下面的3个依赖-->
        <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>
        <dependency>
            <groupId>org.glassfish.jaxb</groupId>
            <artifactId>jaxb-runtime</artifactId>
            <version>2.3.3</version>
        </dependency>

    </dependencies>
</project>

     

3.工具类的编写   

        依赖添加完毕后就是工具类的编写,在autoconfigure模块下的src/main/java包下编写所需代码。

        首先编写我们需要使用的工具类:

package com.aliyun_oss;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.io.InputStream;
import java.util.UUID;

/**
 * 阿里云 OSS 工具类
 */
public class AliOSSUtils {

    private AliOSSProperties ali;

    //提供一个set方法,手动给这个属性赋值
    public void setAli(AliOSSProperties ali) {
        this.ali = ali;
    }

    /**
     * 实现上传图片到OSS
     */
    public String upload(MultipartFile file) throws IOException {
        // 获取上传的文件的输入流
        InputStream inputStream = file.getInputStream();

        // 避免文件覆盖
        String originalFilename = file.getOriginalFilename();
        String fileName = UUID.randomUUID().toString() + originalFilename.substring(originalFilename.lastIndexOf("."));

        //上传文件到 OSS
        OSS ossClient = new OSSClientBuilder().build(ali.getEndpoint(), ali.getKey(), ali.getSecret());
        ossClient.putObject(ali.getBucket(), fileName, inputStream);

        //文件访问路径
        String url = ali.getEndpoint().split("//")[0] + "//" + ali.getBucket() + "." +
                ali.getEndpoint().split("//")[1] + "/" + fileName;
        System.out.println("url = " + url);
        
       // 关闭ossClient
        ossClient.shutdown();
        return url;// 把上传到oss的路径返回
    }
}

        

        然后创建一个配置类(类上打上@configuration注解即可),再写一个方法将我们需要交给IOC容器管理的对象返回。(只需要在方法上打上@Bean注解,方法内部新建一个工具类对象,return返回该对象即可)

        注 : 这个方法的参数里省略了@Autowird注解,也就是说如果参数对象在IOC容器中有,那将会自动注入。

package com.aliyun_oss;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * 定义一个配置类,将AliOSSProperties和AliOSSUtils 交给IOC容器管理
    这要做一个配置类
        只有一个目标,
            1. 就是要把AliOSSProperties 交给IOC容器管理!
                @EnableConfigurationProperties(AliOSSProperties.class)
            2. 还要把AliOSSUtils 交给IOC容器管理!
                @Bean

 */
@Configuration
@EnableConfigurationProperties(AliOSSProperties.class)
public class AliOSSAutoConfigure {

    @Bean
    public AliOSSUtils utils(@Autowired AliOSSProperties properties){
        AliOSSUtils ossUtils = new AliOSSUtils();
        ossUtils.setAli(properties);
        return ossUtils;
    }
}

       

        因为阿里云文件上传需要使用到个人账号,所以这里将其做成一个javabean对象,通过配置文件注入。只需要打上@configurationProperties(prefix = “ali.oss”)注解,就会从该模块的配置文件中找到对应的属性注入。

        其中prefix的值代表着属性前缀,类中变量名就是属性名。

        而我们之后需要用在别的工程中,不可能将阿里云个人密钥定义在这个模块,所以我们需要在自动装配类上打上@EnableConfigurationProperties(AliOSSProperties.class)注解,这样我们使用该工具类时,就会把我们工程的配置文件中对应的属性注入进去。

package com.aliyun_oss;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;

/**
 * 定义一个JavaBean将配置文件的相关属性注入其中
 *
    1. 创建一个JavaBean, 定义对应的属性。
        1.1 配置文件的KEY叫什么名字,属性就写什么名字
    2. 在类上面打上注解 ConfigurationProperties, 配置了前缀 prefix.
    3. 还需要把这个类交给IOC容器管理,还需要提供get和 set方法
        @Component  和 @Data
 */
@Data
@ConfigurationProperties(prefix = "ali.oss")
public class AliOSSProperties {

    /**
     * 请配置阿里云OSS的endpoint
     */
    private String endpoint;
    private String key;
    private String secret;
    private String bucket;
}

        工具类编写完成后,只剩最后一步,那就是在Springboot中导入我们的自动装配类,也就是在包src/resource中,新建一个文件夹META-INF在这个文件夹中再创建一个Spring文件夹,文件夹中创建一个org.springframework.boot.autoconfigure.AutoConfiguration.import文件。文件中加入我们的自动配置类(写该类的全路径名,也就是在java包下的所有包名加上自动配置类名)。

4.打包下载

        到这里,所有编写工作已经完成,我们需要对其进行打包下载,将其下载到我们maven的本地仓库,这样我们就可以在其他工程中导入依赖使用了。

        注:我们没有使用到测试,下载时需要将生命周期中的测试禁用,不然会产生错误。

        点击idea右侧的Maven,打开我们的autoconfigure模块,选则生命周期(Lifecycle),选中test,然后点击上侧蓝色圆圈闪电图标禁用测试,接着双击install下载即可。

        Starter模块也是同理,点击install下载。

        注:两个模块都需要下载,只下载一个无法生效。

        到这里自定义Springboot starter已经全部完成,接下来就可以在别的工程中导入依赖使用了。

测试

        添加依赖,编写配置文件(配置文件4条数据需要从阿里云个人账户中获取)

        书写上传文件controller启动测试。

        使用postman访问测试:

 

        Idea结果显示:

         文件上传成功,这也标志着自定义的starter已经正式生效,希望以上内容对正在阅读的你有所帮助。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
低清版51M 大型门户网站是这样炼成的!(Struts 2+Spring 2+Hibernate 3).pdf(完整版) 网上有高清版350M的。可以去下 http://115.com/file/be5gwid8 请于下载后 24H 内及时删除!请抱着学习的态度下载此资料。 总共900多页!!!!!!! 第1篇 技术篇 第1章 大型门户网站架构分析 3 1.1 大型门户网站与小型企业网站的区别 3 1.2 高性能、高负载门户网站架构剖析 9 1.2.1 服务器操作系统的选择 10 1.2.2 dns服务器bind 16 1.2.3 cache服务器squid 18 1.2.4 带负载均衡的http服务器apache 19 1.2.5 支持集群功能的web服务器tomcat 21 1.2.6 开源数据库服务器之骄子mysql 23 1.2.7 功能强大的flv流媒体服务器red5 24 1.3 门户网站开发指导思想 26 1.4 ssh 2组合框架—门户网站开发之首选 28 1.4.1 mvc混血宠儿struts 2 28 1.4.2 幕后的财政部长spring 2.5 30 1.4.3 orm中间件香馍馍hibernate 3.2 31 1.5 小结 32 第2章 mvc混血宠儿struts 2 33 2.1 初识mvc新秀struts 2 33 2.1.1 mvc概述 33 .2.1.2 struts 2的mvc实现 35 2.1.3 struts 2的基本组成 36 2.1.4 struts 2的常用类介绍 38 2.1.5 struts 2的业务控制器action实现 39 2.1.6 struts 2的处理结果result 45 2.1.7 功能强大的表达式语言ognl 47 2.1.8 struts 2的运行流程分析—helloworld 48 2.1.9 struts 2的异常处理 52 2.2 struts 2配置精要 54 2.2.1 web.xml中struts 2的配置实现 54 2.2.2 struts 2属性配置文件struts.properties详解 55 2.2.3 struts 2核心配置文件struts.xml详解 57 2.3 struts 2应用开发实务 61 2.3.1 struts 2应用开发环境的搭建 62 2.3.2 struts 2应用基本开发步骤—搭建eportal应用 69 2.3.3 struts 2中集成fckeditor 80 2.3.4 struts 2中集成displaytag 83 2.4 struts 2国际化实现 85 2.4.1 web应用的中文本地化 85 2.4.2 struts 2应用的国际化 87 2.4.3 struts 2国际化语言的动态切换 89 2.5 struts 2的校验框架 90 2.5.1 在action中实现手动校验 90 2.5.2 调用校验框架进行自动校验 91 2.5.3 自定义国际化struts 2校验错误消息 92 2.5.4 struts 2的自带校验器 92 2.6 struts 2的拦截器 94 2.6.1 struts 2内建拦截器介绍 95 2.6.2 定义和使用拦截器栈 97 2.6.3 使用自定义拦截器 98 2.7 小结 100 第3章 struts 2标签库详解与ajax技术应用 103 3.1 struts 2主题与模板 103 3.2 struts 2控制标签详解 105 3.2.1 if/elseif/else标签详解 105 3.2.2 iterator标签详解 106 3.2.3 append标签详解 108 3.2.4 generator标签详解 110 3.2.5 merge标签详解 112 3.2.6 subset标签详解 113 3.2.7 sort标签详解 115 3.3 struts 2数据标签详解 116 3.3.1 action标签详解 116 3.3.2 bean标签详解 118 3.3.3 date标签详解 120 3.3.4 debug标签详解 121 3.3.5 i18n标签详解 122 3.3.6 include标签详解 123 3.3.7 param标签详解 126 3.3.8 push标签详解 127 3.3.9 set标签详解 128 3.3.10 text标签详解 129 3.3.11 url标签详解 130 3.3.12 property标签详解 132 3.4 struts 2表单标签详解 134
根据提供的引用内容,spring-boot-starter-data-redis是Spring Boot中用于自动装配Redis的starter包。它包含了自动装配所需的类和注解等。当我们在项目的pom.xml文件中引入spring-boot-starter-data-redis包时,Spring Boot自动根据配置文件中的相关配置信息来完成Redis的自动装配。 具体来说,spring-boot-starter-data-redis使用了RedisAutoConfiguration类来实现自动装配。该类通过读取配置文件中的相关配置信息,例如主机名、端口号、密码等,来创建Redis连接工厂和RedisTemplate等实例。这些实例可以在应用程序中直接使用,而无需手动配置和初始化。 下面是一个示例代码,展示了如何使用spring-boot-starter-data-redis进行自动装配: ```java import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.data.redis.core.RedisTemplate; @SpringBootApplication public class RedisApplication { private final RedisTemplate<String, String> redisTemplate; public RedisApplication(RedisTemplate<String, String> redisTemplate) { this.redisTemplate = redisTemplate; } public static void main(String[] args) { SpringApplication.run(RedisApplication.class, args); } // 在需要使用Redis的地方,可以直接注入RedisTemplate实例,并进行操作 // 例如: // redisTemplate.opsForValue().set("key", "value"); // String value = redisTemplate.opsForValue().get("key"); } ``` 通过上述代码,我们可以看到,在Spring Boot应用程序中,我们只需要在需要使用Redis的地方注入RedisTemplate实例,就可以直接使用Redis的相关操作方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值